使用消息驱动Bean时,注释@MessageDriven(mappedName = "someDestinationName")
有没有办法在运行时添加此信息? Bellow是Message Driven Bean类的示例。
package mdb.beans;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(mappedName = "someDestinationName", activationConfig =
{
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class MDBSample implements MessageListener
{
public MDBSample()
{
// constructor
}
@Override
public void onMessage(Message message)
{
// logic when message received
}
}
答案 0 :(得分:2)
据我所知,不,你不能这样做。
因为,在部署时,目标(即String)和bean(它是一个类)的耦合一次,您无法以编程方式更改目标。
也许有重新绑定的黑客攻击;我的意思是强制容器释放MDB,然后更改目标并重新初始化(通过依赖注入,然后发布构造步骤等)但我怀疑应用程序服务器是否允许这样做。
摘自JSR-318(EJB 3.1规范);
5.4.17消息驱动Bean与目标或端点的关联
当bean部署在容器中时,消息驱动的bean与目标或端点关联。部署者有责任将消息驱动的bean与目标或端点相关联。
5.4.17.1 JMS消息驱动的豆
当bean部署在容器中时,JMS消息驱动Bean与JMS目标(队列或主题)相关联。部署人员有责任将消息驱动的bean与队列或主题相关联。
答案 1 :(得分:0)
您可以在应用程序启动时通过从系统变量注入值来实现这一点。
对于 Thorntail (2.6.0),我们在 project-defaults.yml
中引入了以下设置:
thorntail:
ee:
annotation-property-replacement: true
然后从 MessageDrivenBean
引用配置参数:
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "java:/jms/queue/${configuration.customer}.queue")
...
其中 configuration.customer
是启动时设置的系统变量。