1. ホーム
  2. spring-boot

[解決済み] 宛先の JMS 接続を更新できませんでした。原因:認証に失敗

2022-02-09 09:12:54

質問

コマンドラインからリスニングしようとするとうまくいくのですが、Spring Bootを使用すると以下のエラーが出ます。

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

これは私のアプリのクラスです

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

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

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);
    }
}

このクラスは ems をリスンし、メッセージを消費します。

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

これらのクレデンシャルはコマンドライン上で問題なく動作するので、クレデンシャルに問題はないはずです。おそらく、いくつかの設定が足りないからでしょう(確かではありませんが)。何が問題なのか、解決していただけませんか?

解決方法は?

このコードは正常に動作しますが、scanBasePackageの設定にSubscriberConfigurationのパッケージを追加するのを失念していました。