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
는 한 번만 열립니다.
메시지 선택기를 사전에 알 수 없는 두 가지 경우는 피해야 합니다.
JMSMessageID
가JMSCorrelationID
로 사용되는 경우JMS 속성이
ConduitIdSelector 및
경우 클라이언트는conduitSelectorPrefix
를 사용하는JMSCorrelationId
를 설정하지 않습니다. 이로 인해 서버에서 요청 메시지의JMSMessageId
를JMSCorrelationId
로 사용합니다.JMSMessageID
를 사전에 알 수 없기 때문에 클라이언트는 synchronousConsumer.receive()
메서드를 사용해야 합니다.IBM JMS 엔드포인트(기본값
)에서 consumers.receive()
메서드를 사용해야 합니다.사용자는 요청 메시지에
JMStype
을 설정한 다음 사용자 지정JMSCorrelationID
를 설정합니다.사용자 지정
JMSCorrelationID
를 사전에 알 수 없기 때문에 클라이언트는 동기소비자.receive()
메서드를 사용해야 합니다.
따라서 일반적인 규칙은 동기 수신을 사용해야 하는 설정을 사용하지 않는 것입니다.