2013-02-04 41 views
3

我有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"); 
    } 
+0

它們是否都在同一個JVM中運行? – Derek

+0

不,他們不是。我不知道在碼頭的哪個地方告訴它使用ActiveMQ,即使當我在上面的配置設置中更改它時,它也會連接到vm:// localhost。 –

回答

1

在逐字地瀏覽互聯網並瀏覽了很多關於配置Jetty和ActiveMQ的網站後,我終於遇到了一個網站,討論使用activemq集羣碼頭並使碼頭使用activemq的Web控制檯(http://java.dzone.com/articles/activemq-configuring-multiple)。該網站真的幫助。

所以我只是在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> 

從那以後,我開始Jetty和ActiveMQ的果然跳船被連接到ActiveMQ的,而不是創建其自己的VM://本地主機連接,它之前默認做了。

感謝那些幫助過的人,它讓我專注於我的問題。

0

這條線在Java代碼將導致本地VM要創建一個ActiveMQ代理實例(這是一個有點一把雙刃劍...):

props.setProperty(Context.PROVIDER_URL,"vm://localhost?broker.persistent=false"); 

如果您有其他ActiveMQ代理上myamqhost運行,然後修改該行像這(假設代理正在監聽端口61616):

props.setProperty(Context.PROVIDER_URL,"tcp://myamqhost:61616"); 

請參閱ActiveMQ JNDI Support。您可能還想看看ActiveMQ Ajax Client

+0

感謝評論,現在更改Java代碼上的提供者URL很容易。它正在獲取JavaScript應用程序(在Jetty上)以連接到與Java應用程序相同的ActiveMQ主機。如果仍不清楚,我會通知我,我會更新我的問題並添加碼頭日誌。 –

相關問題