IBM Websphere MQ-用于Tomcat部署的EJB和MDB迁移

时间:2019-06-11 04:55:18

标签: java jms ejb ibm-mq spring-jms

我已经为此苦苦挣扎很长时间了。我有一个IBM Websphere MQ,它使用EJB和MDB

以下是配置ejb mdb的位置。

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-bnd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd" version="1.0">
  <message-driven name="Queue1MDB">
    <jca-adapter activation-spec-binding-name="jms/Queue1MQActivationSpec" destination-binding-name="jms/Queue1RequestQueue"/>
    <resource-ref binding-name="jms/QueueConnectionFactory" name="jms/QueueConnectionFactory"/>
    <message-destination-ref binding-name="jms/SuccessfulResponseQueue" name="jms/SuccessfulResponseQueue"/>
    <message-destination-ref binding-name="jms/FailedResponseQueue" name="jms/FailedResponseQueue"/>
  </message-driven>

  <message-driven name="Queue2MDB">
    <jca-adapter activation-spec-binding-name="jms/Queue2MQActivationSpec" destination-binding-name="jms/Queue2RequestQueue"/>
    <resource-ref binding-name="jms/QueueConnectionFactory" name="jms/QueueConnectionFactory"/>
    <message-destination-ref binding-name="jms/SuccessfulResponseQueue" name="jms/SuccessfulResponseQueue"/>
    <message-destination-ref binding-name="jms/FailedResponseQueue" name="jms/FailedResponseQueue"/>
  </message-driven>

  <message-driven name="Queue3MDB">
    <jca-adapter activation-spec-binding-name="jms/Queue3MQActivationSpec" destination-binding-name="jms/Queue3RequestQueue"/>
    <resource-ref binding-name="jms/QueueConnectionFactory" name="jms/QueueConnectionFactory"/>
    <message-destination-ref binding-name="jms/SuccessfulResponseQueue" name="jms/SuccessfulResponseQueue"/>
    <message-destination-ref binding-name="jms/FailedResponseQueue" name="jms/FailedResponseQueue"/>
  </message-driven>

  <message-driven name="Queue4MDB">
    <jca-adapter activation-spec-binding-name="jms/Queue4MQActivationSpec" destination-binding-name="jms/Queue4RequestQueue"/>
    <resource-ref binding-name="jms/QueueConnectionFactory" name="jms/QueueConnectionFactory"/>
    <message-destination-ref binding-name="jms/SuccessfulResponseQueue" name="jms/SuccessfulResponseQueue"/>
    <message-destination-ref binding-name="jms/FailedResponseQueue" name="jms/FailedResponseQueue"/>
  </message-driven>
</ejb-jar-bnd>

这是在ear中配置的,已部署在IBM WAS中。 destination-binding-name将从IBM WAS中选择​​相应的队列详细信息。

然后,在我的java类中配置MDB,如下所示,同时在所有队列上实现侦听并提取消息:

@Resource(name = "jms/QueueContractConnectionFactory")
private ConnectionFactory connectionFactory;

@Resource(name = "jms/FailedResponseQueue")
private Queue errorQueue;

@Resource(name = "jms/SuccessfulResponseQueue")
private Queue responseQueue;

我现在必须删除ejb并修改mdb配置,以使其可在tomcat中部署。

xml是某种东西,我真的不知道如何在没有ejb参数的情况下映射它。

有人可以帮助或共享有关如何实现此目的的文档吗?我想举一个带有激活规范的IBM MQ到Spring JMS的示例。

谢谢。

3 个答案:

答案 0 :(得分:2)

正如已经评论过的,这不仅仅是用Tomcat替换WAS的问题,因为它们不是同一种容器。因此,您不能直接将WAS工件(尤其是MDB)直接部署到Tomcat中。为了使它们进入Tomcat,必须将它们重写。

通过成为MDB,容器可以为您管理:连接到JMS服务器,将消息从队列/主题路由到逻辑,多线程消息处理(一次处理多个队列中的消息),以及大多数尤其是交易管理。

