在我的客户端应用程序中,我创建了几个使用者,但他们无法同时处理队列。始终,只有一个消费者处理队列消息。我不知道为什么。
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
env.put(Context.PROVIDER_URL, "192.168.1.111:1099");
InitialContext ctx = new InitialContext(env);
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("/ConnectionFactory");
Queue downQueue = (Queue) ctx.lookup("queue/DownQueue");
Session consumerSession = conn.createSession(false, Session.CLIENT_ACKNOWLEDGE);
MessageConsumer consumer;
for (int i = 0; i < 2; i++) {
consumer = consumerSession.createConsumer(downQueue, "proxyId=0");
consumer.setMessageListener(listener);
}
如何使用多个并发使用者处理队列?
答案 0 :(得分:2)
在线程和会话之间将其视为1比1。 (连接是线程安全的,“下面”的所有内容都不是)。简而言之,创建多个线程,让每个线程创建一个会话等。每个线程都会消耗。
答案 1 :(得分:1)
通过查看代码,consumer
变量将在for循环中重新分配不同的使用者对象,这可能导致对早期使用者对象的引用丢失和垃圾回收。只有一个使用者对象将保持活动状态 - 最后在for循环中创建的对象 - 其引用由consumer
变量维护,它将消耗所有即将发生的消息。