2

我正在构建一个站点,该站点使用简单的 AJAX Servlet 与 JMS (ActiveMQ) 交谈,并在消息从主题到达时更新站点。

我有为数据创建 XMLHttpRequest 的 Javascript。Servlet 处理 Get 请求并返回 JSON。但是我不知道如何将我的 Servlet 连接到我的 ActiveMQ 消息代理。它现在只是发回虚拟数据。

我在想Servelt应该实现messagelistener。然后 onMessage 将数据发送到 JavaScript 页面。但我不知道该怎么做。

4

4 回答 4

2

让 servlet 实现 MessageListener 的问题在于 servlet 是同步的,而 MessageListener 是异步的。相反,您应该创建一些其他对象来充当 MessageListener 并在消息进入时更新某处的某些状态(可能是数据库或 JMX MBean 或有状态会话 EJB)。然后 servlet 可以查询该状态以查看是否有数据要报告返回客户端,您的网页可以定期 ping servlet 以请求新数据。

于 2008-09-15T17:56:07.417 回答
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 方法中接收消息。在这种情况下,请考虑接收的低超时值。这样的解决方案将适用于队列和持久主题。

For non-durable Topics consider external message listener. Spring MessageListenerContainer is an excellent tool for that purpose:

<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 will be a singleton bean implementing MesssageListener. This bean would be responsible for caching last ten messages (just putting it into a java.util list). It will be injected into your Ajax servlet so in your doGet/doPost method you can ask it about last 10 messages sent to the topic.

于 2010-03-02T08:04:04.330 回答
1

您是否尝试阅读链接到ActiveMQ Ajax 支持的这个问题的答案。基本上,ActiveMQ 对 Ajax 具有原生支持,因此您可以使用其 JavaScript 库直接订阅 ActiveMQ 主题。

另请参阅ActiveMQ Web 示例,其中展示了如何使用 Ajax 和 ActiveMQ 执行实时聊天或实时股票投资组合屏幕等操作

于 2008-09-16T13:44:14.347 回答
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);
于 2008-09-15T17:24:08.303 回答