我已经为此苦苦挣扎很长时间了。我有一个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的示例。
谢谢。
答案 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中删除,设置了此属性 不会有效果。
我认为您最好的选择是对WAS应用程序进行弹簧化(升级),然后切换到Tomcat。一旦移动到弹簧,那应该是小菜一碟。它应该是独立于容器的。在线上有很多关于如何将Java EE迁移到Spring应用程序的建议。自从春天开始以来,这项运动已经进行了多年。
在此过程中,您还可以应用分而治之,最终得到一个以上的应用程序,而不是一个整体。
答案 2 :(得分:0)
开始之前,您需要了解这在技术上可能具有挑战性。有时,与其更改现有内容,不如将现有内容分解为多个模块并从头开始实施它们就更有意义了。如果您选择更改存在的内容,请按照以下方法进行操作:
让spring框架在RAD中构建的应用程序中正常工作。你成功做到了吗?只需从应用程序上下文中注入任何bean,然后查看是否可以在WAS上使用它。如果您可以成功完成此操作,则意味着您已经抢先一步,其余的工作都可以完成。让我知道,当您完成此操作-在此处粘贴您的应用程序上下文或配置。我可以告诉你下一步该怎么做。记住,您不必立即切换到tomcat-您的目标应该是用可以侦听消息的spring bean替换MDB-并且它可以在WAS上运行。