I don't know of any way to *automatically* tie a web application's life-cycle to that of the broker. This should be possible manually, though. You could create your own "middle-man" bean of sorts that registers itself with the broker using a org.apache.activemq.artemis.core.server.ActivateCallback and then your callback implementation could manage the bridge. Otherwise you should consider running the bridge as a process separate from the broker.
Justin On Thu, Feb 11, 2021 at 10:36 AM <thomas.ger...@printus.de> wrote: > Hi, > > has someone already used bridging with Live / Backup groups of Artemis? If > so, what is the configuration like? > > I am using Artemis version 2.16.0 and tested both options (JMS Bridge, > Camel). In both cases I got an error message when starting the backup > server, probably because Camel cannot establish a connection to the > (passive) Artemis endpoint. > > Is there a way to integrate bridging into the lifecycle of the server in > such a way that the connection is only established when the backup server > becomes live server, as is the case with addresses and queues: > ... > 2021-02-09 19:49:06,056 INFO [org.apache.activemq.artemis.core.server] > AMQ221071: Failing over based on quorum vote results. > 2021-02-09 19:49:06,124 INFO [org.apache.activemq.artemis.core.server] > AMQ221037: > ActiveMQServerImpl::serverUUID=05bd0a29-6b07-11eb-bad0-0242ac120002 to > become 'live' > 2021-02-11 13:54:51,516 INFO [org.apache.activemq.artemis.core.server] > AMQ221080: Deploying address TARGET.Q supporting [ANYCAST] > 2021-02-11 13:54:51,516 INFO [org.apache.activemq.artemis.core.server] > AMQ221003: Deploying ANYCAST queue TARGET.Q on address TARGET.Q > 2021-02-11 13:54:51,733 INFO [org.apache.activemq.artemis.core.server] > AMQ221007: Server is now live > > > > Error message when using JMS Bridge implementation: > 2021-02-09 19:47:20,260 INFO > [org.springframework.web.context.ContextLoader] Root WebApplicationContext: > initialization started > 2021-02-09 19:47:20,491 INFO [org.apache.activemq.artemis.core.server] > AMQ221024: Backup server > ActiveMQServerImpl::serverUUID=05bd0a29-6b07-11eb-bad0-0242ac120002 is > synchronized with live-server. > 2021-02-09 19:47:20,557 INFO [org.apache.activemq.artemis.core.server] > AMQ221031: backup announced > 2021-02-09 19:47:21,038 WARN [org.apache.activemq.artemis.jms.bridge] > AMQ342010: Failed to connect JMS Bridge artemis-jms-bridge-retoure: > javax.jms.JMSException: Failed to create session factory > at > org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:886) > [artemis-jms-client-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:299) > [artemis-jms-client-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:294) > [artemis-jms-client-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.createConnection(JMSBridgeImpl.java:1108) > [artemis-jms-server-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.setupJMSObjects(JMSBridgeImpl.java:1233) > [artemis-jms-server-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl.start(JMSBridgeImpl.java:404) > [artemis-jms-server-2.16.0.jar:2.16.0] > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) [java.base:] > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > [java.base:] > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > [java.base:] > at java.base/java.lang.reflect.Method.invoke(Method.java:566) > [java.base:] > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1903) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1846) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849) > [spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) > [spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) > [spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] > at > org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401) > [spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] > at > org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292) > [spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] > at > org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103) > [spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] > at > org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:933) > at > org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:553) > at > org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:892) > at > org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:356) > at > org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1445) > at > org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1409) > at > org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:825) > at > org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:275) > at > org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117) > at > org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169) > at org.eclipse.jetty.server.Server.start(Server.java:407) > at > org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110) > at > org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97) > at org.eclipse.jetty.server.Server.doStart(Server.java:371) > at > org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) > at > org.apache.activemq.artemis.component.WebServerComponent.start(WebServerComponent.java:263) > [artemis-web-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.addExternalComponent(ActiveMQServerImpl.java:908) > [artemis-server-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.cli.commands.Run.execute(Run.java:126) > [artemis-cli-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.cli.Artemis.internalExecute(Artemis.java:153) > [artemis-cli-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:101) > [artemis-cli-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:128) > [artemis-cli-2.16.0.jar:2.16.0] > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) [java.base:] > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > [java.base:] > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > [java.base:] > at java.base/java.lang.reflect.Method.invoke(Method.java:566) > [java.base:] > at > org.apache.activemq.artemis.boot.Artemis.execute(Artemis.java:134) > [artemis-boot.jar:2.16.0] > at org.apache.activemq.artemis.boot.Artemis.main(Artemis.java:50) > [artemis-boot.jar:2.16.0] > Caused by: ActiveMQNotConnectedException[errorType=NOT_CONNECTED > message=AMQ219007: Cannot connect to server(s). Tried with all available > servers.] > at > org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:703) > [artemis-core-client-2.16.0.jar:2.16.0] > at > org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:884) > [artemis-jms-client-2.16.0.jar:2.16.0] > ... 56 more > 2021-02-09 19:47:21,051 WARN [org.apache.activemq.artemis.jms.bridge] > AMQ342001: Failed to start JMS Bridge artemis-jms-bridge-retoure > 2021-02-09 19:47:21,054 WARN [org.apache.activemq.artemis.jms.bridge] > AMQ342004: JMS Bridge artemis-jms-bridge-retoure, will retry after a pause > of 50,000 ms > > > Error message when using Camel: > 2021-02-11 13:53:55,710 INFO [org.apache.camel.spring.SpringCamelContext] > Apache Camel 2.25.0 (CamelContext: bridgeContext) is starting > 2021-02-11 13:53:55,712 INFO > [org.apache.camel.management.ManagedManagementStrategy] JMX is enabled > 2021-02-11 13:53:55,833 INFO > [org.apache.camel.impl.converter.DefaultTypeConverter] Type converters > loaded (core: 195, classpath: 1) > 2021-02-11 13:53:56,582 INFO [org.apache.camel.spring.SpringCamelContext] > Route: artemis-jms-bridge-retoure started and consuming from: > jms://queue://SOURCE.Q?asyncConsumer=true&concurrentConsumers=8&connectionFactory=%23wmqConnectionFactoryWrapper&disableReplyTo=true&mapJmsMessage=false&maxConcurrentConsumers=16 > 2021-02-11 13:53:56,594 INFO [org.apache.camel.spring.SpringCamelContext] > Total 1 routes, of which 1 are started > 2021-02-11 13:53:56,614 INFO [org.apache.camel.spring.SpringCamelContext] > Apache Camel 2.25.0 (CamelContext: bridgeContext) started in 0.885 seconds > 2021-02-11 13:53:56,630 INFO > [org.springframework.web.context.ContextLoader] Root WebApplicationContext > initialized in 2985 ms > 2021-02-11 13:53:56,627 ERROR > [org.apache.camel.component.jms.DefaultJmsMessageListenerContainer] Could > not refresh JMS Connection for destination 'TARGET.Q' - retrying using > FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. > Cause: Failed to create session factory; nested exception is > ActiveMQNotConnectedException[errorType=NOT_CONNECTED message=AMQ219007: > Cannot connect to server(s). Tried with all available servers.] > 2021-02-11 13:53:56,673 INFO [org.apache.activemq.artemis] AMQ241001: > HTTP Server started at http://0.0.0.0:8161 > 2021-02-11 13:53:56,674 INFO [org.apache.activemq.artemis] AMQ241002: > Artemis Jolokia REST API available at http://0.0.0.0:8161/console/jolokia > 2021-02-11 <http://0.0.0.0:8161/console/jolokia2021-02-11> 13:53:56,674 > INFO [org.apache.activemq.artemis] AMQ241004: Artemis Console available at > http://0.0.0.0:8161/console > > > > JMS Bridge Configuration: > <?xml version="1.0" encoding="UTF-8"?> > > <beans xmlns="http://www.springframework.org/schema/beans" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans.xsd"> > > <bean id="wmqConnectionFactory" > class="com.ibm.mq.jms.MQQueueConnectionFactory"> > <property name="transportType" value="1"/> > <property name="hostName" value="XXXX"/> > <property name="port" value="1414"/> > <property name="queueManager" value="XXXX"/> > <property name="channel" value="XXXX"/> > <property name="targetClientMatching" value="true"/> > </bean> > > <bean id="wmqConnectionFactoryWrapper" > class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> > <property name="targetConnectionFactory" > ref="wmqConnectionFactory" /> > <property name="username" value="XXXX" /> > <property name="password" value="XXXX" /> > </bean> > > <bean id="wmqConnectionFactoryFactory" > class="org.artemis.bridge.ConnectionFactoryFactoryBean"> > <constructor-arg ref="wmqConnectionFactory"/> > </bean> > > <bean id="amqConnectionFactory" > class="org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory"> > <constructor-arg name="url" value="vm://1"/> > <constructor-arg name="user" value="XXXX"/> > <constructor-arg name="password" value="XXXX"/> > </bean> > > <bean id="amqConnectionFactoryFactory" > class="org.artemis.bridge.ConnectionFactoryFactoryBean"> > <constructor-arg ref="amqConnectionFactory"/> > </bean> > > <bean id="wmqDestinationFactoryRetoure" > class="org.artemis.bridge.DestinationFactoryBean"> > <constructor-arg ref="wmqDestinationRetoure"/> > </bean> > > <bean id="amqDestinationFactoryRetoure" > class="org.artemis.bridge.DestinationFactoryBean"> > <constructor-arg ref="amqDestinationRetoure"/> > </bean> > > <bean id="wmqDestinationRetoure" class="com.ibm.mq.jms.MQQueue"> > <constructor-arg value="TARGET.Q"/> > </bean> > > <bean id="amqDestinationRetoure" > class="org.apache.activemq.artemis.jms.client.ActiveMQQueue"> > <constructor-arg value="SOURCE.Q"/> > </bean> > > <bean id="artemis-jms-bridge-retoure" > class="org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl" > init-method="start" destroy-method="stop"> > <property name="bridgeName" value="artemis-jms-bridge-retoure"/> > <property name="sourceConnectionFactoryFactory" > ref="amqConnectionFactoryFactory"/> > <property name="targetConnectionFactoryFactory" > ref="wmqConnectionFactoryFactory"/> > <property name="sourceDestinationFactory" > ref="amqDestinationFactoryRetoure"/> > <property name="targetDestinationFactory" > ref="wmqDestinationFactoryRetoure"/> > <property name="qualityOfServiceMode" value="DUPLICATES_OK"/> > <property name="failureRetryInterval" value="50000"/> > <property name="failoverTimeout" value="5000"/> > <property name="maxRetries" value="-1"/> > <property name="maxBatchSize" value="1"/> > <property name="maxBatchTime" value="-1"/> > </bean> > </beans> > > > Camel Configuration: > <beans xmlns="http://www.springframework.org/schema/beans" > xmlns:camel="http://camel.apache.org/schema/spring" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans.xsd > http://camel.apache.org/schema/spring > http://camel.apache.org/schema/spring/camel-spring.xsd"> > > <bean id="amqConnectionFactory" > class="org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory"> > <constructor-arg name="url" value="vm://1"/> > <constructor-arg name="user" value="XXXX"/> > <constructor-arg name="password" value="XXXX"/> > </bean> > > <bean id="wmqConnectionFactory" > class="com.ibm.mq.jms.MQQueueConnectionFactory"> > <property name="transportType" value="1"/> > <property name="hostName" value="XXXX"/> > <property name="port" value="1414"/> > <property name="queueManager" value="XXXX"/> > <property name="channel" value="XXXX"/> > <property name="targetClientMatching" value="true"/> > </bean> > > <bean id="wmqConnectionFactoryWrapper" > class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> > <property name="targetConnectionFactory" > ref="wmqConnectionFactory" /> > <property name="username" value="XXXX" /> > <property name="password" value="XXXX" /> > </bean> > > <camelContext id="bridgeContext" trace="false" xmlns=" > http://camel.apache.org/schema/spring"> > <route id="artemis-jms-bridge-retoure"> > <from > uri="jms:queue://SOURCE.Q?connectionFactory=#wmqConnectionFactoryWrapper&disableReplyTo=true&concurrentConsumers=8&asyncConsumer=true&maxConcurrentConsumers=16&mapJmsMessage=false"/> > <to > uri="jms:queue://TARGET.Q?connectionFactory=#amqConnectionFactory&exchangePattern=InOnly&forceSendOriginalMessage=true"/> > </route> > </camelContext> > </beans> > > > Thanks, > Thomas > >