2011-11-21 3 views
1

저는 처음으로 JMS를 사용하고 있으며 Glassfish 3.1.1을 사용하고 있습니다.JMS/Glassfish - 대기열 메시지를 사용하지 않는 MDB

Pool Name: jms/QueueConnectionFactory 
JNDI Name: jms/QueueConnectionFactory 
Resource Type: javax.jms.QueueConnectionFactory 

과 대상 자원 : 내가 파일을 받아이를 분석하고 데이터베이스에 내용을 저장하는 서블릿과 전쟁을 배포 한

JNDI Name: jms/ProcessBatchQueue 
Physical Destination: ProcessBatchQueue 
Resource Type: javax.jms.Queue 

나는 JMS 연결 팩토리를 설정 한 . 내가 대기열을 듣고 메시지 actioning해야 MDB와 배포 된 귀를 가지고

@Resource(lookup = "jms/ProcessBatchQueue") 
private Queue processBatchQueue; 

private void sendProcessBatchMessage(String batchID) throws JMSException 
{ 
    log.info("Attempting to send process batch message for batch ID: " 
      + batchID); 

    Connection jmsConnection = connectionFactory.createConnection(); 
    Session jmsSession = jmsConnection.createSession(false, 
      Session.AUTO_ACKNOWLEDGE); 

    TextMessage message = jmsSession.createTextMessage(); 
    message.setText(batchID); 

    MessageProducer msgProducer = jmsSession.createProducer(processBatchQueue); 
    msgProducer.send(message); 

    jmsConnection.close(); 
} 

:이 모든 성공하면이 큐에 메시지 전송에

@MessageDriven(mappedName = "jms/ProcessBatchQueue") 
public class BatchReceiver 
{ 
    private final Logger log = LoggerFactory.getLogger(BatchReceiver.class); 

    public void onMessage(Message message) 
    { 
     log.info("Received message from jms/ProcessBatchQueue: " + message); 

     try 
     { 
      if (message instanceof TextMessage) 
      { 
       String batchId = ((TextMessage) message).getText(); 
       // do processing 
      } 
      else 
      { 
       log.error("Received invalid message type from jms/ProcessBatchQueue"); 
      } 
     } 
     catch (Exception ex) 
     { 
      String error = "Received error '" + ex.toString() 
        + "' retrieving message from jms/BatchProcessingTopic."; 

      Throwable linkedEx = ex.getCause(); 

      if (linkedEx != null) 
      { 
       log.error(error += "Linked exception: " + linkedEx.getMessage(), 
        linkedEx); 
      } 
      else 
      { 
       log.error(error + ", " + ex.getMessage(), ex); 
      } 
     } 
    } 
} 

을 내 전쟁 로그, 나는

log.info("Attempting to send process batch message for batch ID: " + batchID); 

문을 얻을 수 있지만, 귀 로그에, 나는 MDB가 메시지를 받고 있음을 나타냅니다 아무것도 얻을 수 없다.

내 이해는 "그냥"MDB와 귀를 배포 할 수 있어야하며 메시지를 받기 시작합니다. 놓친 구성 단계가 있습니까?

서블릿에서 생성 된 메시지가 처음에 대기열에 있는지 확인하는 방법이 있습니까? server.log를 포함하여 모든 로그에 오류가 없습니다.

답변

2

빈은 javax.jms.MessageListener을 구현하지 않으며 단지 동일한 서명을 가진 onMessage() 메소드를 가지고 있습니다.

그것은이 자바 EE 필요 않다면이 경우 어쨌든 인 경우 6을 참조하면 주석의 activationConfig 부분을 그리워하지만 잘 모르겠어요 가능성도

:

@MessageDriven(
    activationConfig = { 
      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
      @ActivationConfigProperty(propertyName = "destination", propertyValue = "ProcessBatchQueue")}, 
    mappedName = "jms/ProcessBatchQueue") 
+0

안녕하세요 제안에 대한 감사 . 실제로 메시지를 사용하고있었습니다 (저는 매우 유용한 imqcmd 유틸리티에 대해 배웠습니다). 이 문제는 로깅과 관련이 있습니다. log4 설정 파일은 ejb jar에서 귀에 옮겨졌고 로깅을 잃어서 메시지를 소비하지 않는 것처럼 보였습니다. 누락 된 MessageListener 인터페이스를 제대로 파악합니다. 거기에 없었더라도 아무 것도 영향을 미치지 않았지만 추가했습니다. – sdoca

관련 문제