Domanda

Sto costruendo un sito che utilizza un semplice servlet AJAX per parlare JMS (ActiveMQ) e quando arriva un messaggio dal topic per aggiornare il sito.

Ho Javascript che crea un XMLHttpRequest per i dati.Il servlet elabora la richiesta Get e restituisce JSON.Tuttavia non ho idea di come connettere il mio Servlet al mio ActiveMQ Message Broker.In questo momento invia solo dati fittizi.

Penso che il Servelt dovrebbe implementare il messagelistener.Quindi onMessage invia i dati alla pagina JavaScript.Ma non sono sicuro di come farlo.

È stato utile?

Soluzione

Il problema con l'implementazione di un servlet MessageListener è che i servlet sono sincroni e i MessageListener sono asincroni.Dovresti invece creare qualche altro oggetto che agisca come MessageListener e aggiorni qualche stato da qualche parte (possibilmente un database o un MBean JMX o un EJB Stateful Session) quando arrivano i messaggi.Quindi il servlet può interrogare quello stato per vedere se ci sono dati da riportare al client e la tua pagina web può periodicamente eseguire il ping del servlet per richiedere nuovi dati.

Altri suggerimenti

Come dice James Strachan: http://activemq.apache.org/ajax.html è la soluzione ideale pronta all'uso per il tuo problema.

Se desideri comunque creare manualmente tale soluzione, puoi semplicemente creare una connessione JMS nel tuo servlet Ajax (connessione per richiesta).Considera l'utilizzo del modello Spring JMS per questo motivo ( http://static.springsource.org/spring/docs/2.5.x/reference/jms.html ).Quindi ricevi semplicemente il messaggio nel metodo Servlet doGet/doPost.In questo caso, considerare un valore di timeout basso per la ricezione.Tale soluzione funzionerà per le code e gli argomenti durevoli.

Per gli argomenti non durevoli, considera il listener di messaggi esterno.Primavera MessageListenerContainer è uno strumento eccellente per questo scopo:

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

Fagiolo lastTenUpdatesCache sarà un'implementazione di bean singleton MesssageListener.Questo bean sarebbe responsabile della memorizzazione nella cache degli ultimi dieci messaggi (basta inserirli in un elenco java.util).Verrà inserito nel tuo servlet Ajax, quindi nel tuo metodo doGet/doPost puoi chiedergli informazioni sugli ultimi 10 messaggi inviati all'argomento.

Hai provato a leggere le risposte per questa domanda che si collega a Supporto ActiveMQ Ajax.Fondamentalmente ActiveMQ ha il supporto nativo per Ajax, quindi puoi utilizzare la sua libreria JavaScript per iscriverti direttamente da un argomento ActiveMQ.

Vedi anche il Esempi Web ActiveMQ che mostrano come eseguire operazioni come la chat in tempo reale o le schermate del portafoglio azionario in tempo reale utilizzando Ajax con ActiveMQ

Probabilmente avrai bisogno di ottenere una connessione JMS da JNDI, in questo modo:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top