14.3. 클라이언트-Side JMS 성능 최적화

14.3.1. 개요

두 가지 주요 설정은 풀링 및 동기 수신이라는 클라이언트의 JMS 성능에 영향을 미칩니다.

14.3.2. 풀링

클라이언트 측에서 CXF는 각 메시지에 대해 새로운 JMS 세션 및 JMS 생산자를 생성합니다. 이는 세션과 생산자 오브젝트가 모두 스레드 안전하지 않기 때문입니다. 생산자 생성은 서버와 통신해야 하므로 특히 시간이 많이 사용됩니다.

연결 팩토리를 풀링하면 연결, 세션 및 생산자를 캐시하여 성능이 향상됩니다.

ActiveMQ의 경우 풀링을 구성하는 것이 간단합니다. 예를 들면 다음과 같습니다.

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.pool.PooledConnectionFactory;

ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
PooledConnectionFactory pcf = new PooledConnectionFactory();

//Set expiry timeout because the default (0) prevents reconnection on failure
pcf.setExpiryTimeout(5000);
pcf.setConnectionFactory(cf);

JMSConfiguration jmsConfig = new JMSConfiguration();

jmsConfig.setConnectionFactory(pdf);

풀링에 대한 자세한 내용은 Red Hat JBoss Fuse 트랜잭션 가이드의 "Appendix A Optimizing Performance of JMS Single- and Multiple-Resource Transactions"를 참조하십시오.

14.3.3. 동기 수신 방지

요청/복합의 경우 JMS 전송에서 요청을 보낸 다음 응답을 기다립니다. 가능한 경우 요청/응답 메시징은 JMS MessageListener 를 사용하여 비동기적으로 구현됩니다.

그러나 엔드포인트 간에 큐를 공유해야 하는 경우 CXF는 동기 소비자.receive() 메서드를 사용해야 합니다. 이 시나리오에서는 메시지 선택기를 사용하여 메시지를 필터링하기 위해 MessageListener 가 필요합니다. 메시지 선택기를 사전에 알고 있어야 하므로 MessageListener 는 한 번만 열립니다.

메시지 선택기를 사전에 알 수 없는 두 가지 경우는 피해야 합니다.

  • JMSMessageIDJMSCorrelationID로 사용되는 경우

    JMS 속성이 ConduitIdSelector 및 conduitSelectorPrefix 를 사용하는 경우 클라이언트는 JMSCorrelationId 를 설정하지 않습니다. 이로 인해 서버에서 요청 메시지의 JMSMessageIdJMSCorrelationId 로 사용합니다. JMSMessageID 를 사전에 알 수 없기 때문에 클라이언트는 synchronous Consumer.receive() 메서드를 사용해야 합니다.

    IBM JMS 엔드포인트(기본값 )에서 consumers.receive() 메서드를 사용해야 합니다.

  • 사용자는 요청 메시지에 JMStype 을 설정한 다음 사용자 지정 JMSCorrelationID 를 설정합니다.

    사용자 지정 JMSCorrelationID 를 사전에 알 수 없기 때문에 클라이언트는 동기 소비자.receive() 메서드를 사용해야 합니다.

따라서 일반적인 규칙은 동기 수신을 사용해야 하는 설정을 사용하지 않는 것입니다.