首页 > 解决方案 > 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;
    }

}

在此处输入图像描述

标签: javaeclipseibm-mqspring-jms

解决方案


这些文件丢失是因为在客户端安装中既不提供也不需要它们,因为您不会在仅客户端安装上通过绑定模式进行连接。(来源

不知何故,默认 (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>

推荐阅读