2008-09-15 4 views
2

Je construis un site qui utilise une simple servlet AJAX pour communiquer avec JMS (ActiveMQ) et lorsqu'un message arrive du sujet pour mettre à jour le site.Écrire une servlet qui parle à JMS (ActiveMQ) et OnMessage Mettre à jour le site

J'ai Javascript qui crée un XMLHttpRequest pour les données. La servlet traite la demande d'obtention et renvoie JSON. Cependant, je ne sais pas comment connecter ma servlet à mon serveur de messagerie ActiveMQ. Il renvoie juste des données factices dès maintenant.

Je pense que le Servelt devrait implémenter le messagelistener. Ensuite, onMessage envoie des données à la page JavaScript. Mais je ne suis pas sûr de savoir comment faire ça.

Répondre

2

Le problème d'avoir un servlet mettre en œuvre MessageListener est que les servlets sont synchrones et asynchrones sont MessageListeners. Au lieu de cela, vous devez créer un autre objet pour agir en tant que MessageListener et mettre à jour un état quelque part (éventuellement une base de données ou un MBean JMX ou un EJB Stateful Session) lorsque des messages arrivent. Le servlet peut ensuite interroger cet état pour voir s'il existe des données à signaler retour au client, et votre page Web peut périodiquement ping sur le servlet pour demander de nouvelles données.

+0

Merci jodonnell .. Je n'ai jamais écrit de JMX MBean ou EJB Stateful Session, mais après une rapide recherche google, je pense que c'est le bon chemin à regarder vers le bas. Merci pour l'aide. –

0

Vous devez probablement obtenir une connexion JMS de JNDI, comme ceci:

Properties props = new Properties(); 
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
    "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); 
props.setProperty(Context.PROVIDER_URL, 
    "tcp://hostname:61616"); 
javax.naming.Context ctx = new InitialContext(props); 
// lookup the connection factory 
javax.jms.TopicConnectionFactory factory = 
    (javax.jms.TopicConnectionFactory)ctx.lookup("ConnectionFactory"); 
// create a new TopicConnection for pub/sub messaging 
javax.jms.TopicConnection conn = factory.getTopicConnection(); 
// lookup an existing topic 
javax.jms.Topic mytopic = (javax.jms.Topic)ctx.lookup("MyTopic"); 
// create a new TopicSession for the client 
javax.jms.TopicSession session = 
    conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE); 
// create a new subscriber to receive messages 
javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic); 
+0

Ok ... c'est un bon moyen de se connecter à mon sujet, merci. J'ai déjà du code comme ceci est un autre client Java. Mais je veux que le Servelt installe le messagelistener. Ensuite, onMessage envoie des données à la page Javascript. –

1

Avez-vous essayé de lire les réponses pour this question qui lie au ActiveMQ Ajax support. Fondamentalement, ActiveMQ a un support natif pour Ajax, vous pouvez donc utiliser sa bibliothèque JavaScript pour vous abonner directement à partir d'un sujet ActiveMQ.

Voir aussi le ActiveMQ web samples qui montre comment faire des choses comme le chat en temps réel ou en temps réel des écrans de portefeuille d'actions en utilisant Ajax avec ActiveMQ

2

Comme le dit James Strachan - http://activemq.apache.org/ajax.html est un idéal hors-the-box solution pour ton problème.

Si vous souhaitez toujours créer une telle solution manuellement, vous pouvez simplement créer une connexion JMS dans votre servlet Ajax (connexion par requête). Envisagez d'utiliser le modèle Spring JMS pour cette raison (http://static.springsource.org/spring/docs/2.5.x/reference/jms.html). Ensuite, recevez simplement le message dans la méthode Servlet doGet/doPost. Considérez la valeur de délai d'attente faible pour recevoir dans ce cas. Une telle solution fonctionnera pour les files d'attente et les sujets durables.

Pour les rubriques non durables, tenez compte de l'écoute de message externe. Spring MessageListenerContainer est un excellent outil à cette fin:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer 
    <property name="connectionFactory" ref="jmsFactory"/> 
    <property name="destination" ref="myTopic" /> 
    <property name="messageListener" ref="lastTenUpdatesCache" /> 
</bean> 

Bean lastTenUpdatesCache sera un haricot singleton la mise en œuvre MesssageListener. Ce bean serait responsable de la mise en cache des dix derniers messages (en le plaçant simplement dans une liste java.util). Il sera injecté dans votre servlet Ajax donc dans votre méthode doGet/doPost, vous pouvez lui poser des questions sur les 10 derniers messages envoyés au sujet.

Questions connexes