2017-04-10 6 views
0

MDB에서 메시지를 수신 할 때 이벤트를 생성하고 처리하려고합니다. 여기에 내가 뭘하는지입니다 :메시지 구동 Bean에서 이벤트가 작동하지 않습니다.

public class MDBBooks implements MessageListener { 
@Inject 
private Event<Update> messageReceived; 

public MDBLibri() { 
} 

@Override 
public void onMessage(Message message) { 
    System.out.println("Message received"); 
    try { 
     Update u = message.getBody(Update.class); 
     messageReceived.fire(u); 
     if(u != null){ 
      ... stuff   
     } 
    } catch (JMSException ex) { 
     System.out.println("JMSException: " + ex.getMessage()); 
    } 
} 

public void eventHandler(@Observes Update up) { 
    System.out.println("There was an update"); 
} 

} 

을하지만 그냥 작동하지 않는, 문자열는 글래스 피쉬 콘솔에 인쇄되지 것 "업데이 트가 있었다". 나는 정말로 문제가 무엇인지 말할 수 없다. 나의 교과서는 같은 방식으로 그렇게한다. 나는 이벤트가 제대로 작동한다고 가정하고 있지만 이벤트 핸들러는 알리지 않습니다.

답변

2

옵저버 방법이 알림을받지 않았다고 정확합니다. 사실, CDI는 그것이 존재하는지조차 모릅니다. 그 이유는 CDI에서 메시지 구동 Bean은 비 문맥 객체이기 때문입니다. 단순화하기 위해 CDI 빈은 고려되지 않지만 여전히 CDI 빈에 삽입하여 가로 챌 수 있습니다.

이제, CDI가 관찰자 메소드를 인식하기 위해 이되었으므로 관리 Bean 또는 세션 Bean에 배치해야합니다. 스펙 인용 :

관찰자 메소드는 관리 Bean 클래스 또는 세션 Bean 클래스 (또는 컨테이너 라이프 사이클 이벤트에 정의 된 확장자)의 추상화되지 않은 메소드입니다.

따라서 관찰자 메소드를 관리 Bean 또는 세션 Bean 인 다른 클래스에 배치하는 것이 해결책입니다.

+0

[관련이없는 질문] (구현과 함께) 비슷한 답변이 있습니다 (http://stackoverflow.com/questions/43111276/observable-pattern-in-remote-ejb/43120204#43120204) –

+0

글쎄 .. OP가 필요로하는 전체 "구현"은 관찰자 방법을 다른 클래스로 이동시키는 것입니다. – Siliarus

+0

사실, 내 의견은 OP가보기에 뭔가 의도 된 것일뿐입니다. 귀하의 대답은 꽤 정확하고 그에 따라 적절하게 찬성했습니다. –