시나리오 - 대기열에 메시지 개체가 있습니다. 큐가 폴링되고 메시지가 메시지 처리기로 전달됩니다. 메시지 검색 (폴링)은 클라이언트 로그인 이벤트 (하나 이상)에서 중지되어야합니다. Joshua Bloch의 조언에 따르면 동시 유틸리티의 출현과 함께 성가신 대기/통지 메커니즘을 사용할 이유는 거의 없습니다. 나는 어떤 싱크로 나이저 (세마포어, 사이 클릭 장벽, 카운트 다운 래치)가 나의 목적에 맞는지에 대한 선택을 할 수 없다. 어떤 충고라도 받아 들였다.Java 동기화 자
-1
A
답변
1
해지가 즉시 필요하지 않은 경우 "독약"패턴을 사용할 수 있습니다. 사용자가 로그인하면 대기열에 특수한 "종료"객체를 배치합니다. 대기열을 폴링 할 때 해당 특수한 고유 한 객체가 있는지 확인하십시오. 예 :
public static final Message POISON_PILL = new Message();
...
in your loop {
Message message = queue.take();
if (message == POISON_PILL) // note usage of == here!
stopTheQueue();
else
normalProcessing(message);
}
즉, 사용자가 로그인하기 전에 있던 모든 메시지가 대기열에서 처리됩니다. 이는 원하는 것일 수 있습니다.
정지가 즉각 일 필요가있는 경우 Thread.interrupted()
As described here을 확인하십시오. 이를 위해서는 로그인 핸들러가 어느 스레드가 큐를 처리하고 커플 링을 증가시키는지를 알아야합니다. 그래서 "독약"은 결합력이 적어서 좋습니다.
정말 코드가 필요합니다. 어떤 종류의 대기열입니까? 예를 들어, [JMS 메시지 대기열] (http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html)을 참조 할 수 있습니다. 그러나 나는 생각하지 않습니다. – markspace
@markspace 메시지는 JMS 대기열에서 가져 오지만 LinkedList (비동기 처리 용)에 배치됩니다. 지금 내가 언급 한 대기열은 LinkedList입니다. –
JMS는 비동기 소비를 위해 설계되었습니다. JMS 대기열에서 메시지를 보내지 않는 이유는 무엇입니까? –