JMS-Queue-Factory-Bean - >在不同的bean中重用注入的jms队列

时间:2013-08-12 15:48:01

标签: java java-ee jboss jms hornetq

我正在使用带有jboss / wildfly(jee6)的jms。

可以使用以下方法轻松注入JMS队列:

@Resource(name="java:jboss/exported/jms/queue/queuename")
private Queue myQueue;

现在我想实现一个集中注释所有队列的中心无状态Bean,它提供了一个String参数化方法,以便像工厂一样检索队列:

@Resource(name="java:jboss/exported/jms/queue/queuename1")
private Queue myQueue1;

@Resource(name="java:jboss/exported/jms/queue/queuename2")
private Queue myQueue2;

public Queue getQueueIWant(String identifier) {
  if("IdentifyingString".equals(identifier))
  { return myQueue1; }
  if...
}

在另一个Bean内部,这个“FactoryBean”被注入:

@EJB
private MyQueueFactory queueFactory;

并且可以轻松使用:

...
Queue queue = queueFactory.getQueueIWant("AIdentifier");
producer = session.createProducer(queue);
...

检索到的Queue实例将用于将消息发送到队列(MessageProducer)并在不同位置(Bean)检索它们(MessageConsumer)。我尝试过这个实现,似乎可以工作。

我的问题是,是否有人发现此问题? 这会导致不稳定吗? 我应该使用jndiLookup吗? 有更好/更简单的方法吗? 或者这很好,可能:-)?

由于 菲利普

1 个答案:

答案 0 :(得分:1)

在您的代码中,您已设法集中资源解除/注入,但在您的使用站点,您仍需要单独处理每个队列。因此与直接注射相比没有太大的成果。


您似乎尝试使用队列资源注入之类的东西,但在这种情况下资源注入并不真正扩展< / strong>:每个新队列都需要部署。

在您的情况下,我建议在迭代中使用手动JNDI查找。然后,您可以将队列放在数组/列表中以进行进一步处理。您甚至可以将队列数作为参数传递给方法,因此队列数可以在运行时动态更改:

伪代码(未经测试,仅供参考):

InitialContext ic = new InitialContext();
Queue[] qs = new Queue[count];
for (int i = 0; i < count; i++) {
  String name = "queue/queuename" + i;
  qs[i] = (Queue) ic.lookup(name);
}

如果队列名称基于运行时参数(如传入的JMS消息),则JNDI查找将是合适的,因为静态资源注入动态命名冲突不知何故。使用动态JNDI查找比例,不需要作为支持其他队列的部署。