Как отключить XA-соединение в JBOSS MDB

Я использую JBOSS EAP 6.4.2 с клиентской версией IBM MQ 7.5.0.5. Я хочу отключить соединение XA, которое JBOSS по умолчанию создает для MDB. Я использую 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.

Что мне здесь не хватает? Пожалуйста помоги.

1 ответ

Я остаюсь в той же проблеме и делал ту же конфигурацию, но не работал. Фабрика соединений еще создает внутри IBM XA ConnectionFactory. Я попытался установить для wrap-xa-resource значение false, но значение не было переопределено, и я не знаю почему. Итак, я сделал оболочку соединения на фабрике соединений, полученной из jndi, и она заработала.

открытый класс IBMMQConnectionFactoryWrapperWithoutXA реализует 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);
}

}

Чтобы создать jmsConnectionFactoryBean:

      @Bean
public ConnectionFactory jmsConnectionFactory() {
    JndiObjectFactoryBean jmsCF = new JndiObjectFactoryBean();
    jmsCF.setResourceRef(true);
    ConnectionFactory cf = jmsCF.getJndiTemplate().lookup("jms/ibmCF");
    return new IBMMQConnectionFactoryWrapperWithoutXA(cf);
}
Другие вопросы по тегам