# Kommunikationsproblem, Thread und manuel



## smolet (1. Jul 2011)

Hallo,
ich habe eine Frage aber zuerst Situationsbeschreibung:

Ich bewerkstellige Netzwerkkommunikation zwischen PC und SPS mit NIO.
Senden, Empfangen geht alles gut. 
Ich muss (leider) folgenden Ablauf einhalten: Verbinden, Senden, Empfangen, Disconnecten,* ich nenne das eine Abfrage.*
Mein Programm startet ein *Thread *der sagen wir 10 sequentielle Abfragen alle 5 Sekunden startet.
so weit läuft das gut, pro Anfrage wird etwa 300ms verbraucht.
Nun möchte ich manuel eine Abfrage durchführen (realisiert durch Buttonklick). Und hier gibts ein Problem! Bei der zeitlichen Überschneidung von manuellen Abfrage und dem Thread, passiert dass die Verbindung von einer Abfrage geschlossen wird während andere noch läuft. Dies führt zu Exception.
Anderes Problem ist wenn Anzahl der Abfragen so groß ist das die Abarbeitungszeit 5 Sekunden übersteigt.

Was ist die gute Lösung für sowas? Wie kann ich die Kommunikation gestallten das alle Abfragen dran kommen?

Danke für die Vorschläge und Tipps!


----------



## Empire Phoenix (1. Jul 2011)

Simple:
Alle anfragen werde in einer liste vermerkt und ein thread arbeitet diese sequenziel ancheinander ab.

Kompliziert:
Threadpool der x worker enthält die x anfragen gleichzietig stellen die mithilfer einer Queue zur verfügung gestellt werden.


Am rande, wenn ein Thread einena dneren beifluss so wie bei dri beschreiben deuted da auf falsche verwendug von static hin.


----------



## smolet (1. Jul 2011)

Danke!
ich habe mir das mit der Liste als Stack schon gedacht. Die manuellen Abfragen werden ganz oben in den Stack abgelegt so das sie früher dran kommen.
Gibt es schon etwas in der Art oder muss ich das selbst realisieren?

Kannst Du bitte mehr Hinweise auf Problem mit Static geben?
Ich benutze Singelton Muster für Bewerkstelligen der Kommunikation. Kann es daran liegen?


----------



## Empire Phoenix (1. Jul 2011)

Benutzt du eine connection? bzw sit das feld der connection static? dass wenn eine Abfrage die connection closed am ende eine evtl andere laufende ihre unter der nase wechgeschossen bekommt?

Je anch service ist es sinvoll dass du für jede abfrage eine connection erstellst und am ende schliest. (Btw müssen die wirklich geschlossen werden klingt komisch)


----------



## Kr0e (3. Jul 2011)

Musst du es selbst machen ? Meistens sind eigene NIO Impl. langsamer als simple Socketprogrammierung mit einem Thread pro Client. Um die Fähigkeiten von NIO auszuschöpfen, musst du fundiertes Wissen über Concurrency&Threading haben.

JBOss Netty3 (Mein Favorit) oder Apache Mina sind hier die beiden "Marktführer", es gibt noch andere aber das AFAIK die Besten/Ausgereiftesten.


----------

