无法刷新目标的 JMS 连接原因:身份验证失败

Could not refresh JMS Connection for destination Cause: Authentication failed

当我尝试通过命令行收听时它工作正常,但使用 Spring 启动它抛出以下错误:

ERROR [org.springframework.jms.listener.DefaultMessageListenerContainer] (DefaultMessageListenerContainer-1) Could not refresh JMS Connection for destination 'wfQueue' - retrying using FixedBackOff{interval=5000, currentAttempts=44, maxAttempts=unlimited}. Cause: authentication failed
javax.jms.JMSSecurityException: authentication failed

这是我的应用程序class

@SpringBootApplication(scanBasePackages = {"com.source.lbm"})
public class EMSConsumerApp {

    public static main(String[] args){
        run(EMSConsumerApp.class, args);         
    }
}

此 class 配置 JMS 消费者的定义

@EnableJMS
@EnableTransactionManagement
public abstract class SubscriberConfiguration {
    private final String url;
    private final String clientId;
    private final String username;
    private final String password;

    public SubscriberConfiguration(String url, String clientId, String username, String password) {
        this.url = url;
        this.clientId = clientId;
        this.username = username;
        this.password = password;
    }
    
    @Bean
    public DefaultJmsListenerContainerFactory jsmListenerContainerFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory containerFactory = new DefaultJmsListenerContainerFactory();
        containerFactory.setconnectionFactory(connectionFactory);
        containerFactory.setPubSubDomain(true);
        containerFactory.setSubscriptionDurable(true);
        containerFactory.setSessionTransacted(true);
        containerFactory.setAutoStartup(true);
    
        return containerFactory;
    }
        
    @Bean
    public ConnectionFactory jmsConnectionFactory() throws JMSException{
        TibjmsXATopicConnectionFactory connectionFactory = new TibjmsXATopicConnectionFactory();
        connectionFactory.setServerUrl(url);
        connectionFactory.setClientId(clientId);
        connectionFactory.setUserName(username);
        connectionFactory.setUserPassword(password);
        return connectionFactory;        
    }
        
}

这会为订阅者设置配置

@Configuration
public class LbmSubConfiguration extends SubscriberConfiguration {

    public LbmSubConfiguration(
        @Value("${ems.lbm.sub.url}") String emsUrl;
        @Value("${ems.lbm.sub.clientId}") String subClientId;
        @Value("${ems.lbm.sub.username}") String subUsername;
        @Value("${ems.lbm.sub.password}") String subPasword) {
    super(emsUrl,subClientId,subUsername,subPasword);
    }
}

这个class监听ems并消费消息

@Component
public class LbmEventConsumer {
    @JmsListener(destination = "${ems.lbm.sub.destination}", containerFactory = "jmsListenerContainerFactory")
    public void onMessage(BytesMessage message){
      System.out.println("Message " + message);
    }
}

由于这些凭据在命令行上工作正常,因此凭据应该没有问题。可能是因为我缺少一些配置(虽然不确定)。你能帮我弄清楚这是怎么回事吗?

看看@JmsListener

@JmsListener(destination = "${ems.lbm.sub.destination}", 
             containerFactory = "jmsListenerContainerFactory")

您已将“jmsListenerContainerFactory”设置为“jmsConnectionFactory”

@JmsListener(destination = "${ems.lbm.sub.destination}", 
             containerFactory = "jmsConnectionFactory")

这段代码可以正常工作,我错过了在 scanBasePackage 配置中添加 SubscriberConfiguration 的包。