Pass JNDI name in XARecoveryConfig
Some TX managers require JNDI name for recovery purposes. This patch passes JNDI name in RA to RecoveryRegistry implementations via XARecoveryConfig objects.
This commit is contained in:
parent
33a5e29fbc
commit
a6e513c23b
|
@ -891,7 +891,7 @@ public final class JMSBridgeImpl implements JMSBridge {
|
||||||
Object cf = cff.createConnectionFactory();
|
Object cf = cff.createConnectionFactory();
|
||||||
|
|
||||||
if (cf instanceof ActiveMQConnectionFactory && registry != null) {
|
if (cf instanceof ActiveMQConnectionFactory && registry != null) {
|
||||||
registry.register(XARecoveryConfig.newConfig((ActiveMQConnectionFactory) cf, username, password));
|
registry.register(XARecoveryConfig.newConfig((ActiveMQConnectionFactory) cf, username, password, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qualityOfServiceMode == QualityOfServiceMode.ONCE_AND_ONLY_ONCE && !(cf instanceof XAConnectionFactory)) {
|
if (qualityOfServiceMode == QualityOfServiceMode.ONCE_AND_ONLY_ONCE && !(cf instanceof XAConnectionFactory)) {
|
||||||
|
|
|
@ -26,7 +26,9 @@ import javax.resource.spi.ResourceAdapter;
|
||||||
import javax.resource.spi.ResourceAdapterAssociation;
|
import javax.resource.spi.ResourceAdapterAssociation;
|
||||||
import javax.security.auth.Subject;
|
import javax.security.auth.Subject;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
|
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
|
||||||
|
@ -158,7 +160,10 @@ public final class ActiveMQRAManagedConnectionFactory implements ManagedConnecti
|
||||||
private synchronized void registerRecovery() {
|
private synchronized void registerRecovery() {
|
||||||
if (recoveryConnectionFactory == null) {
|
if (recoveryConnectionFactory == null) {
|
||||||
recoveryConnectionFactory = ra.createRecoveryActiveMQConnectionFactory(mcfProperties);
|
recoveryConnectionFactory = ra.createRecoveryActiveMQConnectionFactory(mcfProperties);
|
||||||
resourceRecovery = ra.getRecoveryManager().register(recoveryConnectionFactory, null, null);
|
|
||||||
|
Map<String, String> recoveryConfProps = new HashMap<String, String>();
|
||||||
|
recoveryConfProps.put(XARecoveryConfig.JNDI_NAME_PROPERTY_KEY, ra.getJndiName());
|
||||||
|
resourceRecovery = ra.getRecoveryManager().register(recoveryConnectionFactory, null, null, recoveryConfProps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@ import org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec;
|
||||||
import org.apache.activemq.artemis.ra.recovery.RecoveryManager;
|
import org.apache.activemq.artemis.ra.recovery.RecoveryManager;
|
||||||
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
|
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
|
||||||
import org.apache.activemq.artemis.service.extensions.ServiceUtils;
|
import org.apache.activemq.artemis.service.extensions.ServiceUtils;
|
||||||
|
import org.apache.activemq.artemis.service.extensions.xa.recovery.XARecoveryConfig;
|
||||||
import org.apache.activemq.artemis.utils.SensitiveDataCodec;
|
import org.apache.activemq.artemis.utils.SensitiveDataCodec;
|
||||||
import org.jgroups.JChannel;
|
import org.jgroups.JChannel;
|
||||||
|
|
||||||
|
@ -1545,7 +1546,10 @@ public class ActiveMQResourceAdapter implements ResourceAdapter, Serializable {
|
||||||
raProperties.init();
|
raProperties.init();
|
||||||
defaultActiveMQConnectionFactory = createActiveMQConnectionFactory(raProperties);
|
defaultActiveMQConnectionFactory = createActiveMQConnectionFactory(raProperties);
|
||||||
recoveryActiveMQConnectionFactory = createRecoveryActiveMQConnectionFactory(raProperties);
|
recoveryActiveMQConnectionFactory = createRecoveryActiveMQConnectionFactory(raProperties);
|
||||||
recoveryManager.register(recoveryActiveMQConnectionFactory, raProperties.getUserName(), raProperties.getPassword());
|
|
||||||
|
Map<String, String> recoveryConfProps = new HashMap<String, String>();
|
||||||
|
recoveryConfProps.put(XARecoveryConfig.JNDI_NAME_PROPERTY_KEY, getJndiName());
|
||||||
|
recoveryManager.register(recoveryActiveMQConnectionFactory, raProperties.getUserName(), raProperties.getPassword(), recoveryConfProps);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<ActivationSpec, ActiveMQActivation> getActivations() {
|
public Map<ActivationSpec, ActiveMQActivation> getActivations() {
|
||||||
|
|
|
@ -30,7 +30,9 @@ import javax.resource.spi.work.WorkManager;
|
||||||
import javax.transaction.xa.XAResource;
|
import javax.transaction.xa.XAResource;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import org.apache.activemq.artemis.api.core.ActiveMQException;
|
import org.apache.activemq.artemis.api.core.ActiveMQException;
|
||||||
|
@ -333,7 +335,9 @@ public class ActiveMQActivation {
|
||||||
handler.start();
|
handler.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
resourceRecovery = ra.getRecoveryManager().register(factory, spec.getUser(), spec.getPassword());
|
Map<String, String> recoveryConfProps = new HashMap<String, String>();
|
||||||
|
recoveryConfProps.put(XARecoveryConfig.JNDI_NAME_PROPERTY_KEY, ra.getJndiName());
|
||||||
|
resourceRecovery = ra.getRecoveryManager().register(factory, spec.getUser(), spec.getPassword(), recoveryConfProps);
|
||||||
|
|
||||||
ActiveMQRALogger.LOGGER.debug("Setup complete " + this);
|
ActiveMQRALogger.LOGGER.debug("Setup complete " + this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import org.apache.activemq.artemis.service.extensions.xa.recovery.ActiveMQRegist
|
||||||
import org.apache.activemq.artemis.service.extensions.xa.recovery.XARecoveryConfig;
|
import org.apache.activemq.artemis.service.extensions.xa.recovery.XARecoveryConfig;
|
||||||
import org.apache.activemq.artemis.utils.ConcurrentHashSet;
|
import org.apache.activemq.artemis.utils.ConcurrentHashSet;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
import java.util.ServiceLoader;
|
import java.util.ServiceLoader;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -43,10 +44,10 @@ public final class RecoveryManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public XARecoveryConfig register(ActiveMQConnectionFactory factory, String userName, String password) {
|
public XARecoveryConfig register(ActiveMQConnectionFactory factory, String userName, String password, Map<String, String> properties) {
|
||||||
ActiveMQRALogger.LOGGER.debug("registering recovery for factory : " + factory);
|
ActiveMQRALogger.LOGGER.debug("registering recovery for factory : " + factory);
|
||||||
|
|
||||||
XARecoveryConfig config = XARecoveryConfig.newConfig(factory, userName, password);
|
XARecoveryConfig config = XARecoveryConfig.newConfig(factory, userName, password, properties);
|
||||||
resources.add(config);
|
resources.add(config);
|
||||||
if (registry != null) {
|
if (registry != null) {
|
||||||
registry.register(config);
|
registry.register(config);
|
||||||
|
|
|
@ -49,8 +49,10 @@ public class ActiveMQXAResourceWrapperImpl implements ActiveMQXAResourceWrapper
|
||||||
//this.productVersion = VersionLoader.getVersion().getFullVersion();
|
//this.productVersion = VersionLoader.getVersion().getFullVersion();
|
||||||
this.productVersion = (String) properties.get(ACTIVEMQ_PRODUCT_VERSION);
|
this.productVersion = (String) properties.get(ACTIVEMQ_PRODUCT_VERSION);
|
||||||
|
|
||||||
this.jndiNameNodeId = properties.get(ACTIVEMQ_JNDI_NAME) +
|
String jndiName = (String) properties.get(ACTIVEMQ_JNDI_NAME);
|
||||||
" NodeId:" + properties.get(ACTIVEMQ_NODE_ID);
|
String nodeId = "NodeId:" + properties.get(ACTIVEMQ_NODE_ID);
|
||||||
|
|
||||||
|
this.jndiNameNodeId = jndiName == null ? nodeId : jndiName + " " + nodeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XAResource getResource() {
|
public XAResource getResource() {
|
||||||
|
|
|
@ -75,7 +75,7 @@ public class ActiveMQXAResourceRecovery {
|
||||||
String username = parser.getUsername();
|
String username = parser.getUsername();
|
||||||
String password = parser.getPassword();
|
String password = parser.getPassword();
|
||||||
TransportConfiguration transportConfiguration = new TransportConfiguration(connectorFactoryClassName, connectorParams);
|
TransportConfiguration transportConfiguration = new TransportConfiguration(connectorFactoryClassName, connectorParams);
|
||||||
xaRecoveryConfigs[i] = new XARecoveryConfig(false, new TransportConfiguration[]{transportConfiguration}, username, password);
|
xaRecoveryConfigs[i] = new XARecoveryConfig(false, new TransportConfiguration[]{transportConfiguration}, username, password, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = new ActiveMQXAResourceWrapper(xaRecoveryConfigs);
|
res = new ActiveMQXAResourceWrapper(xaRecoveryConfigs);
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
package org.apache.activemq.artemis.service.extensions.xa.recovery;
|
package org.apache.activemq.artemis.service.extensions.xa.recovery;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.activemq.artemis.api.core.DiscoveryGroupConfiguration;
|
import org.apache.activemq.artemis.api.core.DiscoveryGroupConfiguration;
|
||||||
import org.apache.activemq.artemis.api.core.TransportConfiguration;
|
import org.apache.activemq.artemis.api.core.TransportConfiguration;
|
||||||
|
@ -31,18 +34,21 @@ import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
|
||||||
*/
|
*/
|
||||||
public class XARecoveryConfig {
|
public class XARecoveryConfig {
|
||||||
|
|
||||||
|
public static final String JNDI_NAME_PROPERTY_KEY = "JNDI_NAME";
|
||||||
|
|
||||||
private final boolean ha;
|
private final boolean ha;
|
||||||
private final TransportConfiguration[] transportConfiguration;
|
private final TransportConfiguration[] transportConfiguration;
|
||||||
private final DiscoveryGroupConfiguration discoveryConfiguration;
|
private final DiscoveryGroupConfiguration discoveryConfiguration;
|
||||||
private final String username;
|
private final String username;
|
||||||
private final String password;
|
private final String password;
|
||||||
|
private final Map<String, String> properties;
|
||||||
|
|
||||||
public static XARecoveryConfig newConfig(ActiveMQConnectionFactory factory, String userName, String password) {
|
public static XARecoveryConfig newConfig(ActiveMQConnectionFactory factory, String userName, String password, Map<String, String> properties) {
|
||||||
if (factory.getServerLocator().getDiscoveryGroupConfiguration() != null) {
|
if (factory.getServerLocator().getDiscoveryGroupConfiguration() != null) {
|
||||||
return new XARecoveryConfig(factory.getServerLocator().isHA(), factory.getServerLocator().getDiscoveryGroupConfiguration(), userName, password);
|
return new XARecoveryConfig(factory.getServerLocator().isHA(), factory.getServerLocator().getDiscoveryGroupConfiguration(), userName, password, properties);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return new XARecoveryConfig(factory.getServerLocator().isHA(), factory.getServerLocator().getStaticTransportConfigurations(), userName, password);
|
return new XARecoveryConfig(factory.getServerLocator().isHA(), factory.getServerLocator().getStaticTransportConfigurations(), userName, password, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -50,23 +56,27 @@ public class XARecoveryConfig {
|
||||||
public XARecoveryConfig(final boolean ha,
|
public XARecoveryConfig(final boolean ha,
|
||||||
final TransportConfiguration[] transportConfiguration,
|
final TransportConfiguration[] transportConfiguration,
|
||||||
final String username,
|
final String username,
|
||||||
final String password) {
|
final String password,
|
||||||
|
final Map<String, String> properties) {
|
||||||
this.transportConfiguration = transportConfiguration;
|
this.transportConfiguration = transportConfiguration;
|
||||||
this.discoveryConfiguration = null;
|
this.discoveryConfiguration = null;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
this.ha = ha;
|
this.ha = ha;
|
||||||
|
this.properties = properties == null ? Collections.unmodifiableMap(new HashMap<String, String>()) : Collections.unmodifiableMap(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XARecoveryConfig(final boolean ha,
|
public XARecoveryConfig(final boolean ha,
|
||||||
final DiscoveryGroupConfiguration discoveryConfiguration,
|
final DiscoveryGroupConfiguration discoveryConfiguration,
|
||||||
final String username,
|
final String username,
|
||||||
final String password) {
|
final String password,
|
||||||
|
final Map<String, String> properties) {
|
||||||
this.discoveryConfiguration = discoveryConfiguration;
|
this.discoveryConfiguration = discoveryConfiguration;
|
||||||
this.transportConfiguration = null;
|
this.transportConfiguration = null;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
this.ha = ha;
|
this.ha = ha;
|
||||||
|
this.properties = properties == null ? Collections.unmodifiableMap(new HashMap<String, String>()) : Collections.unmodifiableMap(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isHA() {
|
public boolean isHA() {
|
||||||
|
@ -89,6 +99,10 @@ public class XARecoveryConfig {
|
||||||
return password;
|
return password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getProperties() {
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a serverLocator using the configuration
|
* Create a serverLocator using the configuration
|
||||||
*
|
*
|
||||||
|
@ -142,10 +156,18 @@ public class XARecoveryConfig {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "XARecoveryConfig [transportConfiguration = " + Arrays.toString(transportConfiguration) +
|
StringBuilder builder = new StringBuilder();
|
||||||
", discoveryConfiguration = " + discoveryConfiguration +
|
|
||||||
", username=" +
|
builder.append("XARecoveryConfig [transportConfiguration=" + Arrays.toString(transportConfiguration));
|
||||||
username +
|
builder.append(", discoveryConfiguration=" + discoveryConfiguration);
|
||||||
", password=****]";
|
builder.append(", username=" + username);
|
||||||
|
builder.append(", password=****");
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> entry : properties.entrySet()) {
|
||||||
|
builder.append(", " + entry.getKey() + "=" + entry.getValue());
|
||||||
|
}
|
||||||
|
builder.append("]");
|
||||||
|
|
||||||
|
return builder.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue