4

在我的测试中,我运行 inmem ActiveMQ,然后实例化 ActiveMQConnectionFactory 并做任何我想做的事情来测试它。我使用它是因为这似乎是创建集成测试的最简单方法。我认为从 ActiveMQConnectionFactory 切换到 com.ibm.mq.jms.MQTopicConnectionFactory 会很简单。但显然不是。这个片段的映射是什么

<bean id="activeMqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <constructor-arg value="vm://localhost:61616"/>
</bean>

到那个:

<bean id="ibmConnectionFactory" class="com.ibm.mq.jms.MQTopicConnectionFactory">
    <property name="hostName" value="??"/>
    <property name="port" value="??"/>
    <property name="queueManager" value="??"/>
    <property name="channel" value="??"/>
    <property name="transportType" value="?"/>
</bean>

如果没有骆驼拥有的某种奇怪的桥梁,这甚至可能吗?

4

2 回答 2

4

这是不可能的。JMS 规范涵盖了 API 和行为,但供应商可以自由实现他们希望的任何有线格式和通信协议。WebSphere MQ 使用它自己的格式和协议,而 Active MQ 有它自己的格式和协议。

桥接应用程序的功能是从一个传输将消息读入内存,然后将该消息写入另一个传输。尽管这在基本级别上有效,但两种传输具有不同的目标名称空间和安全领域,因此这些接口往往是硬编码的点对点路由。在混合 JMS 传输提供程序时,这通常是您可以期待的最佳状态。

于 2012-08-17T12:56:21.133 回答
4

您无法使用 Camel 或 ActiveMQ JMS 桥接器来执行此操作,因为如果您使用 IBM jms 类(例如 com.ibm.mq.jms.MQTopicConnectionFactory ),则需要一个 WebSphere MQ 代理来连接

但是,我已经完全完成了您在一个项目中尝试做的事情。核心思想不是使用供应商特定的类,而是使用代码中的 JMS 接口。然后您可以将配置存储在 JNDI 中(一个用于集成测试,一个用于生产/验收测试)。

如果您不想使用 JNDI,您也许可以为每个场景使用不同的 spring 上下文(这是我的方法)。

我们举一个简单的例子:

您有两个单独的 applicationContext.xml 文件(一个嵌入式测试和一个生产)

内部测试:

<beans>
  <import resource="jmsTest.xml"/>
  <import resource="mainApplication.xml"/>
</beans>

产品:

<beans>
  <import resource="jmsProd.xml"/>
  <import resource="mainApplication.xml"/>
</beans>

然后创建您的 jms 上下文:

jmsTest.xml:

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <constructor-arg value="vm://localhost:61616"/>
</bean>

jmsProd.xml

<bean id="connectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
  <property name="hostName" value=".."/>
   ... 
</bean>

mainApplication.xml(jms 监听器等),相同

<bean id="myJmsHandlingClass" class="some.custom.Class"/>
  <property name="connectionFactory" ref="connectionFactory"/>
</bean>

然后只需确保遵循 JMS 规范并且不执行特定于供应商的操作,因为 WMQ 和 AMQ 都具有对 jms 标准的扩展,可能很容易使用。

如果您正在处理主题,一个棘手的部分是 AMQ 和 WMQ 默认使用不同的主题分隔符。

在 WMQ 中:根/子主题/#

在 AMQ 中:root.subtopic.*

所以你可能也想通过 spring 注入目的地,它类似于上面的连接工厂。

于 2012-08-19T09:20:45.840 回答