EJB3中的动态资源注入?

时间:2011-09-23 10:40:44

标签: java jms ejb code-injection

我知道如何在EJB中进行资源注入以获取JMS队列,就像下面的示例一样,很容易获得QUEUE1。但是如果我有很多队列,并且我不想在有新队列“QUEUE4”时更改代码。

是否有可能动态获取资源或有任何建议?

@Stateless
public class OrderBean implements Order {

@Resource(name = "A.QCF", mappedName = "A.QCF")
private ConnectionFactory connectionFactory;

@Resource(name = "QUEUE1")
private Queue QUEUE1;

@Resource(name = "QUEUE2")
private Queue QUEUE2;

@Resource(name = "QUEUE3")
private Queue QUEUE3;

    public String sendData(String abc) {
        // ...
    }
}

更新

感谢Gonzalo和bkail,以下是我的解决方案:

EJB代码:“QueueName”是来自客户端的参数。

InitialContext initialContext = new InitialContext();
Queue dynamicQueue = (Queue)initialContext.lookup("java:comp/env/" + QueueName);

ejb-jar.xml中:

<enterprise-beans>
    <session>
        <<resource-env-ref>>
            <resource-env-ref-name>Queue1</resource-env-ref-name>
            <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
        </<resource-env-ref>>
        <<resource-env-ref>>
            <resource-env-ref-name>Queue2</resource-env-ref-name>
            <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
        </<resource-env-ref>>
    </session>
</enterprise-beans>

当我有一个新队列时,我只需要更改ejb-jar.xml并重新启动服务器。

3 个答案:

答案 0 :(得分:1)

我担心您必须进行显式JNDI查找,以便您可以动态设置要注入的资源。类似的东西:

Queue dynamicQueue = (Queue)initialContext.lookup(dynamicQueueName);

其中dynamicQueueName是您设置的变量,具体取决于您用来计算队列名称的标准。

答案 1 :(得分:0)

如果我理解正确,你想为Queue动态声明一个resource-env-ref(这基本上就是@Resource正在做的事情)。这没有意义:

Jetty: adding <resource-env-ref> programmatically

答案 2 :(得分:0)

读者,必须有比我更优雅的答案。

可以完成静态参数化初始化,例如来自资源包(.properties)文件。 见Andy Gibson(资源包按顺序缓存,但您可以刷新缓存。)

我认为你可能意味着有一个对象从一组动态队列发送到一个对象。 我个人会注入自己的Queue Provider bean,自编程。 请看Reconfigure your application at runtime with reloadable property files

相关问题