动态配置消息驱动Bean中的MappedName注释

时间:2013-04-16 09:37:48

标签: java java-ee annotations ejb-3.0 message-driven-bean

使用消息驱动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
    }
}

2 个答案:

答案 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 是启动时设置的系统变量。