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는 끝점 간에 큐를 공유해야 하는 경우 동기 consumers .receive()
메서드를 사용해야 합니다. 이 시나리오에서는 MessageListener
가 메시지 선택기를 사용하여 메시지를 필터링해야 합니다. 메시지 선택기를 미리 알아야 하므로 MessageListener
는 한 번만 열립니다.
메시지 선택기를 미리 알 수 없는 두 가지 경우를 피해야 합니다.
JMSMessageID
를JMSCorrelationID
로 사용하는 경우JMS 속성
useConduitIdSelector
및conduitSelectorPrefix
가 JMS 전송에 설정되지 않은 경우 클라이언트는JMSCorrelationId
를 설정하지 않습니다. 이로 인해 서버가 요청 메시지의JMSMessageId
를JMSCorrelationId
로 사용합니다.JMSMessageID
를 미리 알 수 없으므로 클라이언트는 동기Consumer.receive()
메서드를 사용해야 합니다.IBM JMS 끝점(기본값)과 함께
Consumer.receive()
메서드를 사용해야 합니다.사용자는 요청 메시지에서
JMStype
을 설정한 다음 사용자 지정JMSCorrelationID
를 설정합니다.사용자 지정
JMSCorrelationID
를 미리 알 수 없으므로 클라이언트는 동기식Consumer.receive()
메서드를 사용해야 합니다.
따라서 일반적인 규칙은 동기 수신을 사용해야 하는 설정을 사용하지 않는 것입니다.