javaspringspring-bootactivemq-classicmq

...factory.UnsatisfiedDependencyException actually of type 'org.springframework.cloud.sleuth.instrument.messaging.LazyTopicConnectionFactory'


So I've been trying to find out solution to this from long ! Any insights would help !

I am getting following error

org.springframework.beans.factory.UnsatisfiedDependencyException: 

Error creating bean with name 

'routerConnectionFactory' defined in class path resource 

[com/CONFIDENTIAL/event/processor/configuration/EventsConfiguration.class]: Unsatisfied dependency expressed through method 'routerConnectionFactory' parameter 0; nested exception is 

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 

'actionRouterConnectionFactory' is expected to be of type 'org.apache.activemq.ActiveMQConnectionFactory' but

 was actually of type 'org.springframework.cloud.sleuth.instrument.messaging.LazyTopicConnectionFactory'

Code snippet

 @Bean(name = "routerConnectionFactory")
    @Primary
    public CachingConnectionFactory routerConnectionFactory(ActiveMQConnectionFactory actionRouterConnectionFactory ){
        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
        cachingConnectionFactory.setTargetConnectionFactory(actionRouterConnectionFactory);
        return  cachingConnectionFactory;

    }

    @Bean
    public ActiveMQConnectionFactory actionRouterConnectionFactory(
            @Value("${confidential.gateway.message.broker.url}") String brokerURL,
            @Value("${confidential.router.message.broker.user.name}") String userName,
            @Value("${confidential.router.message.broker.user.password}") String password,
            @Value("true") Boolean alwaysSyncSend, RedeliveryPolicy defaultEntry,
            @Value("${shared.amq.keystore.path:#{null}}") String keyStorePath,
            @Value("${shared.amq.keystore.password:#{null}}") String keyStorePassword) throws Exception {
        ActiveMQSslConnectionFactory targetConnectionFactory= new ActiveMQSslConnectionFactory();
        targetConnectionFactory.setBrokerURL(brokerURL);
        targetConnectionFactory.setUserName(userName);
        targetConnectionFactory.setPassword(password);
        if(!StringUtils.isEmpty(keyStorePath) && !StringUtils.isEmpty(keyStorePassword)){
            targetConnectionFactory.setTrustStore(keyStorePath);
            targetConnectionFactory.setTrustStorePassword(keyStorePassword);
        }
        targetConnectionFactory.setAlwaysSyncSend(alwaysSyncSend);
        targetConnectionFactory.setRedeliveryPolicy(defaultEntry);
        return targetConnectionFactory;
    }


spring-cloud-sleuth-core : 2.2.6.RELEASE
spring-cloud-sleuth-zipkin : 2.2.6.RELEASE
active-mq-broker, active-mq-camel, client, jms-pool , open-wire-legacy, pool, spring : 5.15.13
other spring boot and related dependencies : 2.2.6.RELEASE

https://edwin.baculsoft.com/2019/07/error-overriding-bean-of-same-name-declared-in-class-path-resource-when-integrating-spring-cloud-sleuth-and-activemq-library/

Referred multiple articles on this issue (also on StackoverFlow), also tried disabling sleuth but didn't help !

Any clue ?


Solution

  • Your method signatures are looking for 'ActiveMQConnectionFactory'-- that is tightly coupled to ActiveMQ. Most likely, the intetion is to couple to JMS API instead. Change code to use javax.jms.ConnectionFactory instead. (ActiveMQConnectionFactory implements javax.jms.ConnectionFactory)