JBoss 7.4.4如何在队列创建完成后再部署应用?
我正在将公司的部分应用从JBoss 6.3.3升级到JBoss 7.4.4,整体运行正常,但应用启动时会提前尝试使用JNDI对象java:/ConnectionFactory,此时该对象还未完成绑定,导致启动失败——后续日志能看到队列已经正确绑定到这个JNDI对象。
之前在JBoss 6.3.3里用HornetQ定义队列,升级后改用messaging-activemq子系统,这个子系统生成队列的速度比HornetQ慢。之前遇到这类问题时我们用jboss-dependency.xml配置依赖,但这个方式在JBoss 7.4.4里已经废弃了。我试过jboss-all.xml、jboss-deployment-dependencies.xml还有自定义模块,都没解决问题,而且修改源码会带来副作用。
我需要让JBoss在队列创建完成、java:/ConnectionFactory绑定好之后再部署应用,请问该怎么配置?
更新:看起来JBoss已经移除了队列相关的依赖配置能力,有人说要从源码层面控制,但我不想改源码。
以下是几种无需修改源码就能实现需求的配置方案:
1. 用jboss-deployment-structure.xml绑定服务依赖
在应用的WEB-INF(Web应用)或META-INF(EJB/Java EE应用)目录下创建jboss-deployment-structure.xml,添加对messaging-activemq子系统服务的依赖,让应用等待ConnectionFactory服务就绪后再启动:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> <deployment> <dependencies> <module name="org.wildfly.messaging-activemq" services="import"/> <module name="org.wildfly.messaging-activemq"> <services> <service name="org.jboss.as.messaging.ConnectionFactoryService"/> </services> </module> </dependencies> </deployment> </jboss-deployment-structure>
2. 通过jboss-all.xml指定子系统依赖
在应用的META-INF/jboss-all.xml中配置部署依赖,明确依赖默认的messaging-activemq子系统:
<jboss xmlns="urn:jboss:1.0"> <deployment-dependencies xmlns="urn:jboss:deployment-dependencies:1.0"> <dependency name="jboss.messaging-activemq.default" type="subsystem" /> </deployment-dependencies> </jboss-all.xml>
这个配置会让应用在messaging-activemq子系统完全启动后再开始部署流程。
3. 全局调整启动顺序与部署依赖
如果上述方法无效,可以在JBoss的standalone.xml或domain.xml中做全局配置:
- 确认
<subsystem xmlns="urn:jboss:domain:messaging-activemq:14.0">节点在应用部署配置之前加载 - 在应用的部署配置中添加
<depends>jboss.messaging-activemq.default</depends>,或者通过管理控制台给部署项添加子系统依赖
4. 实现JNDI lookup延迟重试(无源码修改)
如果配置层面的依赖都不生效,可以通过添加JNDI代理的方式实现延迟重试:
- 编写一个简单的代理类,在lookup
java:/ConnectionFactory时循环尝试,直到对象可用 - 将应用中原直接lookup的配置指向这个代理类(比如在
jboss-ejb3.xml或web.xml中配置JNDI引用)
这种方式不需要修改业务代码,仅需添加代理类和少量配置。
内容的提问来源于stack exchange,提问作者Daniel

