Bonne façon d'utiliser les EJB méthodes Asynchrones

J'ai deux tâches que je dois accomplir dire task1 et task2 qui font partie du même processus d'affaires. Je dois donner une réponse pour l'utilisateur final au moment de task1 termine il est donc temps de réponse doivent être réduites au minimum.

Mon approche actuelle consiste à effectuer task1 et dès que task1 est fini, invoquer task2 méthode asynchrone. task2 est compliqué et il est temps de réponse est hors de mon contrôle, car elle a une certaine dépendance externe.

@Stateless
public class SessionBean1 {

    @Inject
    SessionBean2 sessionBean2;

    public void doTask1(){
        //task one stuff
        sessionBean2.doTask2();
    }

}



@Stateless
public class SessionBean2 {

    @Asynchronous
    public void doTask2(){
        //do task2 stuff
    }

}

Dans websphere 8.0 (le conteneur d'EJB) les méthodes synchrones et asynchrones méthodes sont exécutées par les différents pools de threads.

Mon hypothèse de départ était que, même si task2 effectue mal, task1 aurait pas d'impact, mais malheureusement ce n'est pas vrai.

Si task2 effectue mal, tous les threads thread asynchrone piscine sera occupée. Ce sera la cause de task1 à attendre pour les threads asynchrones pour être libre et donc task1 a de l'impact.

Le message dans websphrere journaux de serveur :
The request buffer for thread pool WorkManager.WebSphere_EJB_Container_AsynchMethods_Internal_WorkManager has reached its capacity

Ma question est ce que serait une bonne façon de réaliser ce que je suis en train de réaliser ici.

Si vous étiez à l'aide de Java EE 7, vous pouvez utiliser le @AccessTimeout(valeur = xx) de l'annotation , mais je pense que Websphere est de Java EE 6 ?
Comme dans les liens image, le pas de méthode async les demandes sont limitées et dépendent du nombre de async threads. Je peux augmenter le pas de fils, mais même si, pour quelques minutes task2 effectue mal, mon task1 devra encore attendre. Aussi le non de threads sont limitées par la configuration du matériel.
L'idée d'utiliser une file d'attente JMS suggéré par @rjdkolb est une bien meilleure idée de la taille du pool de threads est problématique.
Actuellement, je suis en ajoutant les paramètres de la méthode pour task2 à un ConcurrentLinkedQueue et puis d'interrogation et d'appeler la méthode task2 périodiquement à l'aide d'un Timer. Jusqu'à présent, il s'est avéré être la bonne. À l'aide de JMS peut-être trop à la fois comme task1 et task2 sont sur le même serveur.
Tous Java EE implémentations ont JMS "intégrée" et, par conséquent, peuvent s'exécuter dans le "même serveur".

OriginalL'auteur ares | 2016-01-13