# Threads im JBoss



## Kris (30. Mrz 2011)

Hallo zusammen

Ich bin mit meinem Latein am Ende. 
Ich möchte im JBoss einen Service haben, der je nachdem wieviele Hosts angegeben werden, Stateful Beans erzeugt, die einen socket aufbauen und diesen dann permanent auslesen. 
Bis auf das parallele Auslesen, kriege ich alles hin. Ich kann die Methode zum auslesen sogar asynchron aufrufen. In dieser Methode befindet sich eine Endlosschleife zum auslesen. Leider wird nur eine Methode ausgeführt. Es werden alle gestartet, aber nur eine liefert permanent Ergebnisse.

Was für eine Lösung gibt es, Sockets parallel über den JBoss auszulesen?
Bin für jeden Vorschlag dankbar.


----------



## tuxedo (30. Mrz 2011)

Bin (noch) nicht die JBoss Leuchte, aber was ist mit MBeans?! Da kannst du deinen "Auslese-Service" mit aufbauen und die ausgelesenen Daten ggf. weiterreichen?

- Alex


----------



## brauner1990 (30. Mrz 2011)

MB oder MBeans sind ManagedBeans


----------



## tuxedo (30. Mrz 2011)

Jepp. Ist mir bewusst. Und? Kann man beim Start von JBoss starten lassen, und während der Laufzeit parametrisieren, stoppen/starten/... und eben beliebig Threads ins leben rufen.


----------



## brauner1990 (30. Mrz 2011)

sry...falsch gelesen..


----------



## fastjack (30. Mrz 2011)

Die einzige Möglichkeit, die ich vor einiger Zeit genutzt habe ist diese hier:

http://www.java-forum.org/blogs/fastjack/126-jboss-scheduleable-jobs-blockieren-gegenseitig.html

Konkret ging es darum, daß JBoss-Services immer nur nacheinander abgelaufen sind, ich wollte aber eine gewisse Parallelisierung haben.

edit: Es wird empfohlen/verboten keine eigenen Threads im Applikationsserver zu nutzen, es gibt aber momentan noch keine im JBoss eingebauten Möglichkeiten (zumindest bis jboss 5), einen JBoss-Service wirklich parallel laufen zu lassen.


----------



## Kris (30. Mrz 2011)

Worin liegt genau der Unterschied zwischen Session und Managed Beans?


----------



## FArt (30. Mrz 2011)

Enterprise JavaBeans ? Wikipedia
Java Management Extensions ? Wikipedia

Zur Klärung: auch im JBoss laufen Services parallel ab. Alles andere wäre ja lustig. In einem EJB darf man keine Threads benutzen, das widerspricht der Spec. Das gleiche gilt für Serversockets und Filezugriffe.

Ein EJB ist nur während des laufenden Calls aktiv und kann keine "Hintergrundarbeiten" verrichten. Ein EJB kann nach EJB 3.1 asynchron angesprochen werden. Da wird aber im Prinzip lediglich der Call asynchron aufgetrennt, sonst arbeitet das Bean auch nur diesen einen Call ab. Auch wenn es möglich ist oder erscheint sollte man ein EJB nicht "mißbrauchen" und gegen die Spec implementieren.


----------



## fastjack (30. Mrz 2011)

> Zur Klärung: auch im JBoss laufen Services parallel ab



kann ich für StartUpServices nicht bestätigen. Dafür gibt es im jboss-Forum auch sehr viele workarounds. Wenn Du zwei StartAtStartup-Services hast, dann laufen die eben nicht parallel ab, sondern der zweite wartet brav, bis der erste fertig ist.

edit: einfach mal googlen "schedulable job blocks other schedulable jobs"


----------



## FArt (30. Mrz 2011)

Ah... service != scheduled job

Ist wohl ein Implementierungsdetail (Fehler?) des JBoss... dafür würde ich mit EJB3 aber den Timer Service bemühen.

Dem TS würde ich evtl. folgendes vorschlagen: Chapter 28. Service POJOs (JBoss extension of EJB3)
Das ist eine einfache Lösung für ein MBean, wenn nötig kann man leicht ein EJB als Schnittstelle exposen und das Ding hat einen Lebenszyklus. Da drin darf er auch mit Socket, Files und Threads hantieren, wie er lustig ist.


----------



## fastjack (30. Mrz 2011)

Ist ein Bug im jBoss, den sie bis heute nicht behoben haben.


----------



## Kris (31. Mrz 2011)

Soweit ich das jetzt verstanden habe, ist ein Service ein Singleton. Was für meinen Anwendungsfall nicht nützlich ist. Wird ein MBean nun parallel ausgeführt oder nicht?


----------



## tuxedo (31. Mrz 2011)

Vereinfacht gesprochen:

Ein MBean ist eine Instanz einer Klasse die von JBoss beim Systemstart ins Leben gerufen wird. Diese Klasse hat typischerweise diese 4 Methoden:

* create
* start
* stop
* destroy

