Возможно ли использование нескольких клиентов в шершне? - PullRequest
2 голосов
/ 14 июня 2011

В моем клиентском приложении я создаю несколько потребителей, но они не могут одновременно обрабатывать очередь.Всегда только один потребитель обрабатывает сообщения очереди.Я не знаю почему.

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

Как мне обработать очередь с несколькими одновременными потребителями?

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Думайте об этом как 1 к 1 между потоками и сессиями.(Соединения безопасны для потоков, все, что «внизу» - нет).Короче говоря, создайте несколько потоков, пусть каждый поток создаст сеанс и т. Д. И каждый поток будет потреблять.

1 голос
/ 28 августа 2012

При просмотре вашего кода переменная consumer получает переназначенные различные объекты-потребители в цикле for, что может привести к потере ссылок на более ранние объекты-потребители и сборке мусора.Только один потребительский объект останется живым - тот, который был создан последним в цикле for - чья ссылка поддерживается переменной consumer, и он будет поглощать все поступающие сообщения.

...