【发布时间】:2011-09-23 10:40:44
【问题描述】:
我知道如何在 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 并重新启动服务器。
【问题讨论】:
-
依赖注入本身就是动态的。 “动态资源注入”是什么意思?你想让容器现在知道你想要什么依赖吗?
-
队列名称 "QUEUE1", "QUEUE2", "QUEUE3", ... 是 EJB 中的硬编码。我想让它成为参数的可配置值或从 INI 读取它。有可能吗?
标签: java jms ejb code-injection