1

我将 jms 与 jboss/wildfly (jee6) 一起使用。

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

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

现在我想实现一个中央无状态 Bean,它可以注入所有队列,并提供一个字符串参数化方法以类似工厂的方式检索队列:

@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) 并在不同的位置 (Beans) 检索它们 (MessageConsumer)。我已经尝试过这个实现,它似乎工作。

我的问题是有人看到这有什么问题吗?这会导致不稳定吗?我应该改用 jndiLookup 吗?有没有更好/更简单的方法?或者这很好而且可能:-)?

谢谢菲利普

4

1 回答 1

1

在您的代码中,您设法集中了资源声明/注入,但在您的使用站点上,您仍然需要单独处理每个队列。所以与直接注入相比并没有多少收获。


似乎您正在尝试将队列数组资源注入一起使用,但在这种情况下资源注入并不能真正扩展:每个新队列都需要部署。

在您的情况下,我建议在迭代中使用手动 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 查找可扩展,因为不需要支持额外队列的部署。

于 2013-08-12T17:19:21.787 回答