2009-10-28 6 views
0

J'ai un bean géré/service fonctionnant à l'intérieur de JBOSS. J'ai ensuite un travail à quartz qui va parfois se réveiller et appeler une méthode de la fève gérée. Cette méthode est parfois longue et longue, et comme je ne veux pas que le travail à quartz prenne fin, j'ai implémenté un thread dans le bean géré pour effectuer le traitement. Lorsque le thread est terminé, j'ai besoin de mettre à jour une table de base de données avec les résultats. Ma question principale est que je peux utiliser un EntityManager dans le service sans problème mais je ne peux pas l'utiliser depuis le thread, Je reçois une exception NullPointerException. Quel serait le meilleur moyen d'y remédier?JBoss Service/Bean géré Question

Merci,

Scott

+0

Obtenez-vous le EntityManager dans l'EJB en tant que @PersistenceContext? – fvu

+0

Oui, oui. Après un tas de recherches, j'ai trouvé que l'EntityManager n'est pas threadsafe et ne peut donc pas être utilisé/accédé dans les threads enfants. –

Répondre

0

Comme la création de fils dans appservers est découragée, je serais modifier la configuration un peu. Je déplacerais le noyau du traitement vers un bean géré par message, et le travail Quartz enverrait simplement un message à la file d'attente sur laquelle le MDB écoute. Le MDB à son tour peut appeler votre EJB, et comme cela tout reste dans ce qui est permis par la norme.

+0

C'était la façon originale que j'avais de le configurer, mais le long processus retarderait le bean MDB et/ou l'EJB. Ce que j'ai découvert était un moyen d'annoter l'EJB pour qu'il ne soit pas temporisé. –

0

Conformément à la documentation et aux spécifications, Entity Manager n'est pas compatible avec les unités d'exécution et ne peut pas être utilisé sur différents threads enfants comme je l'avais imaginé à l'origine. J'ai fini par revenir à la conception originale similaire à celle fournie par fvu, mais j'ai trouvé quelques annotations qui me permettraient de modifier la période de timeout et permettre au processus de longue durée de fonctionner correctement. Voici l'annotation que j'ai utilisée:

@PoolClass(value=org.jboss.ejb3.StrictMaxPool.class, timeout=360000000L) 
+0

Ce délai est de 3600 secondes * 1000 millisecondes * 100 HEURES ??? C'est un haricot à long terme que vous avez ;-) – fvu