简体   繁体   中英

How to disable XA connection in JBOSS MDBs

I am using JBOSS EAP 6.4.2 with IBM MQ 7.5.0.5 client version. I want to disable XA connection that JBOSS is by default creating for MDBs. I am using JCA Resource Adapter.

 1. I need to disable XA because the MQ server is HP NONStop server
    v5.3.1.12 which doesn't support XA. Consequently, the following
    error is coming. *javax.transaction.xa.XAException: The method
    'xa_open' has failed with errorCode '-3'*

 2. I've already tried changing the ra.xml 
    < transaction-support>XATransaction</ transaction-support >
    TO
    < transaction-support >LocalTransaction</ transaction-support >
    without any luck.

 3. Also, I've tried adding 
    @TransactionManagement(CONTAINER)
    @TransactionAttribute(REQUIRED)
    to the MBDs without any luck.

What am I missing here? Please help.

I'm stay in the same problem and did the same configuration, but not work. The connection factory yet is creating de IBM XA ConnectionFactory internally. I tried to set wrap-xa-resource to false, but the value dosen't redefined and I don't know why. So i did a connection wrapper on the connection factory getted of the jndi and it's work.

public class IBMMQConnectionFactoryWrapperWithoutXA implements ConnectionFactory {
    
    final ConnectionFactory originalCF;
    final ConnectionFactory mqCF;
    final String username;
    final String password;
    
    public IBMMQConnectionFactoryWrapperWithoutXA(ConnectionFactory originalCF) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, InvocationTargetException {
        this.originalCF = originalCF;
        Field theMCFField = originalCF.getClass().getDeclaredField("theMCF");
        theMCFField.setAccessible(true);
        Object theMCFValue = theMCFField.get(originalCF);
        Method getPasswordMethod = theMCFValue.getClass().getSuperclass().getSuperclass().getMethod("getPassword");
        this.password = (String)getPasswordMethod.invoke(theMCFValue);
        Field usernameField = theMCFValue.getClass().getSuperclass().getSuperclass().getDeclaredField("username");
        usernameField.setAccessible(true);
        this.username = (String)usernameField.get(theMCFValue);
        Field theCFField = theMCFValue.getClass().getDeclaredField("theCF");
        theCFField.setAccessible(true);
        this.mqCF = (ConnectionFactory)theCFField.get(theMCFValue);
    }

    @Override
    public Connection createConnection() throws JMSException {
        return this.createConnection(username, password);
    }

    @Override
    public Connection createConnection(String userName, String password) throws JMSException {
        return this.mqCF.createConnection(userName, password);
    }

    @Override
    public JMSContext createContext() {
        return this.createContext(username, password);
    }

    @Override
    public JMSContext createContext(String userName, String password) {
        return this.mqCF.createContext(userName, password);
    }

    @Override
    public JMSContext createContext(String userName, String password, int sessionMode) {
        return this.mqCF.createContext(userName, password,sessionMode);
    }

    @Override
    public JMSContext createContext(int sessionMode) {
        return this.createContext(username, password, sessionMode);
    }

}

To create a jmsConnectionFactoryBean:

@Bean
public ConnectionFactory jmsConnectionFactory() {
    JndiObjectFactoryBean jmsCF = new JndiObjectFactoryBean();
    jmsCF.setResourceRef(true);
    ConnectionFactory cf = jmsCF.getJndiTemplate().lookup("jms/ibmCF");
    return new IBMMQConnectionFactoryWrapperWithoutXA(cf);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM