在SpringJMS主题中分配名称

在SpringJMS主题中分配名称,spring,spring-boot,spring-jms,wso2mb,Spring,Spring Boot,Spring Jms,Wso2mb,我正在使用SpringJMS连接到WSO2MB服务器。一切正常,但所有侦听器都分配了相同的id。为了使其唯一,我提供了clientId,但它不起作用。我找不到任何其他可以提供名称的字段 我甚至在JMS侦听器上提供了id,但没有成功 @Bean @ConditionalOnProperty(name="my.listener.active", matchIfMissing = true) public JmsListenerContainerFactory jmsListenerContainer

我正在使用SpringJMS连接到WSO2MB服务器。一切正常,但所有侦听器都分配了相同的id。为了使其唯一,我提供了clientId,但它不起作用。我找不到任何其他可以提供名称的字段

我甚至在JMS侦听器上提供了id,但没有成功

@Bean
@ConditionalOnProperty(name="my.listener.active", matchIfMissing = true)
public JmsListenerContainerFactory jmsListenerContainerFactory(@Qualifier("listenerConnectionFactory") ConnectionFactory connectionFactory) throws URLSyntaxException {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setClientId("listener"+listenerTopic);
    if (Boolean.valueOf(listenerTopic)) {
        factory.setSubscriptionDurable(true);
        factory.setPubSubDomain(true);
    }
    return factory;
}

@JmsListener(destination = "${default-queue-name-to-listen}", id = "${default-queue-name-to-listen}")
public void receiveMessage(final Message<T> message) throws JMSException {
}
@Bean
@ConditionalOnProperty(name=“my.listener.active”,matchIfMissing=true)
公共JmsListenerContainerFactory JmsListenerContainerFactory(@Qualifier(“listenerConnectionFactory”)ConnectionFactory ConnectionFactory)抛出URLSyntaxException{
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
工厂。设置连接工厂(连接工厂);
setClientId(“侦听器”+侦听器主题);
if(Boolean.valueOf(listenerTopic)){
factory.setSubscriptionDurable(true);
factory.setPubSubDomain(true);
}
返回工厂;
}
@JmsListener(destination=“${default queue name to listen}”,id=“${default queue name to listen}”)
public void receiveMessage(最终消息)引发JMSException{
}

每个连接都需要有一个唯一的
客户端ID

void org.apache.activemq.ActiveMQConnectionFactory.setClientID(字符串 客户ID)

设置用于创建的连接的JMS客户端ID。 请注意,这通常只能由一个连接一次使用 最好在连接上设置clientID


您的解决方案是使用
org.springframework.jms.connection.SingleConnectionFactory
订阅名称使连接名称唯一并解决了我的问题

@JmsListener(
        destination = "${default-queue-name-to-listen}",
        subscription = "${default-queue-name-to-listen}"
    )
    public void receiveMessage(Message<T> message) throws JMSException {}
@JmsListener(
destination=“${要侦听的默认队列名称}”,
subscription=“${要侦听的默认队列名称}”
)
public void receiveMessage(Message Message)引发JMSException{}

应用程序重新启动后是否需要使用相同的id??这就是问题所在。如果没有,您可以添加“listener”+listenerTopic+System.currentTimeMillis(),我希望每个服务都有相同的名称,因此即使多个实例正在运行,它们也将共享相同的名称。但是不同的服务应该有不同的名称我已经在设置clientId:factory.setClientId(“listener”+listenerTopic);是的,但是如果您创建了多个连接,这将失败,但是SingleConnectionFactory只创建一个连接,您可以使用SingleConnectionFactory.setClientId(“侦听器”+listenerTopic);好的,我会尝试一下,虽然我不确定它会产生什么影响,因为我使用docker,多个实例仍然会创建其中一个。目前,我有一些服务器问题,所以一旦解决,我会尝试这个。感谢抱歉,我不明白您有多个应用程序实例,在这种情况下,我的解决方案将不会像这样工作,因此您可以使用propertyplaceholder从文件属性中注入的SingleConnectionFactory将主机名或实例id添加到客户端id