Как отключить 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);
}