2017-11-09 23 views
0

작동하지 않습니다아파치 QPID JMS 클라이언트 설정 프리 페치 내가 이와 같은 URI로 구성된 <code>JmsConnectionFactory</code>이

failover:(amqps://11.22.33.44?amqp.idleTimeout=120000&transport.tcpKeepAlive=true&jms.prefetchPolicy.all=10)?failover.maxReconnectAttempts=20

주 공식 documentation

에 따라 jms.prefetchPolicy.all=10 매개 변수

... 원격 피어가 클라이언트에 보낼 수있는 메시지의 수를 제어하고 각 소비자에 대한 프리 페치 버퍼에 보관합니다. 인스턴스.

그래서 클라이언트에 버퍼링 된 메시지가 10 개를 초과하지 않아야합니다. 맞습니까? 글쎄, 그건 작동하지 않습니다.

나는 정기적으로 MessageQueue.size()JmsMessageConsumer 각각의 인쇄 반사를 사용하여 종료했습니다

MessageConsumer messageConsumer = ... 
Field field = JmsMessageConsumer.class.getDeclaredField("messageQueue"); 
field.setAccessible(true); 
MessageQueue q = (MessageQueue) field.get(messageConsumer); 
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> System.out.println(q.size()), 10, 10, TimeUnit.SECONDS); 

그리고 내 메시지 핸들러 (또는 차단) 속도가 느린 경우, 나는 약간 덜 1000 이상의 메시지 큐 크기를 참조, 이는 기본 프리 페치 크기입니다.

그래서 버그입니까? 그리고 다른 프리 페치 크기를 설정하는 방법은 무엇입니까?

나는 qpid-jms-client 버전 0.27.0을 사용하고 있습니다.

답변

1

, 그것은해야한다 : 그들은 장애 복구 옵션과 함께 URI의 가장 바깥 쪽 부분에 적용되도록

failover://(amqps://11.22.33.44?amqp.idleTimeout=120000&transport.tcpKeepAlive=true) 
    ?jms.prefetchPolicy.all=10&failover.maxReconnectAttempts=20 

은 JMS 옵션은 글로벌 있습니다. 래핑 된 AMQP 연결 URI에는 각 특정 연결을 제어하는 ​​전송 옵션 만 포함됩니다.

+0

아, 그게 설명해. 나는 나중에 그것을 시도 할 것이다. – Malt

0

알아 냈어.

JmsConnectionFactoryJmsPrefetchPolicy입니다. 나는 URI 매개 변수를 사용하여 설정해야하는데 표시되지 않습니다,하지만이 같은 JmsConnectionFactory.setPrefetchPolicy()를 사용하여 설정할 수 있습니다 :

JmsConnectionFactory cf = ... 
JmsDefaultPrefetchPolicy prefetchPolicy = new JmsDefaultPrefetchPolicy(); 
prefetchPolicy.setAll(123); // Set prefetch size here 
cf.setPrefetchPolicy(prefetchPolicy); 

이 어디 문서화 보지 못했다. 귀하의 URI가 잘못된