Threads im JBoss

Kris

Bekanntes Mitglied
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.
 
T

tuxedo

Gast
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
 
T

tuxedo

Gast
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.
 

fastjack

Top Contributor
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.
 

FArt

Top Contributor
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.
 
Zuletzt bearbeitet:

fastjack

Top Contributor
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"
 
Zuletzt bearbeitet:

FArt

Top Contributor
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.
 

Kris

Bekanntes Mitglied
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?
 
T

tuxedo

Gast
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

Bekanntes Mitglied
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?
 
T

tuxedo

Gast
Guckst du hier:

5.1.2.1. Lifecycle Methods

Your @Management interface may contain methods with the following signatures

void create() throws Exception;
void start() throws Exception;
void stop();
void destroy();


Each of these methods corresponds to when the MBean enters a particular state, so you can handle that. You do not need to include any of these methods, and you can pick and choose which ones you want to use. A description of the MBean states these methods correspond to:

create() - called by the server when the service is created and all the services it depends upon have been created too. At this point the service (and all the services it depends on) is installed in the JMX server, but is not yet fully functional.
start() - called by the server when the service is started and all the services it depends upon have been started too. At this point the service (and all the services it depends on) is fully functional..
stop() - called by the server when the service is stopped. At this point the service (and all the services that depend on it) is no longer fully operational.
destroy() - called by the server when the service is destroyed and removed from the MBean server. At this point the service (and all the services that depend on it) are destroyed.

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

FArt

Top Contributor
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 ...
 

FArt

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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")
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Eigene Threads im Applictionserver und JNDI Application Tier 20
Y Spring JBoss 7 - wie JNDI Datasource einbinden Application Tier 8
S JBoss - .properties vom Kunden änderbar machen Application Tier 10
M org.jboss.weld.exceptions.UnproxyableResolutionException wegen Parametern im Superclass-Kontruktor Application Tier 10
G jBoss automatische Synchronisation? Application Tier 4
JimPanse JBoss 7 + JPA + Kundera + Cassandra Application Tier 2
B Glassfish vs. Tomcat/JBoss Application Tier 4
S Umstellung von JBoss 7 Full auf Web Profile Application Tier 4
V [JBoss 5] Datenbankverbindung zur Laufzeit aufbauen? Application Tier 8
V [JBoss5] JBoss stoppen bzw. am starten hindern? Application Tier 9
V [JBoss 5] Startroutine implementieren? Application Tier 7
S JBoss, EAR, EJB und ClassNotFound Application Tier 28
V JBoss 5 DeploymentSorter? Application Tier 3
V JBoss 5 mag @Service nicht Application Tier 2
S JBoss EJB RMI Application Tier 5
A Jboss Ear mittels maven Application Tier 3
D Lazy Hibernate bei 3-Tier Applikation (JBoss + EJB3 + FatClient) Application Tier 6
ruutaiokwu stateful ejb unter jboss als webservice zur verfügung stellen... Application Tier 2
T Simples EJB-Beispiel für JBoss mit Eclipse Application Tier 3
M Spring - Leichtgewichtiger als JBoss? Application Tier 4
M JBoss Seam - Spring Application Tier 11

Ähnliche Java Themen

Neue Themen


Oben