请协助解决上述错误,我不太熟悉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());
}
}
}
setClientId(String clientId)
是DefaultJmsListenerContainerFactory
的一种方法。设置一个有意义的 ID 来标识您的持久订阅应用程序。
请确保您了解此 clientId 的用途。 如果您的应用程序以多个实例启动,则使用相同 ClientId 的所有实例将仅创建一个持久订阅,因此每条消息将仅由其中一个实例使用。 所有使用不同 ClientId 的应用程序都将创建自己的持久订阅,因此每个应用程序将收到每条消息的副本。