无法刷新目标的 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 的包。
当我尝试通过命令行收听时它工作正常,但使用 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 的包。