3

Jetty hightide 8.1.8.v20121106 を実行しており、jquery/javascript を使用して JMS トピックをリッスンする小さな webapp をデプロイしました。メッセージが受信されると、ページに表示されます。JMS トピックに接続してメッセージをパブリッシュする Java アプリがあります。Java アプリによってパブリッシュされたメッセージを Jetty の Web アプリで消費したいと考えています。

javascript webapp がメッセージを発行するか、メッセージをリッスンするときに、Jetty が tcp://localhost:61616 に接続していません。ログは、常に vm://localhost に接続している Jetty を示しています。Jetty に組み込みの ActiveMQ サーバーではなく、私の ActiveMQ サーバーを使用させる方法はありますか? 助けていただければ幸いです。

以下の構成ファイル:

jetty-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>

webapp のweb.xml

<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");
    }
4

2 に答える 2

1

文字通りインターネットを精査し、Jetty と ActiveMQ の構成に関する多くの Web サイトを調べた後。私はついに、jetty を activemq でクラスタリングし、jetty に activemq の Web コンソールを使用させることについて説明している 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 を開始し、十分な量の jetty が ActiveMQ に接続していることを確認し、以前はデフォルトで行っていた独自の vm://localhost 接続を作成しませんでした。

助けてくれた人たちのおかげで、私は自分の問題に集中することができました.

于 2013-02-05T18:26:14.603 に答える
0

Java コードの次の行により、ActiveMQ ブローカー インスタンスがローカル VM に作成されます (これは両刃の剣のようなものです...)。

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

myamqhostで別の ActiveMQ ブローカーを実行している場合は、その行を次のように変更します (ブローカーがポート 61616 でリッスンしていると仮定します)。

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

ActiveMQ JNDI サポートを参照してください。

ActiveMQ Ajax Clientも参照してください。

于 2013-02-04T17:44:01.077 に答える