我遇到同样的问题并进行了相同的配置,但不起作用。连接工厂仍在内部创建 de IBM XA ConnectionFactory。我试图将 wrap-xa-resource 设置为 false,但该值没有重新定义,我不知道为什么。所以我在连接工厂上做了一个连接包装器,它得到了 jndi,它的工作。
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);
}
}
创建 jmsConnectionFactoryBean:
@Bean
public ConnectionFactory jmsConnectionFactory() {
JndiObjectFactoryBean jmsCF = new JndiObjectFactoryBean();
jmsCF.setResourceRef(true);
ConnectionFactory cf = jmsCF.getJndiTemplate().lookup("jms/ibmCF");
return new IBMMQConnectionFactoryWrapperWithoutXA(cf);
}