--> Stichwort: Lifecycle. 
Es dürfen auch noch meht Methoden sein. Aber dies sind afaik die 4 Lifecycle-Methoden die JBoss verwendet.

Jboss erzeugt also beim hochfahren die Instanz der Klasse und ruft dann "create" gefolgt von "start" auf. 

In diesen Methoden kannst du Threads starten, mit Sockets und "weiß der Geier" herumhantieren wie es dir beliebt. 
Du solltest nur schauen, dass die Methoden "stop" und "destroy" bis zum Ende alles entsprechend wieder aufräumen.

Zu deiner Frage: "Wird ein MBean nun parallel ausgeführt oder nicht?"

Afaik gibt es von jeder MBean-Klasse genau EINE Instanz. Also kannst du deine Frage einfach streichen, da sie hier nicht zutrifft.

Was du aber "parallel" machen kannst ist, mehrere Threads aus dieser MBean-Instanz heraus starten und damit "parallel" Dinge verarbeiten.


----------



## Kris (31. Mrz 2011)

Die ManagedBean wird ja über ein Interface implementiert. 
Es gibt aber auch eine Möglichkeit eine Anotation zu benutzen. Habe ich jedenfalls irgendwo gelesen. Finde aber die Seite nicht mehr.

Hat jemand evtl. einen Link?


----------



## Kris (31. Mrz 2011)

Gefunden

JBoss EJB 3.0

Aber wie kann man den Service beim Hochfahren des JBoss starten?


----------



## tuxedo (31. Mrz 2011)

Guckst du hier:



> 5.1.2.1. Lifecycle Methods
> 
> Your @Management interface may contain methods with the following signatures
> 
> ...



Erledigt also JBoss für dich. Stichwort: JBoss Lifecycle Management


----------



## FArt (31. Mrz 2011)

Kris hat gesagt.:


> Die ManagedBean wird ja über ein Interface implementiert.
> Es gibt aber auch eine Möglichkeit eine Anotation zu benutzen. Habe ich jedenfalls irgendwo gelesen. Finde aber die Seite nicht mehr.
> 
> Hat jemand evtl. einen Link?



Muss man nicht über ein Interface implementieren, es gibt noch XMBeans und eben die erwähnten Service POJOs. ... und in meinem letzten Post, das blaue, unterstrichene, das ist ein Link ...


----------



## Kris (31. Mrz 2011)

Kann es sein, dass die EJB Anotation über einer Klassenvariable in einem Service nicht funktioniert?


----------



## FArt (31. Mrz 2011)

Kris hat gesagt.:


> Kann es sein, dass die EJB Anotation über einer Klassenvariable in einem Service nicht funktioniert?



Mit Verlaub, kann es sein, dass du keine Ahnung hast was du da treibst und es mit dem Doku lesen auch nicht so genau nimmst?

Was für eine "EJB Annotation"? Aus dem Package javax.ejb? Und was wolltest du damit erreichen?

Bitte lies doch ein wenig Doku und probiere dich erst mal an Tutorials und Beispielen. Bei dir felht es u.A. an Basiswissen bzgl. Containerarchitekturen, konkret einem AS wie JBoss, JMX und einem EJB Container. Danach adaptiere dieses neue Wissen auf dein Problem. Dann kennst du auch im Fehlerfall die korrekte Nomenklatur und kannst konkret um Hilfe bitten. Das hier ist doch nur ein einziges Rumgeeier mit schwammigen Begriffen... jm2c


----------



## Kris (31. Mrz 2011)

Die Services sind mir neu bzw. MBeans.

In den Tutorials und in der Doku steht auch nirgendwo ein Beispiel oder etwas Beschrieben, ob man eine Variable per Dependency Injection (@EJB) instanzieren kann. 

Ich habe mein Singleton Bean in einen Service umgeschrieben und seit dem hat die Dependency Injection nicht funktioniert.


----------



## FArt (31. Mrz 2011)

Kris hat gesagt.:


> Ich habe mein Singleton Bean in einen Service umgeschrieben und seit dem hat die Dependency Injection nicht funktioniert.



Das ist ja mal eine Aussage 

Die DI von EJBs funktioniert so weit ich weiß nur innerhalb der EE Welt, also bei anderen EJBs. So weit ich weiß, funktioniert es auch bei Webanwendungen (WARs, also Servlets), aber nur nur ab EJB 3.1 bzw. abhängig von der Version des AS (<- Halbwissen).

Ein MBean hab mit Enterprise-Java nichts zu tun. Es gibt aber oft (und gerade bei JBoss) spezielle Implementierungen die ähnliches erfüllen, z.B. die Annotation @Depends (siehe meinen obigen Link).

Google bzw. die JBoss Community hilft bei solchen Problemen auch gerne weiter: https://issues.jboss.org/browse/EJBTHREE-2228

[EDIT]
Das habe ich bei einem Service POJO schon mal erfolgreich eingesetzt:

  @EJB(mappedName = "my/jndi/Name")


----------

