Tomcat 通过 TCP 使用 ActiveMQ 代理的 Web 应用程序

Tomcat web app with ActiveMQ broker over TCP

我正在尝试在 Tomcat 中托管的 Web 应用程序的上下文中设置 ActiveMQ 代理。此外,我想使用的连接器是 TCP,因为最终这个代理应该可以从远程应用程序访问。

到目前为止,我所做的是使用本地 JNDI context.xml 配置创建一个简单的 Web 应用程序,如下所示:

<Resource auth="Container"
    name="jms/ConnectionFactory"
    type="org.apache.activemq.ActiveMQConnectionFactory"
    description="JMSConnection"
    factory="org.apache.activemq.jndi.JNDIReferenceFactory"
    brokerURL="tcp://localhost:61616"
    brokerName="MQBroker"/>

<Resource auth="Container"
    name="jms/MQueue"
    type="org.apache.activemq.command.ActiveMQQueue"
    description="JMS queue"
    factory="org.apache.activemq.jndi.JNDIReferenceFactory"
    physicalName="SOME.QUEUE"/>

我相应地更新了 web.xml 文件,并从 ServletContextListener 实现 class 调用连接工厂,如下所示:

InitialContext context = new InitialContext();
Context cntx = (Context) context.lookup("java:comp/env");
ActiveMQConnectionFactory factory = (ActiveMQConnectionFactory) cntx.lookup("jms/ConnectionFactory");
factory.createQueueConnection();

部署应用程序时,出现异常:

Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused

我认为这是因为代理本身没有配置,因为在在线示例中我看到具有 Spring 配置的文件附加到资源的 brokerUrl 属性。问题是项目环境是严格定义的,所以我不能使用spring来提供配置。我也看到了一些Camel的解决方案,但这也是不可能的。

所以总结起来,问题是:

  1. 是否可以在 Web 应用程序本地设置 ActiveMQ 代理,远程应用程序可以通过网络访问它?
  2. 代理是否需要显式配置?
  3. 如果是,是否可以在不使用 Spring 代理配置的情况下完成此操作,而是使用属性文件或不向项目添加依赖项的类似文件?

您可以将 ActiveMQ 代理嵌入到您的应用程序中或作为独立的 Java 程序。代理配置不需要 Spring。

http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html