如何在 JBoss 5 中订购 EJB 和 JMS 队列配置的部署?
Posted
技术标签:
【中文标题】如何在 JBoss 5 中订购 EJB 和 JMS 队列配置的部署?【英文标题】:How to order deployment of EJBs and JMS queue config in JBoss 5? 【发布时间】:2011-06-04 16:53:26 【问题描述】:我正在使用 JBoss [EAP] 5.0.0.GA,并且我有一个 EAR,其中包含一个 EJB jar,其中包含一些 MDB,这些 MDB 取决于它们使用的 JMS 队列的存在。当我在.../server/all/deploy/messaging/myqueues-service.xml
中配置队列时没有问题。
但是,我想在 EAR 文件中配置队列以避免直接更改 JBoss 配置。没问题,我把我的myqueues-service.xml
文件放到EAR的根目录下,并添加了对我jboss-app.xml
的引用,如下:
<jboss-app>
<module-order>strict</module-order>
<loader-repository>
seam.jboss.org:loader=my-ear.ear
</loader-repository>
<module>
<service>myqueues-service.xml</service>
</module>
</jboss-app>
但是,当我这样做时,JBoss 首先加载 EJB jar(包含在 my-ear.ear 中),然后再配置 JMS 队列。这会导致加载 MDB 时出错:
12:16:02,714 WARN [JmsActivation] Failure in jms activation org.jboss.resource.adapter.jms.inflow.JmsActivationSpec@13a59e .....
javax.naming.NameNotFoundException: MyQueue not bound
这不是一个大问题,因为稍后 MDB 成功重新连接到 JMS:
12:16:12,698 INFO [JmsActivation] Attempting to reconnect org.jboss.resource.adapter.jms.inflow.JmsActivationSpec@f91ad5
12:16:12,823 INFO [JmsActivation] Reconnected with messaging provider.
但我真的很想避免出现任何错误,为了做到这一点,我需要一种方法来强制 JBoss 在加载 EJB jar 之前先配置 JMS 队列。有没有办法做到这一点?作为参考,这里是 EAR 的 application.xml
:
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5">
<display-name>my-ear</display-name>
<module>
<ejb>my-ejb.jar</ejb>
</module>
<module>
<web>
<web-uri>my.war</web-uri>
<context-root>myroot</context-root>
</web>
</module>
</application>
任何建议表示赞赏。
【问题讨论】:
【参考方案1】:好的,community.jboss.org 论坛上的jaikiran pai 帮助了我。解决方案是将 JMS 队列添加为对 MDB 的依赖项。就我而言,我使用了 @Depends 注释:
@MessageDriven(activationConfig =
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/MyQueue") )
@Depends("jboss.messaging.destination:service=Queue,name=MyQueue")
public class MyMessageListener implements MessageListener
...
如果你不使用注释,你可以使用 jboss.xml 来做同样的事情。
【讨论】:
只是更有用一点:如果您不想将 myqueues-service.xml 文件放在 .../server/all/deploy/messaging/ 文件夹中,并且不要想要将它包含在 EAR 中,那么您可以将它放在 .../server/all/deploy/ 中(使用 Eclipse 中的“Make Deployable”,或者只是将其复制到那里)。这消除了在 MDB 中声明显式依赖关系的需要,同时不改变默认的 JBoss 服务器配置。以上是关于如何在 JBoss 5 中订购 EJB 和 JMS 队列配置的部署?的主要内容,如果未能解决你的问题,请参考以下文章
在 JBoss 5.1 上应该使用哪个 JMS ConnectionFactory?
我无法设置我的 jndi.properties 来访问 Jboss 5 上的远程 EJB
在 JBOSS EAP 7.1 中,如何将 EJB 和 undertow 的统计启用设置为 True?
javax.jms.TransactionInProgressException: 无法在 JBoss EAP 6.2 和 Active MQ 5.10.0 上的 XASession 中回滚()