现在,针对JMS的消息处理非常简单。您可以轻松建立与JMS的连接。您可以从网络上复制示例并使其正常运行。在后台运行处理非常简单,也有示例。 JMS 2.0比JMS 1.x更易于使用。没有理由不移植到该端口(除非MQ不支持JMS 2.0)。

以事务方式运行逻辑的多个实例并不是那么简单,但这也许不是您处理的一个敏锐方面。

但是,即使您能够完成所有这些工作,目前仍不能保证您的逻辑将直接起作用。我们不知道您是否逻辑调用其他EJB或利用其他Java EE基础结构。如果这样做,他们还必须移植逻辑的这一方面,而不仅仅是MDB连接。

因此,这是一个更深层次的问题。说“只在Tomcat中部署它”很容易,但是可能有一些细节使它脱轨,需要加以考虑。

另一种方法是将逻辑转换为Spring,因为它可以轻松地部署在Tomcat中。但这并不一定比其他任何事情都要简单-所有警告仍然存在。

最后,在这种情况下,“在Tomcat中进行部署”几乎是不言而喻的,因为MDB不是Web Apps,并且Tomcat部署了Web Apps。您可以创建Web应用程序的外壳,该外壳除了容纳消息驱动的逻辑外什么也不做。这很容易做到,我和许多其他人已经将Web App的生命周期滥用到了我们自己对此类事情的恶毒目的。

因此,最后,我认为您需要进一步了解“在Tomcat中进行部署”的真正含义,最终的期望以及您的消息逻辑是否依赖于其他Java EE基础结构等。目标是可以在Tomcat中运行,也可以不在WAS中运行(在这种情况下,如注释中所述,您可以使用其他应用服务器,这些服务器将更容易过渡到该服务器)。

答案 1 :(得分:0)

关于Websphere MQ,您应该注意一件事。仅通过Websphere应用程序服务器支持具有用于JMS的MQ类的连接池。当您迁移到Tomcat时,您可能会遇到性能下降的问题,并且您可能必须实现一些自我池化。我认为春天可以在这方面有所帮助。我将从IBM文档中引用它

  

公共无效setSetConnectionConnectionPooling(boolean usePooling)

     

已弃用。 JMS不再使用连接池。任何   连接池应该使用   应用服务器。设置早期版本的ConnectionPooling的使用   JMS的IBM MQ类。保留此方法是为了实现兼容性   使用较旧的MQJMS应用程序,但是,因为此连接池   功能已从版本7中删除,设置了此属性   不会有效果。

https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.javadoc.doc/WMQJMSClasses/com/ibm/mq/jms/MQConnectionFactory.html#setUseConnectionPooling-boolean-

我认为您最好的选择是对WAS应用程序进行弹簧化(升级),然后切换到Tomcat。一旦移动到弹簧,那应该是小菜一碟。它应该是独立于容器的。在线上有很多关于如何将Java EE迁移到Spring应用程序的建议。自从春天开始以来,这项运动已经进行了多年。

在此过程中,您还可以应用分而治之,最终得到一个以上的应用程序,而不是一个整体。

答案 2 :(得分:0)

就像您链接到该问题的另一篇文章一样,假设您擅长设置springframework,MQ和服务器管理,则概述了这些步骤。但是,如果您正在努力入门,这里有一些提示。

开始之前,您需要了解这在技术上可能具有挑战性。有时,与其更改现有内容,不如将现有内容分解为多个模块并从头开始实施它们就更有意义了。如果您选择更改存在的内容,请按照以下方法进行操作:

让spring框架在RAD中构建的应用程序中正常工作。你成功做到了吗?只需从应用程序上下文中注入任何bean,然后查看是否可以在WAS上使用它。如果您可以成功完成此操作,则意味着您已经抢先一步,其余的工作都可以完成。让我知道,当您完成此操作-在此处粘贴您的应用程序上下文或配置。我可以告诉你下一步该怎么做。记住,您不必立即切换到tomcat-您的目标应该是用可以侦听消息的spring bean替换MDB-并且它可以在WAS上运行。