如何从java应用程序向jetty webapp发送jms消息
我已经运行了Jetty hightide 8.1.8.v20121106,并部署了一个使用jquery/javascript的小型Web应用程序来监听JMS主题,当收到消息时,它将显示在页面上。我有一个java应用程序可以连接到JMS主题并发布消息,我希望java应用程序发布的消息能够被Jetty上的webapp使用 码头没有连接到码头tcp://localhost:61616 当javascript webapp发布消息或侦听消息时。日志显示Jetty始终连接到vm://localhost。有没有办法让Jetty使用我的ActiveMQ服务器而不是它自己的嵌入式服务器?谢谢你的帮助 配置文件如下: jetty plus.xml如何从java应用程序向jetty webapp发送jms消息,java,web-applications,jms,jetty,activemq,Java,Web Applications,Jms,Jetty,Activemq,我已经运行了Jetty hightide 8.1.8.v20121106,并部署了一个使用jquery/javascript的小型Web应用程序来监听JMS主题,当收到消息时,它将显示在页面上。我有一个java应用程序可以连接到JMS主题并发布消息,我希望java应用程序发布的消息能够被Jetty上的webapp使用 码头没有连接到码头tcp://localhost:61616 当javascript webapp发布消息或侦听消息时。日志显示Jetty始终连接到vm://localhost。有
<New id="cf" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jms/connectionFactory</Arg>
<Arg>
<New class="org.apache.activemq.ActiveMQConnectionFactory">
<Arg>tcp://localhost:61616</Arg>
</New>
</Arg>
</New>
<New id="interestingTopic" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jms/interestingTopic</Arg>
<Arg>
<New class="org.apache.activemq.command.ActiveMQTopic">
<Arg>my.test</Arg>
</New>
</Arg>
</New>
java代码中的这一行将导致在本地VM中创建ActiveMQ代理实例(这有点像一把双刃剑……): 如果另一个ActiveMQ代理在myamqhost上运行,则将该行修改为类似以下内容(假设代理正在侦听端口61616): 看
您可能还想看看。在仔细浏览了互联网并浏览了许多关于配置Jetty和ActiveMQ的网站之后;我最终发现了一个网站,它讨论了如何使用activemq对jetty进行集群,并让jetty使用activemq()的web控制台。那个网站真的很有帮助 所以我在Jetty中缺少了一个额外的XML配置部分。使用上面的XML配置,我必须附加以下内容:
<New id="url" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jmx/url</Arg>
<Arg>
<New class="java.lang.String">
<Arg>service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi,service:jmx:rmi:///jndi/rmi://localhost:1299/jmxrmi</Arg>
</New>
</Arg>
</New>
jmx/url
服务:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi,服务编号:jmx:rmi:///jndi/rmi://localhost:1299/jmxrmi
在此之后,我启动了Jetty和ActiveMQ,并确信Jetty正在连接到ActiveMQ,而不是像以前默认情况下那样创建自己的vm://localhost连接
多亏了那些帮助我的人,这让我能够集中精力解决我的问题。它们实际上都在同一个JVM中运行吗?不,它们不是。我不知道在jetty的何处告诉它使用ActiveMQ,它会一直连接到vm://localhost,即使我在上面的配置设置中更改了它。感谢您的评论,现在更改Java代码上的提供程序URL很容易。它让Javascript应用程序(在Jetty上)与Java应用程序连接到同一个ActiveMQ主机。如果仍然不清楚,我会让我知道,我会更新我的问题并添加jetty日志。
window.onload = function() {
org.activemq.Amq.init({ uri: 'amq', logging: true, timeout: 45, clientId:('geo_1') });
};
var amq = org.activemq.Amq;
var msgTopic = 'topic://my.test';
var clientId = 'geo_1';
function addTopicListener() {
var myHandler = {
rcvMessage: function(message) {
//<message type="zmg">test test</message>
var type = message.getAttribute('type');
switch (type) {
case 'zmsg':
{
var text = message.childNodes[0].data;
document.getElementById('zmsg_container').innerHTML += ' | '+text;
break;
}
}
}
};
amq.addListener('myHandler', msgTopic, myHandler.rcvMessage);
};
function delTopicListener() {
amq.removeListener('myHandler', msgTopic);
}
private void init() throws NamingException {
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");
props.setProperty("topic.test", "my.test");
ctx = new InitialContext(props);
System.out.println("JMS Context Initialized");
}
private void connect() throws NamingException, JMSException {
connectionFactory = (TopicConnectionFactory)ctx.lookup("ConnectionFactory");
conn = connectionFactory.createTopicConnection();
myTopic = (Topic)ctx.lookup("test");
session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
publisher = session.createPublisher(myTopic);
System.out.println("JMS Connection started");
}
props.setProperty(Context.PROVIDER_URL,"vm://localhost?broker.persistent=false");
props.setProperty(Context.PROVIDER_URL,"tcp://myamqhost:61616");
<New id="url" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jmx/url</Arg>
<Arg>
<New class="java.lang.String">
<Arg>service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi,service:jmx:rmi:///jndi/rmi://localhost:1299/jmxrmi</Arg>
</New>
</Arg>
</New>