使用AJAX连接到非本地ActiveMQ

时间:2013-02-28 14:01:56

标签: ajax activemq

我是activeMQ的新手。我有一些javascript连接到amq来获取/放置消息:

function init()
{
//AMQ message handler
amq.init({ 
    uri: amqURI, 
    logging: true,
    timeout: amqTimeout,
    clientId:amqClientID
});
amq.addListener(amqName, amqTopic, amqHandler);
}

function amqHandler(message)
{
alert("message");
}

function amqSend(content)
{
    amq.sendMessage(amqTopic, content);
}

如果网页在与队列相同的机器上提供(即在uri中使用localhost:port / amq或machinename:port / amq),这样可以正常工作 - 但是连接到另一台机器上的队列只会给我一个超时

我已设置jetty.xml以包含:

<bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector">
                <property name="host" value="0.0.0.0"/>
        <property name="port" value="8161" />
</bean>

和web.xml:

<servlet-mapping>
    <servlet-name>AjaxServlet</servlet-name>
    <url-pattern>/amq/*</url-pattern>
</servlet-mapping>

我甚至尝试过添加到activemq.xml:

<transportConnector name="websocket" uri="ws://0.0.0.0:61614"/>
<transportConnector name="nio" uri="nio://0.0.0.0:61616"/>

但是连接到远程activeMQ仍然没有运气。

谢谢!

2 个答案:

答案 0 :(得分:1)

这听起来很像跨域请求的正常Ajax限制。限制在浏览器中,并阻止任何XmlHttpRequest发送到除加载站点之外的其他域。

有一些解决此限制的方法,例如使用JSONP模式。但是,它不会解决您遇到的问题(因为它支持HTTP get,但不支持HTTP POST,并且addListener和sendMessage都会这样做)。

您可能想要设置一个代理或可以正确管道数据的东西,服务器端。但这不是那么微不足道。

答案 1 :(得分:0)

可能是您在浏览器之外从Javascript调用Ajax(或者以某种方式限制JS的浏览器)。经过多次实验,我们发现问题是servlet坚持认证,但由于没有浏览器弹出窗口,它失败了。

我在jetty-demo.xml中禁用了身份验证,瞧 - 它工作正常!

请参阅标题为“在this page上保护Web控制台”一节,了解如何执行此操作。