2014-12-07 3 views
0

ActiveMQ를 내가 ActiveMQ를 액세스하기 위해 스프링을 사용하고 큐에 새 메시지를 추가하기 전에 대기열에서 엿볼려고 4.1.2JMS ActiveMQ를 createBrowser은 항상 비어있는 큐

5.10.0 봄을 반환합니다. 메시지가 성공적으로 추가되었지만 대기열에 아무 것도 표시되지 않습니다. 웹 인터페이스를 통해 내 메시지가 대기열에 대기 중임을 알 수 있습니다.

감사합니다.

@Service 
public class MessageQueueService{ 

    private static final Logger logger = LoggerFactory.getLogger(MessageQueueService.class); 

    @Inject 
    JmsTemplate jmsTemplate; 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public void testAddJob(){ 

     jmsTemplate.send(new MessageCreator() { 

      public Message createMessage(Session session) throws JMSException { 
       IndexJob j1=new IndexJob(); 
       j1.setOperation("post"); 
       ObjectMessage om=session.createObjectMessage(); 
       om.setObject(j1); 
       QueueBrowser qb=session.createBrowser((javax.jms.Queue) jmsTemplate.getDefaultDestination()); 
       Enumeration<Message> messages=qb.getEnumeration(); 
       logger.info("browsing "+qb.getQueue().getQueueName()); 
       int i=0; 
       while(messages.hasMoreElements()) { 
        i++; 
        Message message=messages.nextElement(); 
        logger.info(message+""); 
       } 
       logger.info("total record:"+i); 
       return om; 
      } 

     }); 

} 

출력 :

2014-12-07 00:03:43.874 [main] INFO c.b.b.s.MessageQueueService - browsing indexJob 2014-12-07 00:03:43.878 [main] INFO c.b.b.s.MessageQueueService - total record:0

UPDATE : 실행은 아직 잘 설명하지 파라미터 boolean startConnection있다. "true"로 설정되면 작동하는 것 같습니다.

String result=jms.execute(new SessionCallback<String>() { 

      @Override 
      public String doInJms(Session session) throws JMSException { 
       QueueBrowser queue=session.createBrowser((Queue)session.createQueue("indexJob")); 
       Enumeration<Message> messages=queue.getEnumeration(); 
       String result=""; 
       logger.info("Browse Queue: "+queue.getQueue().getQueueName()); 
       while(messages.hasMoreElements()) { 
        Message message=messages.nextElement(); 
        result+=message; 
       } 
       logger.info(result); 
       return result; 
      } 

     }, true); 

는 send 메소드의 대부분은 startConnection = 거짓으로 execute() 방법을 사용하고, org.springframework.jms.core.JmsTemplate.class 소스를 보면 -이 비록 해결책이 아니다.

연결이 시작되지 않은 경우 메시지가 대기열에 어떻게 추가 되었습니까?

누구나 알고 계신가요? @param startConnection whether to start the Connection?

답변

1

다소 혼란스러운 JMS 비트 일 수 있습니다. 연결 시작은 연결이 아닌 메시지를 소비하는 것을 의미합니다. 원할 때마다 시작하거나 시작할 때마다 메시지를 자유롭게 생성 할 수 있지만 목적지를 소비하거나 탐색하려면 연결을 시작해야합니다. 그렇지 않으면 소비자에게 발송 된 메시지가 수신되지 않습니다.

이 목적은 사용자가 응용 프로그램이 준비되지 않은 상태에서 다른 메시지를 수신하기 전에 모든 JMS 자원을 만들 수있게하는 것입니다.

요약하면 메시지를 탐색하려면 연결이 시작되었는지 확인해야합니다.

+0

감사합니다. @Tim. 이해해. 그래서 메시지를 보낼 때 세션으로 대기열을 탐색 할 수 없습니까? – Jason

+0

시작하지 않으면 안됩니다. –

관련 문제