diff --git a/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/ActiveMQXAResourceWrapper.java b/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/ActiveMQXAResourceWrapper.java index 5ebb5c120f..e11b388ef4 100644 --- a/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/ActiveMQXAResourceWrapper.java +++ b/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/ActiveMQXAResourceWrapper.java @@ -306,6 +306,7 @@ public class ActiveMQXAResourceWrapper implements XAResource, SessionFailureList } else { serverLocator = ActiveMQClient.createServerLocator(false, xaRecoveryConfig.getTransportConfig()); } + serverLocator.setLocatorConfig(xaRecoveryConfig.getLocatorConfig()); serverLocator.disableFinalizeCheck(); serverLocator.setProtocolManagerFactory(xaRecoveryConfig.getClientProtocolManager()); csf = serverLocator.createSessionFactory(); diff --git a/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/XARecoveryConfig.java b/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/XARecoveryConfig.java index 3da77de497..f10dfc3190 100644 --- a/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/XARecoveryConfig.java +++ b/artemis-service-extensions/src/main/java/org/apache/activemq/artemis/service/extensions/xa/recovery/XARecoveryConfig.java @@ -60,6 +60,16 @@ public class XARecoveryConfig { final String password, final Map properties, final ClientProtocolManagerFactory clientProtocolManager) { + this(ha, transportConfiguration, username, password, properties, clientProtocolManager, null); + } + + public XARecoveryConfig(final boolean ha, + final TransportConfiguration[] transportConfiguration, + final String username, + final String password, + final Map properties, + final ClientProtocolManagerFactory clientProtocolManager, + ServerLocatorConfig locatorConfig) { TransportConfiguration[] newTransportConfiguration = new TransportConfiguration[transportConfiguration.length]; for (int i = 0; i < transportConfiguration.length; i++) { if (clientProtocolManager != null) { @@ -76,6 +86,7 @@ public class XARecoveryConfig { this.ha = ha; this.properties = properties == null ? new HashMap<>() : properties; this.clientProtocolManager = clientProtocolManager; + this.locatorConfig = locatorConfig; } public XARecoveryConfig(final boolean ha, @@ -187,6 +198,10 @@ public class XARecoveryConfig { return serverLocator; } + public ServerLocatorConfig getLocatorConfig() { + return locatorConfig; + } + @Override public int hashCode() { final int prime = 31; diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/ActiveMQXAResourceWrapperTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/ActiveMQXAResourceWrapperTest.java new file mode 100644 index 0000000000..f344c2c80d --- /dev/null +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/ActiveMQXAResourceWrapperTest.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.activemq.artemis.tests.unit.ra; + +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.core.server.ActiveMQServer; +import org.apache.activemq.artemis.ra.ActiveMQResourceAdapter; +import org.apache.activemq.artemis.service.extensions.xa.recovery.ActiveMQXAResourceWrapper; +import org.apache.activemq.artemis.service.extensions.xa.recovery.XARecoveryConfig; +import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; +import org.junit.Test; + +import javax.transaction.xa.XAResource; + +public class ActiveMQXAResourceWrapperTest extends ActiveMQTestBase { + + @Test + public void testMe() throws Exception { + ActiveMQServer server = createServer(false, true); + ActiveMQResourceAdapter ra = null; + ClientSession cs = null; + + try { + server.getConfiguration().setSecurityEnabled(false); + server.start(); + + ra = new ActiveMQResourceAdapter(); + + ra.setConnectorClassName(NETTY_CONNECTOR_FACTORY); + ra.setConnectionTTL(4000L); + ra.start(new BootstrapContext()); + + + TestActiveMQXAResourceWrapper wrapper = new TestActiveMQXAResourceWrapper(ra.getRecoveryManager().getResources().toArray(new XARecoveryConfig[]{})); + + XAResource res = wrapper.connect(); + if (!(res instanceof ClientSession)) { + fail("Unexpected XAResource type"); + } + cs = (ClientSession) res; + assertEquals(4000L, cs.getSessionFactory().getServerLocator().getConnectionTTL()); + + } finally { + if (cs != null) + cs.close(); + if (ra != null) + ra.stop(); + server.stop(); + } + } + + class TestActiveMQXAResourceWrapper extends ActiveMQXAResourceWrapper { + + TestActiveMQXAResourceWrapper(XARecoveryConfig[] configs) { + super(configs); + } + + @Override + protected XAResource connect() throws Exception { + return super.connect(); + } + } +}