从 IBM MQ 迁移到 javax.jms.* (Weblogic)

Posted

技术标签:

【中文标题】从 IBM MQ 迁移到 javax.jms.* (Weblogic)【英文标题】:Migrating from IBM MQ to javax.jms.* (Weblogic) 【发布时间】:2013-05-27 05:43:04 【问题描述】:

我一直在寻找有关如何从使用 IBM Websphere MQ 迁移到仅使用 Weblogic 10.3.x 服务器中的 QueueManager 的问题。这将节省 IBM MQ 的许可成本。我最接近的是finiding一个外部链接,该链接指出IBM示例存在做类似的事情(从MQ转移到标准jms库),但是当我试图点击链接时:http://www.developer.ibm.com/isv/tech/sampmq.html 它会导致死页:\

更具体地说,我感兴趣

    在我尝试替换以下 com.ibm.mq.* 类时要使用哪些类: MQ 环境 MQQueueManager MQGetMessageOptions MQPutMessageOptions 和其他没有明显 javax.jms.* 替代的类。 我在此迁移过程中可能遇到的一些细微差别和变通方法。

我们将队列消息转发到的数据库是 Oracle 11 标准(具有高级队列),如果这会改变任何东西,所以基本上我们希望“去掉中间人”,可以这么说。我们将非常感谢您学到的回答!

【问题讨论】:

【参考方案1】:

您似乎使用 MQ 的 MQI api,手头没有替代品。除了实际重写 MQ 应用程序逻辑以使用 JMS API 之外,别无他法。

一个好的方法可能是首先使用相同的 WebSphere MQ 服务器迁移到 JMS,因为它允许您以可靠的方式验证您的结果。

您询问要替换 MQGetOptions 的类。没有单一的一对一替换(MQI 的某些方面甚至是 JMS 无法轻易替换的)。大多数 MQPutOptions 和其他选项都可以通过在 JMS 中设置会话和消息的参数来使用。在尝试此开关之前,您确实需要了解 JMS api。

然后,当您让 jms 使用 WebSphere MQ 时,您可以按照 Beryllium 的建议进行操作,但是将库交换到 Weblogic,将任何引用切换到 com.ibm.mq.jms.MQConnectionFactory;,配置新参数并祈祷任何可用的上帝 - 按运行:)

【讨论】:

感谢@Petter 的思考,这是一项艰巨的任务,因为我们目前正在管理数百个不同的队列,因此以前的开发人员自然而然地制作了可重用的类来管理这些 -然而,问题在于 IBM 类正是 IBM 特有的。我想没有避免重写 - Coffee Me!【参考方案2】:

我已经完成了一个同时支持 JBossMQ 和 MQSeries/WebSphere MQ 的应用程序。

我需要的 MQSeries 特定类是

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQConnectionFactory;
import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.mq.jms.MQTopicConnectionFactory;

这些足以创建javax.jms.QueueConnection/TopicConnection

对于 WebSphere MQ,我是直接连接的。 至于 JBossMQ,我使用 JNDI 查找了工厂。

所以除此之外只有 JMS。

    所以第一步是重写您的应用程序,以便初始化部分使用 WebSphere MQ 特定的类(我在上面列出的那些)

    用 JNDI/目录查找替换剩余的 MQ 特定部分,以查找您的应用程序服务器提供的 queue connection factory

    从您的源中删除 MQ 系列特定部件。

这是一个简单的example,它显示了如何发送消息。

【讨论】:

感谢@Beryllium,但这里的目标是根本不使用 IBM MQ。现有系统依赖于 IBM MQ,建议的解决方案根本不应该有 IBM MQ,并且必须在 Weblogic 服务器中使用内置的 java 消息传递,因此不能在代码中找到“import com.ibm.mq...”.. 就像 ibms 的 MQException 替换为 javax 的 MessageEOFException 其实这是我的意图,我已经更新了我的答案以澄清这一点 您是否必须为每个队列创建一个单独的生产者和消费者,或者您是否能够将通用组件提取到一种类似于 IBM 专有的 QueueManager 中? 拥有javax.jms.QueueConnection 后,您可以创建所有其他JMS 对象(会话、队列、发件人、消息)。我在其他一些(普通的Java)类中组织了这个;这并不是真正特定于 JMS,但它是一种队列管理器。

以上是关于从 IBM MQ 迁移到 javax.jms.* (Weblogic)的主要内容,如果未能解决你的问题,请参考以下文章

从 IBM MQ 迁移到 ActiveMQ 的过程 [关闭]

javax.jms.TransactionInProgressException: 无法在 JBoss EAP 6.2 和 Active MQ 5.10.0 上的 XASession 中回滚()

JMS MQ 绑定问题

导致异常的 IBM 字符集标头

ActiveMQ发送和监听类

javax.jms.JMSException:配置超过 50 个资源适配器时出现最大连接数 (50) 错误 - MDB