2010-07-23 7 views
4

Je suis en train de lire depuis ActiveMQ avec un bean géré par message (EJB3) dans le backend. Le problème auquel je suis confronté est que je dois mettre à jour une table dans ma page JSF dès que je reçois le message d'ActiveMQ dans le bean piloté par message.Bean messagedriven d'ActiveMQ vers JSF

Toutes les suggestions de technologies que je peux essayer seraient géniales. J'utilise actuellement des primefaces et des glassfish.

Thx

Répondre

0

Vous ne pouvez pas vraiment appeler une méthode de bean géré (JSF) directement à partir d'un bean géré par message, car les étendues et les heures au cours desquelles elles sont actives sont complètement différentes.

Le bean géré est essentiellement actif pendant une requête HTTP. Ensuite, son état peut toujours être stocké quelque part (c'est-à-dire si la portée de l'application, de la session ou de la conversation est utilisée), mais il ne fait rien activement.

Ce que vous pouvez faire est d'utiliser une technologie comme Comet, où vous suspendez la requête du bean backing. Vous pouvez ensuite laisser le bean backing attendre quelque chose avant de reprendre la requête. Vous pouvez laisser le bean géré écouter la même file d'attente JMS que celle écoutée par le message (en supposant que JMS soit utilisé), ou laisser le bean géré écouter le bus d'événements CDI. Dès que le MDB reçoit quelque chose d'ActiveMQ, le MDB peut le mettre sur le bus d'événements CDI et le bean backing le recevra. En effet, le MDB fonctionne alors comme un composant de pont.

Il y avait quelques présentations sur Devoxx '10 qui ont démontré quelque chose de très similaire à ce que vous demandez.

Je pense entre autres cette présentation est allé dans ce genre de choses: http://www.adam-bien.com/roller/abien/entry/pets_and_aliens_running_on

2

Vous pouvez utiliser poll primefaces pour vérifier périodiquement s'il y a des nouveaux messages

<h:form> 
    <p:dataTable id="msgTable" var="msg" value="#{tableBean.messages} "> 
    ... 
    </p:dataTable> 

    <p:poll interval="3" 
      actionListener="#{mdBean.messagesAvailable}" update="msgTable" /> 
</h:form> 

Voir http://97.107.138.40:8080/prime-showcase/ui/ajaxPollHome.jsf pour plus de détails.

+0

Merci pour la réponse. J'ai fini par utiliser le sondage "primefaces" et alerter les autres clients via la méthode p: push afin d'alerter tout le monde en même temps. Ce n'est cependant pas idéal. L'idéal devrait être que la méthode onmessage() de la MDB devrait faire quelque chose pour notifier tous les clients que la page devrait mettre à jour, mais je ne connais pas de méthode pour appeler une méthode backend managée ou similaire à partir du bean piloté par message. J'ai implémenté les fonctions ActiveMQ et MDB en tant que mécanisme d'alerte pour ne pas interroger la base de données toutes les secondes depuis chaque client. Message ActiveMQ au client ... le client vérifie la base de données. –

Questions connexes