2011-06-14 2 views
2

클라이언트 응용 프로그램에서 여러 소비자를 만들지 만 큐를 동시에 처리 할 수는 없습니다. 항상 단일 사용자 만 대기열 메시지를 처리합니다. 나는 이유를 모른다.hornetq에서 여러 클라이언트 소비자가 가능합니까?

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

스레드와 세션간에 1 : 1로 생각하십시오. (연결은 스레드로부터 안전합니다. "아래"는 그렇지 않습니다.) 간단히 말해서, 여러 개의 스레드를 만들고, 각 스레드가 세션 등을 만들도록하십시오. 그리고 각 스레드는 소비 할 것입니다.

+0

대단히 감사합니다. 큰 문제를 해결하도록 도와주세요. – flying

1

코드를 보면 변수가 for 루프의 다른 소비자 객체에 재 할당되어 이전 소비자 객체에 대한 참조가 손실되어 가비지 수집 될 수 있습니다. for 루프에서 마지막으로 생성 된 참조 개체가 consumer 변수에 의해 유지 관리되는 하나의 소비자 개체 만이 활성 상태로 남아 있으며 모든 향후 메시지를 소비합니다.

관련 문제