Christian Schubert-Huff created CAMEL-18964:
-----------------------------------------------

             Summary: camel-activemq - JMS connection factory used if defined
                 Key: CAMEL-18964
                 URL: https://issues.apache.org/jira/browse/CAMEL-18964
             Project: Camel
          Issue Type: Bug
          Components: camel-activemq, camel-jms, camel-main
    Affects Versions: 3.20.1, 3.18.1
         Environment: camel-main, camel-activemq, camel-jms, jdk11, linux
            Reporter: Christian Schubert-Huff


We implemented am IBM-MQ to ActiveMQ bridge in camel-main, using camel-activemq 
and camel-jms for IBM-MQ, very similar to the documented 
[EIP|https://camel.apache.org/components/3.18.x/eips/messaging-bridge.html].

This requires the definition of a custom connection factory, which is then set 
as connection factory of the JMS component:
{noformat}
camel.beans.mqConnectionFactory = #class:com.ibm.mq.jms.MQConnectionFactory
camel.beans.mqConnectionFactory.HOSTNAME= mqhost

camel.component.jms.connection-factory = #bean:mqConnectionFactory
{noformat}
Next, we configured the ActiveMQ component _without_ defining an explicit 
connection factory, like this:
{noformat}
camel.component.activemq.broker-url = activemqhost
camel.component.activemq.username = jay
camel.component.activemq.password = unit
{noformat}
We expected this to just work. Instead, the ActiveMQ component began using the 
mqConnectionFactory bean as its own connection factory, and the application 
started throwing errors.

This occurs regardless of the value of 
{{camel.component.activemq.allow-auto-wired-connection-factory}} (which 
defaults to true).

This can be reproduced with the following unit test (which uses 
ActiveMQConnectionFactory so it doesn't depend on proprietary JARs):
{code:java}
@Test
public void testBindJmsConnectionFactory() {
    Main main = new Main();
    main.configure().addRoutesBuilder(new MyRouteBuilder());

    // defining a connection factory for the JMS component
    main.addProperty("camel.beans.jmscf", 
"#class:org.apache.activemq.ActiveMQConnectionFactory");
    main.addProperty("camel.beans.jmscf.brokerURL", "jmshost");
    main.addProperty("camel.component.jms.connection-factory", "#bean:jmscf");

    main.addProperty("camel.component.activemq.broker-url", "activemqhost");
    main.addProperty("camel.component.activemq.username", "jay");
    main.addProperty("camel.component.activemq.password", "unit");
    
main.addProperty("camel.component.activemq.allow-auto-wired-connection-factory",
 "false");

    main.start();

    CamelContext camelContext = main.getCamelContext();
    assertNotNull(camelContext);

    ActiveMQConnectionFactory connectionFactory = 
camelContext.getRegistry().lookupByNameAndType("jmscf", 
ActiveMQConnectionFactory.class);
    assertNotNull(connectionFactory);
    
    JmsComponent jmsComponent = camelContext.getComponent("jms", 
JmsComponent.class);
    assertNotNull(jmsComponent);
    assertSame(connectionFactory, jmsComponent.getConnectionFactory());

    ActiveMQComponent activeMqComponent = camelContext.getComponent("activemq", 
ActiveMQComponent.class);
    assertNotNull(activeMqComponent);
    assertEquals("activemqhost", activeMqComponent.getBrokerURL());
    assertEquals("jay", activeMqComponent.getUsername());
    assertEquals("unit", activeMqComponent.getPassword());
    assertNotSame(connectionFactory, activeMqComponent.getConnectionFactory());

    main.stop();
}
{code}
This is a workaround, which is to define an explicit connection factory on the 
ActiveMQ component:
{noformat}
camel.beans.amqcf = #class:org.apache.activemq.ActiveMQConnectionFactory
camel.beans.amqcf.brokerURL = activemqhost

camel.component.activemq.connection-factory = #bean:amqcf 
{noformat}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to