我正在使用带有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吗? 有更好/更简单的方法吗? 或者这很好,可能:-)?
由于 菲利普
答案 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查找比例,不需要作为支持其他队列的部署。