java - com.ibm.mq.jmqi.JmqiException:未找到本机 JNI 库“mqjbnd64”。对于客户端安装,这是预期的
问题描述
我已经使用 JMS 创建了一个 Spring Boot 应用程序。我正在使用 IBM MQ7 并尝试通过客户端建立连接以使用 Spring JMS 访问队列。谁能帮助我是新手。
我在日食中遇到错误
Could not refresh JMS Connection for destination 'queue1' - retrying in 5000 ms. Cause: JMSFMQ6312: An exception occurred in the Java(tm) MQI.; nested exception is com.ibm.mq.jmqi.JmqiException: CC=2;RC=2495;AMQ8568: The native JNI library 'mqjbnd' was not found.
但是,我尝试在 JVM 参数中设置 java.library.path 并在 Eclipse 中设置 Eclipse.ini,但仍然遇到相同的错误。
In Run Configuration: VM Arguments
-Djava.library.path="C:\Program Files (x86)\IBM\WebSphere MQ\java\lib64\mqjbnd.dll"
我已关注
https://stackoverflow.com/questions/3675883/accessing-mq-with-jms
https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/ q031570_.htm
我仍然得到同样的例外。
JMS 配置:
@Configuration
@ComponentScan(basePackageClasses =
{
MessageListener.class
})
public class JmsConfig {
private static final Logger logger = LoggerFactory.getLogger(JmsConfig.class);
@Value("${ibm.mq.hostname}")
private String host;
@Value("${ibm.mq.port}")
private Integer port;
@Value("${ibm.mq.manager}")
private String queueManager;
@Value("${ibm.mq.channel}")
private String channel;
@Value("${ibm.mq.queue}")
private String queue;
@Value("${ibm.mq.timeout}")
private long timeout;
@Value("${ibm.mq.username}")
private String username;
@Value("${ibm.mq.password}")
private String password;
@Resource
private MessageListener listener;
@Bean
public MQTopicConnectionFactory mqTopicConnectionFactory() {
MQTopicConnectionFactory mqTopicConnectionFactory = new MQTopicConnectionFactory();
try {
mqTopicConnectionFactory.setHostName(host);
mqTopicConnectionFactory.setQueueManager(queueManager);
mqTopicConnectionFactory.setPort(port);
mqTopicConnectionFactory.setChannel(channel);
mqTopicConnectionFactory.setTransportType(CommonConstants.WMQ_CM_CLIENT);
mqTopicConnectionFactory.setCCSID(1208);
} catch (Exception e) {
logger.error("Error connecting to MQ: {}",e.getMessage());
}
return mqTopicConnectionFactory;
}
@Bean
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(MQQueueConnectionFactory mqQueueConnectionFactory) {
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setUsername(username);
userCredentialsConnectionFactoryAdapter.setPassword(password);
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
return userCredentialsConnectionFactoryAdapter;
}
@Bean
@Primary
public MQQueueConnectionFactory mqQueueConnectionFactory() {
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
try {
mqQueueConnectionFactory.setHostName(host);
mqQueueConnectionFactory.setQueueManager(queueManager);
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setChannel(channel);
mqQueueConnectionFactory.setTransportType(CommonConstants.WMQ_CM_CLIENT);
mqQueueConnectionFactory.setCCSID(1208);
} catch (Exception e) {
logger.error("Error connecting to MQ: {}",e.getMessage());
}
return mqQueueConnectionFactory;
}
@Bean
public DefaultMessageListenerContainer myAppListenerContainer()
{
DefaultMessageListenerContainer listenerContainer = new DefaultMessageListenerContainer();
listenerContainer.setConnectionFactory(mqQueueConnectionFactory());
listenerContainer.setDestinationName(queue);
listenerContainer.setMessageListener(listener);
//listenerContainer.setMaxConcurrentConsumers(maxConsumers);
listenerContainer.setSessionTransacted(true);
return listenerContainer;
}
@Bean
@Primary
public CachingConnectionFactory cachingConnectionFactory(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
cachingConnectionFactory.setSessionCacheSize(500);
cachingConnectionFactory.setReconnectOnException(true);
return cachingConnectionFactory;
}
@Bean
public JmsTemplate queueTemplate(CachingConnectionFactory mqQueueConnectionFactory) {
JmsTemplate jmsTemplate = new JmsTemplate(mqQueueConnectionFactory);
jmsTemplate.setReceiveTimeout(timeout);
return jmsTemplate;
}
}
解决方案
这些文件丢失是因为在客户端安装中既不提供也不需要它们,因为您不会在仅客户端安装上通过绑定模式进行连接。(来源)
不知何故,默认 (WMQ_CM_BINDINGS = 0) 传输类型用于ConnectionFactory
失败ConnectionFactory
。
这不起作用
mqQueueConnectionFactory.setTransportType(CommonConstants.WMQ_CM_CLIENT);
这有效
mqQueueConnectionFactory.setIntProperty(CommonConstants.WMQ_CONNECTION_MODE, CommonConstants.WMQ_CM_CLIENT);
其他属性按预期工作。这是工厂声明
@Bean
@ConfigurationProperties(prefix = "ibm.mq")
public MQQueueConnectionFactory mqConnectionFactory() throws JMSException {
MQQueueConnectionFactory factory = new MQQueueConnectionFactory();
factory.setIntProperty(WMQ_CONNECTION_MODE, WMQ_CM_CLIENT);
return factory;
}
带配置
ibm.mq:
queueManager: <manager>
channel: <channel>
hostName: <host>
port: <port>
user: <user>
password: <pass>
推荐阅读
- c++ - CMake 和 MinGW w64 和 windows 系统库
- java - Docker 容器中的 RabbitMQ 不允许我的 Java 应用程序连接
- php - 登录不起作用,但没有给出任何错误
- html - 如何创建淡入/淡出图像动画
- excel - 在 Excel“不可读的内容”中查找错误的公式
- wagtail - 将 HTML 查看添加到 Wagtail 上的 Draftail 编辑器
- python - Python - “字符串索引必须是整数”错误使用 json 和 twitter
- sql-server - 从 T-SQL 脚本中调用 T-SQL 命令的 *File*
- python-3.x - Bs4和python中的问题
- java - 将 MapboxMap 从一个活动发送到另一个活动