如何从java应用程序向jetty webapp发送jms消息

如何从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。有

我已经运行了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

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