Faire EJB appel avec délai d'attente
J'ai un EJB A
qui appelle EJB B
. L'INTERFACE utilisateur ne doit pas attendre plus de 30 secondes pour une réponse. Si certaines données sont manquantes, il doit retourner une réponse partielle.
Comment puis-je définir un délai d'attente (délai de 30 secondes) sur les EJB B
?
Je peux définir EJB B
comme Asynchronous
qui renvoie Future
, puis faire Future.get(30, TimeUnit.SECONDS)
.
Mais est-ce la meilleure solution?
merci
P. S.-je utiliser glassfish 3.1
OriginalL'auteur lili | 2012-01-18
Vous devez vous connecter pour publier un commentaire.
Pour configurer le délai d'attente pour un haricot qui s'applique à l'ensemble de ses méthodes, vous devez configurer l'attribut
cmt-timeout-in-seconds
dans glassfish-ejb-jar.xml.Cette valeur de délai d'expiration est utilisé par toutes les méthodes du bean qui lance une nouvelle transaction, ne s'applique pas lorsqu'ils se joignent à d'autres en cours de transaction.
Peut également consulter ce lien pour plus de détails sur le délai d'attente.
OriginalL'auteur Nayan Wadekar
Je vous recommande d'utiliser le délai d'expiration de transaction pour cela.
Je ne pense pas qu'il y est un moyen standard de configuration de sorte qu'il dépendra de l'application serveur. Je suppose que vous voulez définir plus précisément par une classe ou une méthode.
Pour WebLogic, vous pouvez le préciser dans "weblogic-ejb-jar.xml" dans la transaction "descripteur" ou utiliser l'annotation "@TransactionTimeoutSeconds".
http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703
http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354
Pour JBoss as, vous pouvez définir le délai d'expiration de transaction à l'aide de l'annotation "@TransactionTimeout" ou en "jboss.xml".
https://community.jboss.org/wiki/TransactionTimeout
Je suis sûr qu'il ya des options de configuration similaires dans chaque serveur d'application.
OriginalL'auteur Olof Åkesson
Il n'existe aucun moyen d'interrompre une cible d'EJB. La seule véritable option est la cible d'EJB à l'esprit de collaboration et de vérifier périodiquement s'il a dépassé la cible, le temps de réponse.
Même si vous utilisez
@Asynchronous
et laFuture.get
fois, vous avez tout simplement débloqué le client à partir d'attente pour le résultat; l'objectif EJB continuera à exécuter et de consommer les ressources. Cependant, avec des méthodes asynchrones, vous avez l'avantage de certains builtin coopérative d'annulation à l'aide deFuture.cancel
etSessionContext.wasCancelCalled
.Bien sûr, mais le temps de l'avant-fin sans délai dans le back-end semble imprudent. Finalement, votre fils sera consommée et votre front-end, fils va avoir à attendre de toute façon. Compte tenu de ce que vous avez dit, à l'aide de
@Asynchronous
est probablement le meilleur.OriginalL'auteur Brett Kail