Клиентские сеансы балансировки нагрузки
У меня есть 2-серверный кластер ActiveMQ Artemis с обнаружением с использованием JGroups, работающим правильно. Затем в моих приложениях ConnectionFactory создается через ActiveMQJMSClient:
final ActiveMQConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(
"jgroups://test-cluster?file=jgroups-file-ping.xml&connectionLoadBalancingPolicyClassName=org.apache.activemq.artemis.api.core.client.loadbalance.RoundRobinConnectionLoadBalancingPolicy", "test-cluster");
Затем производители и потребители обрабатываются с весны. Однако, когда Spring запускает 10 потребителей при запуске, я вижу, что все 10 потребителей переходят на один сервер Artemis.
Вот конфигурация Spring JMS:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() throws Exception {
final ConnectionFactory cf = getActiveMQConnectionFactory();
final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(cf);
factory.setConcurrency("10-20");
factory.setSessionTransacted(true);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
Затем при запуске приложения я вызываю это в JmsListenerConfigurer:
public static void registerEndPoint(final JmsListenerEndpointRegistrar registrar,
String endPointName, String dest, MessageListener listener) {
final SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId(endPointName);
endpoint.setDestination(dest);
endpoint.setMessageListener(listener);
registrar.registerEndpoint(endpoint);
}
Есть ли способ настроить это так, чтобы на каждом сервере Artemis было 5 потребителей?
1 ответ
Спринга DefaultJmsListenerContainerFactory
имеет уровень кэша, который можно изменить на CACHE_NONE
,CACHE_CONNECTION
,CACHE_SESSION
или же CACHE_AUTO
,
Я должен был установить его CACHE_NONE
для Spring создать более одного соединения в фабрике соединений.