2

在我的客户端应用程序中,我创建了几个消费者,但他们不能同时处理队列。始终,只有一个消费者处理队列消息。我不知道为什么。

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);
}

如何处理具有多个并发消费者的队列?

4

2 回答 2

2

将其视为线程和会话之间的 1 对 1。(连接是线程安全的,“下面”的一切都不是)。所以简而言之,创建多个线程,让每个线程创建一个会话等。每个线程都会消耗。

于 2011-06-14T10:09:57.820 回答
1

通过查看您的代码,consumer变量在 for 循环中被重新分配了不同的消费者对象,这可能导致对早期消费者对象的引用丢失并被垃圾收集。只有一个消费者对象将保持活动状态——在 for 循环中最后创建的那个——其引用由consumer变量维护,它将消耗所有即将到来的消息。

于 2012-08-28T09:35:39.000 回答