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)