我有Jetty hightide 8.1.8.v20121106運行,並已部署一個小型的Web應用程序使用jQuery/JavaScript來監聽JMS主題,當收到消息時它會顯示它在頁面上。我有一個將連接到JMS主題併發布消息的Java應用程序,我希望Java應用程序發佈的消息被Jetty上的Web應用程序使用。如何發送jms消息從Java應用程序到碼頭webapp
當javascript webapp發佈消息或偵聽消息時,Jetty未連接到tcp:// localhost:61616。日誌顯示Jetty始終連接到vm:// localhost。有沒有辦法讓Jetty使用我的ActiveMQ服務器而不是自己的嵌入式?幫助表示讚賞。
配置文件如下:
碼頭,plus.xml
<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>
的web.xml爲webapp的
<web-app>
<context-param>
<param-name>org.apache.activemq.brokerURL</param-name>
<param-value>tcp://localhost:61616</param-value>
<description>The URL of the Message Broker to connect to</description>
</context-param>
<context-param>
<param-name>org.apache.activemq.embeddedBroker</param-name>
<param-value>true</param-value>
<description>Whether we should include an embedded broker or not</description>
</context-param>
<filter>
<filter-name>session</filter-name>
<filter-class>org.apache.activemq.web.SessionFilter</filter-class>
<!-- <filter-class>org.eclipse.jetty.continuation.ContinuationFilter</filter-class> -->
</filter>
<filter-mapping>
<filter-name>session</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.apache.activemq.web.SessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AjaxServlet</servlet-name>
<servlet-class>org.apache.activemq.web.AjaxServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>MessageServlet</servlet-name>
<servlet-class>org.apache.activemq.web.MessageServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AjaxServlet</servlet-name>
<url-pattern>/amq/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MessageServlet</servlet-name>
<url-pattern>/message/*</url-pattern>
</servlet-mapping>
<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<resource-env-ref>
<resource-env-ref-name>jms/interestingTopic</resource-env-ref-name>
<resource-env-ref-type>javax.jms.Topic</resource-env-ref-type>
</resource-env-ref>
<resource-ref>
<description>Connection Factory</description>
<res-ref-name>jms/connectionFactory</res-ref-name>
<res-type>javax.jms.ConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
聽的話題我的Java腳本代碼
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);
}
並且最後在我的Java應用程序中的代碼發佈
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");
}
它們是否都在同一個JVM中運行? – Derek
不,他們不是。我不知道在碼頭的哪個地方告訴它使用ActiveMQ,即使當我在上面的配置設置中更改它時,它也會連接到vm:// localhost。 –