您必须为连接指定唯一的 clientID 才能使用 DurableSubscriber

问题描述 投票:0回答:1

请协助解决上述错误,我不太熟悉JMS,但我正在编写一个 Spring Boot 侦听器项目来消费

Azure service Bus
上的消息,以便稍后将它们发送到另一个系统。我在下面的 JMS 配置 bean 中建立了与主题的连接,还编写了侦听器来侦听主题中的消息并使用它们,请参阅下面的代码快照。我没有遇到此错误:目标“sfm-messages-dev”的 JMS 消息侦听器调用程序设置失败 - 尝试恢复。原因:您必须为连接指定唯一的 clientID 才能使用 DurableSubscriber。我尝试了不同的选项,但仍然可以解决它,有人可以帮忙,可能我需要使用不同的类或库,我还不确定,但会接受任何帮助。

代码片段:



import jakarta.jms.ConnectionFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.stereotype.Component;

@Component
@EnableJms
@Slf4j
public class JmsConfig {

    @Bean
    @ConditionalOnMissingBean(name = "topicJmsListenerContainerFactory")
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(DefaultJmsListenerContainerFactoryConfigurer Configure, ConnectionFactory connectionFactory) {
        log.info("Establishing connection....");
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        Configure.configure(factory, connectionFactory);
        return factory;
    }
}


Listener class below

package com.comoanyxyz.service;

import com.comoanyxyz.config.AzureMessageBrokerConfigs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;

@Component
@Slf4j
public class MessageConsumerService {

    @Autowired
    private SfmService sfmService;

    @JmsListener(destination = "sfm-messages-dev", subscription = "sfm-dev-sub-messages", containerFactory = "topicJmsListenerContainerFactory")
    public void onMessage(String message){

        try {
            log.info("Getting messages: {} ", message);
            log.info(InetAddress.getLocalHost().getHostName() + " - consumed :" + "TODO: Measure Date" +" at "+ new Date());
        }catch (RuntimeException | UnknownHostException e){
            log.info("Exception occurred in message: "+e.getMessage());
        }
    }
}
java spring-boot jms azureservicebus
1个回答
0
投票

setClientId(String clientId)
DefaultJmsListenerContainerFactory
的一种方法。设置一个有意义的 ID 来标识您的持久订阅应用程序。

请确保您了解此 clientId 的用途。 如果您的应用程序以多个实例启动,则使用相同 ClientId 的所有实例将仅创建一个持久订阅,因此每条消息将仅由其中一个实例使用。 所有使用不同 ClientId 的应用程序都将创建自己的持久订阅,因此每个应用程序将收到每条消息的副本。

© www.soinside.com 2019 - 2024. All rights reserved.