[
https://issues.apache.org/jira/browse/CAMEL-18964?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Christian Schubert-Huff updated CAMEL-18964:
--------------------------------------------
Description:
We implemented an 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}
There 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}
was:
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}
There 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}
> 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.18.1, 3.20.1
> Environment: camel-main, camel-activemq, camel-jms, jdk11, linux
> Reporter: Christian Schubert-Huff
> Priority: Minor
>
> We implemented an 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}
> There 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)