我知道如何在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并重新启动服务器。
答案 0 :(得分:1)
我担心您必须进行显式JNDI查找,以便您可以动态设置要注入的资源。类似的东西:
Queue dynamicQueue = (Queue)initialContext.lookup(dynamicQueueName);
其中dynamicQueueName是您设置的变量,具体取决于您用来计算队列名称的标准。
答案 1 :(得分:0)
如果我理解正确,你想为Queue动态声明一个resource-env-ref(这基本上就是@Resource正在做的事情)。这没有意义:
答案 2 :(得分:0)
可以完成静态参数化初始化,例如来自资源包(.properties)文件。 见Andy Gibson。 (资源包按顺序缓存,但您可以刷新缓存。)
我认为你可能意味着有一个对象从一组动态队列发送到一个对象。 我个人会注入自己的Queue Provider bean,自编程。 请看Reconfigure your application at runtime with reloadable property files。