我有一个 java 代码,其中包含我在 Wildfly 中部署的 EAR 中的 @ResourceAdapter 注释:
@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 添加资源适配器:
/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
一切正常。现在,我想引入一个布尔属性,是否使用和部署ActiveMQ资源适配器。最初,我通过
if
声明来做到这一点:
set use_resource_adapter=${use_resource_adapter}
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
但是如果参数为 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]"]}}}
有没有办法让 @ResourceAdapter 注解在未配置/激活资源适配器时不会失败?
谢谢!
预期结果:如果 java 代码保持原样,并且没有通过 CLI 添加资源适配器,那么 EAR 仍应部署并且不会导致 WFLYCTL0062 错误
要在未配置或激活资源适配器时禁用 Wildfly 中的
@ResourceAdapter
注解,您可以改用 @Resource
注解。
以下是修改代码的方法:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "useJndi", propertyValue = "true"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "java:/jms/queue/myqueue"),
})
public class MyMessageListener implements MessageListener {
@Resource(lookup = "java:/jms/queue/myqueue")
private Queue queue;
@Override
public void onMessage(Message message) {
// Use the queue here
}
}
通过使用带有
@Resource
属性的 lookup
注解,您可以直接注入所需的资源(在本例中为 JMS 队列),而无需显式指定资源适配器。
这样,如果资源适配器没有配置或激活,EAR文件的部署就不会失败。在这种情况下,
@Resource
注释只会将注入的资源保留为null
。
请注意,您需要从代码中删除
@ResourceAdapter("my-resource-adapter")
注释。
通过使用这种方法,您可以根据布尔属性控制资源适配器的使用(
use_resource_adapter
)。如果该属性设置为 true
,您可以像以前一样通过 CLI 配置和激活资源适配器。如果该属性设置为 false
,您可以省略资源适配器配置,部署仍然会成功,不会出现任何错误。