我实现了一个无状态会话Bean,它将消息发送到不同的消息队列。目前有两个不同的队列,但数量可能会增长。
目前队列是硬编码的:
@Stateless
public class SendNotificationBean implements SendNotification {
private static final Logger logger = LoggerFactory.getLogger(SendNotificationBean.class);
@Resource(lookup = "java:jboss/MQ.CONNECTIONFACTORY.JMS.A")
private ConnectionFactory connectionFactoryA;
@Resource(lookup = "java:jboss/MQ.CONNECTIONFACTORY.JMS.B")
private ConnectionFactory connectionFactoryB;
@Resource(lookup = "java:jboss/MQ.A")
private Queue queueA;
@Resource(lookup = "java:jboss/MQ.B")
private Queue queueB;
private Connection connectionA;
private Connection connectionB;
private MessageProducer producerA;
private MessageProducer producerB;
private Session sessionA;
private Session sessionB;
//...
}
是否可以动态加载队列?类似的东西:
Queue queue = getQueueDependingOfConfiguration(QueueType.A);
我认为这是可能的,但这也有意义吗?我还需要考虑什么?那么我是否必须将ConnectionFactory和/或Session存储在Map中?
谢谢,
麦克
答案 0 :(得分:1)
您始终可以使用旧的JNDI InitialContext查找:
public Queue getQueueByName(String name) {
Context ctx = new InitialContext();
return ctx.lookup("java:jboss/MQ." + name);
}
QueueConnectionFactory也可以这样做。 但是,这种方法有其自身的缺点,因为处理JNDI对象的正确方法是将其添加到组件JNDI环境中(java:comp / env stuff)。
不建议在Map中存储QueueConnectionFactory或Queue实例 - 如果您在需要时获得对这些对象的引用,则可以安全地使用它。