Tomcat 配置连接到远程 ActiveMQ 实例

Tomcat configuration to connect to remote ActiveMQ instance

问题陈述:我正在寻求帮助,将 JMS 连接工厂公开给远程 ActiveMQ 实例(侦听 tcp)作为 Tomcat7 中的容器资源,以便 Web 应用程序部署在Tomcat7上可以访问。

我的配置:我在服务器上有一个Tomee和一个Tomcat7实例运行。 ActiveMQ 中的 Tomee 主机配置为侦听 tcp 线格式连接(下面的tomee.xml):

 <?xml version="1.0" encoding="UTF-8"?>
 <tomee>
  <!-- see http://tomee.apache.org/containers-and-resources.html -->
    <Resource id="MyJmsResourceAdapter" type="ActiveMQResourceAdapter">
        BrokerXmlConfig =  broker:(tcp://10.173.80.42:61619)
        ServerUrl       =  tcp://10.173.80.42:61619
    </Resource>

    <Resource id="jms/ConnectionFactory" type="javax.jms.ConnectionFactory">
        ResourceAdapter = MyJmsResourceAdapter
    </Resource>

    <Container id="MyJmsMdbContainer" type="MESSAGE">
        ResourceAdapter = MyJmsResourceAdapter
    </Container>

   <Resource id="myqueue" type="javax.jms.Queue"/>


  <!-- activate next line to be able to deploy applications in apps -->
  <Deployments dir="apps" />
</tomee>

在我的 Tomcat7 实例中,我将 server.xml 配置为:

<Resource name="jms/ConnectionFactory"
          auth="Container"
          type="org.apache.activemq.ActiveMQConnectionFactory"
          description="JMS Connection Factory"
          factory="org.apache.activemq.jndi.JNDIReferenceFactory"
          brokerURL="tcp://10.173.80.42:61619?soTimeout=60000"
          brokerName="ActiveMQStageBroker"
          useEmbeddedBroker="false" />

<Resource name="myQueue"
          auth="Container"
          type="org.apache.activemq.command.ActiveMQQueue"
          proxy-interface="javax.jms.Queue"
          description="My Queue"
          factory="org.apache.activemq.jndi.JNDIReferenceFactory"
          physicalName="myQueue" />

并且我已经将activemq-all-5.12.0.jar放在了Tomcat7的共享库文件夹中。我还在 Web 应用程序 META-INF 文件夹下的 context.xml 文件中进行了相关引用,并在 web.xml 中创建了一个添加的措施 resource-ref (这里基本上是吸管)

我的观察:当我启动触发与 ActiveMQ 通信的操作时,我在我的日志文件中看到以下条目:

2016-07-19 10:40:07,659 [system         ] DEBUG WireFormatNegotiator           - Sending: WireFormatInfo { version=11, properties={MaxFrameSize=9223372036854775807, CacheSize=1024, CacheEnabled=true, Host=10.173.80.42, SizePrefixDisabled=false, MaxInactivityDurationInitalDelay=10000, TcpNoDelayEnabled=true, MaxInactivityDuration=30000, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[A,c,t,i,v,e,M,Q]}
2016-07-19 10:40:07,666 [.42:61619@45620] DEBUG InactivityMonitor              - Using min of local: WireFormatInfo { version=11, properties={MaxFrameSize=9223372036854775807, CacheSize=1024, CacheEnabled=true, Host=10.173.80.42, SizePrefixDisabled=false, MaxInactivityDurationInitalDelay=10000, TcpNoDelayEnabled=true, MaxInactivityDuration=30000, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[A,c,t,i,v,e,M,Q]} and remote: WireFormatInfo { version=10, properties={CacheSize=1024, MaxFrameSize=9223372036854775807, CacheEnabled=true, SizePrefixDisabled=false, TcpNoDelayEnabled=true, MaxInactivityDurationInitalDelay=10000, MaxInactivityDuration=30000, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[A,c,t,i,v,e,M,Q]}
2016-07-19 10:40:07,667 [.42:61619@45620] DEBUG WireFormatNegotiator           - Received WireFormat: WireFormatInfo { version=10, properties={CacheSize=1024, MaxFrameSize=9223372036854775807, CacheEnabled=true, SizePrefixDisabled=false, TcpNoDelayEnabled=true, MaxInactivityDurationInitalDelay=10000, MaxInactivityDuration=30000, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[A,c,t,i,v,e,M,Q]}
2016-07-19 10:40:07,667 [.42:61619@45620] DEBUG WireFormatNegotiator           - tcp:///10.173.80.42:61619@45620 before negotiation: OpenWireFormat{version=11, cacheEnabled=false, stackTraceEnabled=false, tightEncodingEnabled=false, sizePrefixDisabled=false, maxFrameSize=9223372036854775807}
2016-07-19 10:40:07,668 [.42:61619@45620] DEBUG WireFormatNegotiator           - tcp:///10.173.80.42:61619@45620 after negotiation: OpenWireFormat{version=10, cacheEnabled=true, stackTraceEnabled=true, tightEncodingEnabled=true, sizePrefixDisabled=false, maxFrameSize=9223372036854775807}
2016-07-19 10:40:08,834 [WriteCheckTimer] DEBUG AbstractInactivityMonitor      - WriteChecker: 10000ms elapsed since last write check.
2016-07-19 10:40:08,836 [yMonitor Worker] DEBUG AbstractInactivityMonitor      - Running WriteCheck[tcp://10.173.80.42:61619]
2016-07-19 10:40:08,834 [WriteCheckTimer] DEBUG AbstractInactivityMonitor      - WriteChecker: 10000ms elapsed since last write check.
2016-07-19 10:40:08,836 [yMonitor Worker] DEBUG AbstractInactivityMonitor      - Running WriteCheck[tcp://10.173.80.42:61619]
2016-07-19 10:40:18,835 [WriteCheckTimer] DEBUG AbstractInactivityMonitor      - WriteChecker: 10000ms elapsed since last write check.
2016-07-19 10:40:18,835 [yMonitor Worker] DEBUG AbstractInactivityMonitor      - Running WriteCheck[tcp://10.173.80.42:61619]
2016-07-19 10:40:27,667 [WriteCheckTimer] DEBUG AbstractInactivityMonitor      - WriteChecker: 10000ms elapsed since last write check.
2016-07-19 10:40:27,668 [yMonitor Worker] DEBUG AbstractInactivityMonitor      - Running WriteCheck[tcp://10.173.80.42:61619]
2016-07-19 10:40:28,813 [ ReadCheckTimer] DEBUG AbstractInactivityMonitor      - 30000ms elapsed since last read check.
2016-07-19 10:40:28,834 [WriteCheckTimer] DEBUG AbstractInactivityMonitor      - WriteChecker: 10000ms elapsed since last write check.
2016-07-19 10:40:28,834 [yMonitor Worker] DEBUG AbstractInactivityMonitor      - Running WriteCheck[tcp://10.173.80.42:61619]
2016-07-19 10:40:37,667 [WriteCheckTimer] DEBUG AbstractInactivityMonitor      - WriteChecker: 10000ms elapsed since last write check.
2016-07-19 10:40:37,668 [yMonitor Worker] DEBUG AbstractInactivityMonitor      - Running WriteCheck[tcp://10.173.80.42:61619]
2016-07-19 10:40:38,834 [WriteCheckTimer] DEBUG AbstractInactivityMonitor      - WriteChecker: 10000ms elapsed since last write check.
2016-07-19 10:40:38,835 [yMonitor Worker] DEBUG AbstractInactivityMonitor      - Running WriteCheck[tcp://10.173.80.42:61619]
2016-07-19 10:40:47,667 [ ReadCheckTimer] DEBUG AbstractInactivityMonitor      - 30000ms elapsed since last read check.

此外,当我查看队列的 EnqueueCount 和 DequeueCount 时,我发现它们没有改变。

由于日志显示我的Tomcat7 Container确实收到了远程实例的信息(指"Received Wireformat: ..."),所以两个实例是可以通信的。但是为什么我无法发送数据?

附录:部署在托管 ActiveMQ 的 Tomee 实例中的同一 Web 应用程序可以与队列无缝通信。

感谢任何关于我可能做错了什么的想法或我可以在 Tomee 和 Tomcat7 端尝试的选项。

提前致谢!

在花费了无数小时试图使上述配置工作之后,结果是:

  1. JNDI 查找问题;
  2. 由记录异常的开发人员合成 在调试级别,而不是错误级别(谢谢大佬!)。

无论如何,在对所有这些进行排序后,这就是我找到的:

  1. 上述配置工作正常,其中 ActiveMQ 配置为 运行 作为 Tomee 容器的一部分,并且 Tomcat7 上的连接代理作为全局共享资源公开给部署在其中的 WebApps(了解你的 JNDI!)。

  2. 我也能够使用@JonathanS.Fisher 建议的配置。我能够将 ActiveMQ 作为独立实例启动,并将我的应用程序托管在 Tomcat7 上,Tomee 连接到它。

希望这对陷入类似情况的任何人有所帮助。

干杯