Pregunta

Estoy construyendo un sitio que utiliza una simple AJAX Servlet para hablar de JMS (ActiveMQ) y cuando llega un mensaje de el tema de actualizar el sitio.

He Javascript que crea un XMLHttpRequest para los datos.El Servlet procesa la Solicitud y devuelve JSON.Sin embargo no tengo idea de cómo conectar mi Servlet en mi ActiveMQ Message Broker.Sólo envía datos de prueba ahora mismo.

Estoy pensando en la Servelt debe implementar la messagelistener.Luego onMessage enviar datos para el código JavaScript de la página.Pero no estoy seguro de cómo hacer esto.

¿Fue útil?

Solución

El problema con tener un servlet implementar MessageListener es que los servlets son sincrónicos y MessageListeners son asincrónicas.En lugar usted debe crear algún otro objeto para actuar como el MessageListener y actualización de algunos estado en algún lugar (posiblemente una base de datos o un JMX MBean o un EJB de Sesión con Estado) cuando los mensajes vienen en.A continuación, el servlet puede consultar en que estado para ver si hay datos de que se informe al cliente, y su página web periódicamente se puede hacer ping a la servlet para pedir nuevos datos.

Otros consejos

Como James Strachan dice - http://activemq.apache.org/ajax.html es un ideal fuera-de-la-caja de solución para su problema.

Si usted todavía desea crear una solución de forma manual sólo se puede crear JMS conexión en el Ajax servlet (conexión por solicitud).Considere la posibilidad de usar Spring JMS plantilla para que la razón ( http://static.springsource.org/spring/docs/2.5.x/reference/jms.html ).A continuación, acaba de recibir el mensaje en el Servlet doGet/método doPost.Considerar el bajo valor de tiempo de espera para recibir en ese caso.Tal solución funciona para las Colas y duradero Temas.

Para no duradero Temas que considere de mensajes externos oyente.La primavera MessageListenerContainer es una excelente herramienta para ese propósito:

<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 será un singleton de frijol de la aplicación de MesssageListener.Este bean sería responsable por el almacenamiento en caché de los diez últimos mensajes (sólo ponerla en java.util de la lista).Será que se inyecta en el Ajax servlet por lo que en su doGet/método doPost usted puede preguntar acerca de los últimos 10 mensajes enviados al tema.

Has probado a leer las respuestas para esta pregunta que se vincula a la ActiveMQ soporte de Ajax.Básicamente ActiveMQ tiene soporte nativo para Ajax, así que usted puede utilizar su biblioteca de JavaScript para suscribirse directamente desde un ActiveMQ tema.

Véase también el ActiveMQ ejemplos de web que muestran cómo hacer las cosas como el tiempo real de chat o de existencias en tiempo real de la cartera de pantallas utilizando Ajax con ActiveMQ

Probablemente usted necesita para obtener una JMS conexión de 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top