Pergunta

Eu estou construindo um site que usa um simples de AJAX e Servlet para falar JMS (ActiveMQ) e quando chega uma mensagem do tópico para atualizar o site.

Eu tenho Javascript que cria um XMLHttpRequest para dados.O Servlet processos de Solicitação Get e envia de volta JSON.No entanto eu não tenho nenhuma idéia de como ligar o meu Servlet no meu ActiveMQ Message Broker.Ele apenas envia dados fictícios agora.

Eu estou pensando o Servelt deve implementar o messagelistener.Em seguida, onMessage enviar dados para o JavaScript página.Mas eu não tenho certeza de como fazer isso.

Foi útil?

Solução

O problema de ter um servlet implementar MessageListener é que os servlets são síncronos e MessageListeners são assíncronas.Em vez disso, você deve criar algum outro objeto para atuar como o MessageListener e atualização de algum estado em algum lugar (possivelmente, um banco de dados ou um JMX MBean ou um Stateful Session EJB) quando as mensagens chegam.Em seguida, o servlet pode consultar o estado para ver se há dados para o relatório de volta para o cliente, e sua página da web pode periodicamente o ping do servlet para solicitar novos dados.

Outras dicas

Como James Strachan diz - http://activemq.apache.org/ajax.html é um ideal fora-da-caixa-solução para o seu problema.

Se você ainda deseja criar tal solução manualmente, você pode apenas criar JMS ligação em seu Ajax servlet (ligação por solicitação).Considere o uso de Primavera JMS modelo para a razão ( http://static.springsource.org/spring/docs/2.5.x/reference/jms.html ).Em seguida, basta receber a mensagem no Servlet doGet/método doPost.Considerar o valor de tempo limite baixo para receber esse o caso.Tal solução não vai funcionar para as Filas e durável Tópicos.

Para os não-duráveis Tópicos considerar externo ouvinte da mensagem.Primavera MessageListenerContainer é uma excelente ferramenta para essa finalidade:

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

Feijão lastTenUpdatesCache vai ser um singleton feijão de execução MesssageListener.Este feijão seria responsável pela cache últimos dez mensagens (apenas colocá-la em java.util lista).Será injetado em sua Ajax servlet assim, em sua doGet/método doPost você pode perguntar a ele sobre as últimas 10 mensagens enviadas para o tópico.

Você já tentou ler as respostas para esta pergunta que links para o ActiveMQ Ajax suporte.Basicamente ActiveMQ tem suporte nativo para o Ajax, então você pode usar a sua biblioteca de JavaScript para assinar diretamente a partir de um ActiveMQ tópico.

Veja também o ActiveMQ web amostras que mostram como fazer coisas como chat em tempo real ou em tempo real da carteira de títulos de telas usando Ajax com ActiveMQ

Você provavelmente precisará obter uma JMS ligação da JNDI, como este:

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top