我正在构建一个使用简单的AJAX Servlet来讨论JMS(ActiveMQ)的站点,以及当消息从主题到达时更新站点。
我有Javascript为数据创建XMLHttpRequest。 Servlet处理Get Request并发回JSON。但是我不知道如何将我的Servlet连接到我的ActiveMQ Message Broker。它现在只发回虚拟数据。
我在想Servelt应该实现messagelistener。然后onMessage将数据发送到JavaScript页面。但我不知道该怎么做。
答案 0 :(得分:2)
使用servlet实现MessageListener的问题是servlet是同步的,而MessageListeners是异步的。相反,您应该创建一些其他对象来充当MessageListener并在消息进入时更新某个状态(可能是数据库或JMX MBean或有状态会话EJB)。然后servlet可以查询该状态以查看是否有数据要报告回到客户端,您的网页可以定期ping servlet以获取新数据。
答案 1 :(得分:2)
正如James Strachan所说 - http://activemq.apache.org/ajax.html是解决问题的理想解决方案。
如果您仍想手动创建此类解决方案,则只需在Ajax servlet中创建JMS连接(每个请求的连接)。因此考虑使用Spring JMS模板(http://static.springsource.org/spring/docs/2.5.x/reference/jms.html)。然后只需在Servlet doGet / doPost方法中接收消息。在这种情况下,请考虑接收的低超时值。此类解决方案适用于队列和持久主题。
对于非持久性主题,请考虑外部消息侦听器。 Spring MessageListenerContainer
是一个很好的工具:
<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
将是一个实现MesssageListener
的单例bean。这个bean负责缓存最后十条消息(只是把它放到java.util列表中)。它将被注入到您的Ajax servlet中,因此在您的doGet / doPost方法中,您可以询问它发送给该主题的最后10条消息。
答案 2 :(得分:1)
您是否尝试过阅读this question链接ActiveMQ Ajax support的答案。基本上,ActiveMQ对Ajax有本机支持,因此您可以使用其JavaScript库直接从ActiveMQ主题订阅。
另请参阅ActiveMQ web samples,了解如何使用Ajax和ActiveMQ进行实时聊天或实时股票投资组合屏幕等操作
答案 3 :(得分:0)
您可能需要从JNDI获取JMS连接,如下所示:
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);