You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:52:37