Wildfly中未配置资源适配器时,如何让@ResourceAdapter注解不触发部署失败?
问题
在Wildfly中部署EAR包时,包含如下带@ResourceAdapter注解的MDB代码:
@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "useJndi", propertyValue = "true"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/myqueue"), }) @ResourceAdapter("my-resource-adapter") public class MyMessageListener implements MessageListener { @Override public void onMessage (Message message) { } }
通过CLI命令配置ActiveMQ资源适配器(RA)时运行正常:
/subsystem=resource-adapters/resource-adapter=my-resource-adapter:add(archive=activemq-rar-5.18.2.rar,transaction-support=XATransaction) /subsystem=resource-adapters/resource-adapter=my-resource-adapter/config-properties=ServerUrl:add(value=<url>) /subsystem=resource-adapters/resource-adapter=my-resource-adapter/connection-definitions=my-resource-adapter.connection:add(<connection definitions here>) /subsystem=resource-adapters/resource-adapter=my-resource-adapter/admin-objects=<admin objects here> /subsystem=resource-adapters/resource-adapter=my-resource-adapter:activate
现在需要通过布尔属性use_resource_adapter控制是否部署该RA,用CLI的if语句实现后,当属性为false时,EAR部署报错:
{"WFLYCTL0062: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"WFLYCTL0412: Required services that are not installed:" => ["jboss.ra.my-resource-adapter"],"WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"myear.ear\".\"myear.jar\".component.MyMessageListener.CREATE is missing [jboss.ra.my-resource-adapter]"]}}}
需求:保留Java代码不变,当未通过CLI配置RA时,EAR仍能正常部署,不触发上述错误。
解决方案
方法1:通过Wildfly特定EJB部署描述符忽略缺失依赖
在EAR的子模块(包含MDB的JAR)中添加jboss-ejb3.xml文件,配置MDB忽略缺失的资源适配器依赖:
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" version="3.1" impl-version="2.0"> <enterprise-beans> <message-driven> <ejb-name>MyMessageListener</ejb-name> <!-- 匹配注解中的资源适配器名称 --> <resource-adapter>my-resource-adapter</resource-adapter> <!-- 配置忽略资源适配器不可用的情况 --> <dependency> <jboss:ignore-missing-dependencies>true</jboss:ignore-missing-dependencies> </dependency> </message-driven> </enterprise-beans> </jboss:ejb-jar>
该配置会告诉Wildfly,当my-resource-adapter未部署时,跳过该MDB的依赖检查,EAR可正常部署,MDB会处于未激活状态,直到RA被配置激活。
方法2:通过CLI动态调整MDB配置
修改CLI脚本,在use_resource_adapter为false时,设置对应MDB忽略缺失依赖:
set use_resource_adapter=${use_resource_adapter} # 部署RA(原逻辑) if (outcome == "success" && result == "true") of :resolve-expression(expression=$use_resource_adapter) /subsystem=resource-adapters/resource-adapter=my-resource-adapter:add(archive=activemq-rar-5.18.2.rar,transaction-support=XATransaction) /subsystem=resource-adapters/resource-adapter=my-resource-adapter/config-properties=ServerUrl:add(value=<url>) /subsystem=resource-adapters/resource-adapter=my-resource-adapter/connection-definitions=my-resource-adapter.connection:add(<connection definitions here>) /subsystem=resource-adapters/resource-adapter=my-resource-adapter/admin-objects=<admin objects here> /subsystem=resource-adapters/resource-adapter=my-resource-adapter:activate end-if # 当RA不部署时,设置MDB忽略缺失依赖 if (outcome == "success" && result == "false") of :resolve-expression(expression=$use_resource_adapter) # 确保EAR已部署,调整为你的EAR和子模块名称 /deployment=myear.ear/subdeployment=myear.jar/ejb=MyMessageListener:write-attribute(name=ignore-missing-dependencies, value=true) end-if
注意:需确保该CLI命令在EAR部署之后执行,或者将其整合到EAR的部署流程中。
方法3:使用激活配置属性忽略不可用资源
在MDB的激活配置中添加ignore-unavailable属性(ActiveMQ RA支持该配置),结合部署描述符配置:
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" version="3.1" impl-version="2.0"> <enterprise-beans> <message-driven> <ejb-name>MyMessageListener</ejb-name> <resource-adapter>my-resource-adapter</resource-adapter> <activation-config> <activation-config-property> <activation-config-property-name>ignore-unavailable</activation-config-property-name> <activation-config-property-value>true</activation-config-property-value> </activation-config-property> </activation-config> </message-driven> </enterprise-beans> </jboss:ejb-jar>
该属性可让MDB在RA不可用时不触发部署失败,MDB会处于待激活状态,直到RA配置完成。
内容的提问来源于stack exchange,提问作者Mochi Burei
相关产品推荐
相关产品推荐

