2016-05-31 2 views
0

대기열에서 사용할 수있는 새 메시지가 나올 때까지 기다렸다가 곧바로 처리해야한다고 가정 해 보겠습니다. 트랜잭션 전달과 관련된 요구 사항은 없습니다.Spring에서 빠른 JMS 소비 JmsTemplate

JmsTemplate#receive은 매우 편리하지만 성능면에서 좋으면 분명하지 않습니다. 솔직히 말해서 꽤 느린 것처럼 보였습니다.

내 생각 엔 동일한 초기화 작업이 각 호출마다 실행되기 때문에 속도가 느린 것 같습니다. 그래서 훨씬 빠른 것으로 나타났다 connectin, 목적지와 소비자를 재사용, 그것은 다음의 방법을했습니다 :

private void startAsyncReceiver(final BlockingQueue<String> localQueue, final String remoteQueueName) { 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      jmsTemplate.execute(new SessionCallback<Object>() { 
       @Override 
       public Object doInJms(Session session) throws JMSException { 
        try { 
         Destination destination = destinationResolver.resolveDestinationName(session, remoteQueueName, false); 
         MessageConsumer consumer = session.createConsumer(destination); 
         sessionsStartedLatch.countDown(); 
         while (true) { 
          Message message = consumer.receive(MAX_VALUE); 
          String body = (String) jmsTemplate.getMessageConverter().fromMessage(message); 
          localQueue.put(body); 
         } 
        } catch (InterruptedException e) { 
         return null; 
        } 
       } 
      }, true); 
     } 
    }, remoteQueueName + "-Receiver"); 
    t.setDaemon(true); 
    t.start(); 
} 

Q1 : JmsTemplate#receive 악화 performabce가 동일한 알고리즘에 대한 결과를 보여 주었다 왜 어떤 생각? 내가 놓친 게 있니?
질문 2 : 현재 구현에서 발생할 수있는 문제가 있습니까?

답변

2

템플릿은 수신 할 때마다 소비자를 만들어야합니다.

캐시 소비자가 true로 설정된 캐싱 연결 팩토리를 사용하는 경우 JmsTemplate 성능이 현저히 향상되어야하며 코드에 접근해야합니다.

하지만 구현에 문제가 없습니다.

+0

답장을 보내 주셔서 감사합니다. 각각의'consumer.receive()'다음에'session.commit()'을 사용하여 JMS 측에있는 자원을 해제해야할까요? –

+0

거래를 사용하는 경우에만. –