2011-09-23 51 views
0

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

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

@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) { 
     // ... 
    } 
} 

更新:

感谢贡萨洛和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

依赖注入本身是动态的。 “动态资源注入”是什么意思?你想让容器现在可以确定你想要的依赖吗? –

+0

队列名称“QUEUE1”,“QUEUE2”,“QUEUE3”...是EJB中的硬编码。我想让它成为一个来自参数的可配置值,或者从INI中读取它。可能吗? – Dennys

回答

1

恐怕你必须做一个明确的JNDI查找,以便动态地设置你想注入的资源。喜欢的东西:

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

其中dynamicQueueName为您设置取决于你使用什么标准来找出队列名称的变量。

+0

我认为这是一个可行的解决方案,我们已经在我们的旧应用程序(WebLogic)中使用它。但是因为我们使用OpenEJB进行测试(仍然使用WebLogic进行生产),所以我可以同时使用@resource,但我无法使用context.lookup()立即获取资源。我会研究它,谢谢。 – Dennys

0

如果我理解正确,你想动态地声明一个队列的资源env-ref(这基本上是@Resource正在做什么)。这是没有意义的:

Jetty: adding <resource-env-ref> programmatically

+0

的目的是分开开发者和部署者之间的配置。对我而言,它只是让我改变XML中的队列名称。但我需要的是动态添加一个新队列,而不仅仅是更改映射。感谢您的回复,如果我错过任何内容,请告诉我。 – Dennys

+0

动态添加新队列可绕开开发者/部署者。如果你打算这么做的话,你可以直接查找Queue(而不是使用@Resource或resource-env-ref),这正是Gonzalo所建议的。我想你也许能够查找一个QueueConnectionFactory,但我不是JMS专家,所以我不确定。 –

+0

不需要查找QueueConnectionFactory,因为所有队列都使用相同的QueueConnectionFactory。但是,如果需求是动态查找QueueConnectionFactory,那么查找是必要的,谢谢。 – Dennys

0

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

可以完成静态参数化初始化,例如从资源包(.properties)文件中进行初始化。 见Andy Gibson(资源包缓存的方式,但你可以冲洗缓存。)

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

+0

可重新加载的属性很有用。但是因为我想动态添加一个队列,所以不要改变队列。我不确定,也许这不适合我的情况。但是,仍然要感谢您的回复,可重新加载的属性是配置数据的良好模式。 – Dennys