2016-08-17 9 views
1

WildFly 8.2 (JMS 공급자 HornetQ 사용)에서 JMS 대기열을 만들고이 대기열에서 메시지 구동 Bean을 활성화하면 생산자가 연속적으로 대기열에 여러 메시지를 보내면 메시지 구동 Bean은 전송 된 순서대로 반드시 처리하지 않습니다. 메시지가 전송 된 순서대로 처리되도록 WildFly를 구성 할 수 있습니까?WildFly, FIFO에서 MDB로 메시지 대기열을 처리하는 방법이 있습니까?

답변

2

는 (I는 https://stackoverflow.com/a/6744508/999264을 읽은 후 발생하는 이해 생각)

여러 메시지가 도착하면, 따라서 메시지 구동 Bean (MDB), 메시지 당 하나 개의 스레드의 onMessage 방법을 실행하고 여러 스레드가 있습니다 거의 동시에, 어떤 메시지가 먼저 처리 될지 알 수 없습니다 (스레드 중 어느 것이 onMessage 실행을 먼저 완료하는지 알 수 없으므로). 이를 알 수있는 유일한 방법은 스레드 수가 1인지 확인하는 것입니다.이 경우 유일한 스레드는 첫 번째 메시지를 먼저 처리 한 다음 두 번째 메시지를 처리합니다.

WildFly와 JBoss에서 주석 @MessageDriven은 "활성화 구성 속성"maxSession을 가지고 있습니다.이 항목은 대기열에서 MDB로 도착하는 메시지를 처리하는 데 사용되는 최대 스레드 수를 제어합니다.

@MessageDriven(activationConfig = { 
       @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/jms/queue/myOwnQueue"), 
       @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
       @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1")}) 
public class MyOwnMDB implements MessageListener { 

    public void onMessage(Message message) { 
     System.out.println("message received " + message.toString()); 
    } 

} 

아래로, 값을 1로 설정하고 코드를 실행, 나는 참으로 메시지가 전송 된 순서대로, 메시지 구동 빈에 의해 처리되고있는 것을 알 수있다.

원본 제목 인 의 "WildFly FIFO에 메시지 대기열을 만드는 방법이 있습니까?"이 올바르지 않습니다 : 큐 자체 FIFO입니다. 실제로 정확한 위치를 정확히 찾을 수는 없지만 실제로는 JMS 스펙의 일부입니다.

+0

https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/5/html/HornetQ_User_Guide/ch30s03.html – 99Sono