Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 编写一个与JMS(ActiveMQ)对话的Servlet,并使用OnMessage更新站点_Javascript_Servlets_Jms_Activemq - Fatal编程技术网

Javascript 编写一个与JMS(ActiveMQ)对话的Servlet,并使用OnMessage更新站点

Javascript 编写一个与JMS(ActiveMQ)对话的Servlet,并使用OnMessage更新站点,javascript,servlets,jms,activemq,Javascript,Servlets,Jms,Activemq,我正在构建一个站点,它使用一个简单的AJAXServlet与JMS(ActiveMQ)对话,并在主题发送消息时更新站点 我有Javascript为数据创建XMLHttpRequest。Servlet处理Get请求并发回JSON。但是,我不知道如何将Servlet连接到ActiveMQ消息代理。它现在只发送回虚拟数据 我认为Servelt应该实现messagelistener。然后onMessage将数据发送到JavaScript页面。但我不知道如何做到这一点。您可能需要从JNDI获得JMS连接,

我正在构建一个站点,它使用一个简单的AJAXServlet与JMS(ActiveMQ)对话,并在主题发送消息时更新站点

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


我认为Servelt应该实现messagelistener。然后onMessage将数据发送到JavaScript页面。但我不知道如何做到这一点。

您可能需要从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);

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

您是否尝试读取指向该状态的链接的答案。基本上,ActiveMQ对Ajax具有本机支持,因此您可以使用其JavaScript库直接从ActiveMQ主题订阅

另请参阅,其中显示了如何使用Ajax和ActiveMQ进行实时聊天或实时股票投资组合屏幕,正如James Strachan所说,这是解决问题的理想现成解决方案

如果您仍然想手动创建这样的解决方案,您可以在Ajax servlet中创建JMS连接(每个请求的连接)。考虑使用Spring JMS模板来解决这个问题()。然后在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>

好的。。。这是连接到我的主题的好方法,谢谢。我已经有了这样的代码,这是另一个Java客户端。但是我希望Servelt实现messagelistener。然后onMessage将数据发送到Javascript页面。谢谢jodonnell。。我从来没有写过JMX MBean或有状态会话EJB,但在快速的google搜索之后,我认为这是向下看的正确途径。谢谢你的帮助。