Java - JNI 方式 访问 MQ (绑定模式)

本文档介绍了如何使用Java的JNI技术来实现与消息队列(MQ)的绑定模式通信。详细步骤和启动命令见参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

参考:https://blog.youkuaiyun.com/MePlusPlus/article/details/52847580

启动命令:

### 启动命令(设置临时环境变量,指定libmqjbnd.so或libmqjbnd.dll的位置)

[Linux][HP-UX][Solaris]:
export LD_LIBRARY_PATH=/opt/IBM/mqm/java/lib64:$LD_LIBRARY_PATH && java -jar test1.jar

[Windows-CMD]:
set PATH=C:\Program Files\IBM\MQ\java\lib64;%PATH% && java -jar test1.jar

[Windows-Powershell]:
set PATH=C:\Program Files\IBM\MQ\java\lib64;%PATH% -and java -jar test1.jar

[AIX]
export LIBPATH=/usr/IBM/mqm/java/lib64:$LIBPATH && java -jar test1.jar

# 假如报错 2035,是用户权限问题,linux下切换到有权限的用户去运行,windows需要在mqm用户组下配置用户和密码。
package com.mq.test;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;

public class MQTest2 {
    
    private static String mqQMName     = "DCNL005CST";                           // MQ队列管理器名
    private static String mqQueue1Name = "CN_CUST.CN_HUB.CN_CUST.INSTR_RSP.D1";  // MQ队列名,发消息给MQ的
    private static String mqQueue2Name = "CN_CUST.CN_HUB.CN_CUST.INSTR_RQST.D1"; // MQ队列名,接收MQ消息的
    
    public static void main(String[] args) throws MQException, IOException {
        // 打包成jar后的 启动命令: java -jar xxx.jar [MQ队列管理器名称] [MQ接收队列名1] [MQ发送队列名2]
        output("控制台参数:");
        for (String s1 : args) {
            output(s1 + " ");
        }
        if (args.length > 0) {
            if (args[0].startsWith("DCNL")) {
                mqQMName = args[0];
                output("指定队列管理器: " + mqQMName);
            }
            
            if (args.length > 1 && args[1].startsWith("CN_CUST.")) {
                mqQueue1Name = args[1];
                output("指定MQ的接收队列: " + mqQueue1Name);
            } else {
                output("默认的MQ接收队列: " + mqQueue1Name);
            }
            
            if (args.length > 2 && args[2].startsWith("CN_CUST.")) {
                mqQueue2Name = args[2];
                output("指定MQ的发送队列: " + mqQueue2Name);
            } else {
                output("默认的MQ发送队列: " + mqQueue2Name);
            }
        } else {
            output("默认的队列管理器: " + mqQMName);
            
            output("默认的MQ接收队列: " + mqQueue1Name);
            
            output("默认的MQ发送队列: " + mqQueue2Name);
            
        }
        
        // 发送消息给队列
        put();
        
        // 从队列读取消息
        // get(); // 接收MQ消息的函数 暂未作修改测试
    }
    
    @SuppressWarnings("unchecked")
    static void put() {
        MQQueueManager queueManager = null;
        MQQueue putQueue = null;
        try {
            // 设置应用名称,方便服务器MQ 查看应用连接
            MQEnvironment.properties.put(CMQC.APPNAME_PROPERTY, "HSBC-Swift-API");
            
            // 设置绑定模式通信
            MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY, CMQC.TRANSPORT_MQSERIES_BINDINGS);
            
            // 创建实例,连接队列管理器
            output("开始连接MQ...");
            
            queueManager = new MQQueueManager(mqQMName);
            
            output("连接MQ成功!");
            
            // 以可写的方式访问队列管理器已定义的队列QUEUE1,当然也可以创建队列
            putQueue = queueManager.accessQueue(mqQueue1Name, CMQC.MQOO_OUTPUT);
            
            // 新建并发送消息给队列
            MQMessage myMessage = new MQMessage();
            String name = "这是发给MQ队列的内容";
            output("发送消息:" + name);
            myMessage.writeUTF(name);
            // 使用默认的消息选项
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            // 发送消息
            putQueue.put(myMessage, pmo);
            output("发送成功!");
            
            // 断开连接
            putQueue.close();
            queueManager.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != putQueue) {
                try {
                    putQueue.close();
                } catch (MQException e) {
                    e.printStackTrace();
                }
            }
            if (null != queueManager) {
                try {
                    queueManager.disconnect();
                    queueManager.close();
                } catch (MQException e) {
                    e.printStackTrace();
                }
                
            }
        }
        
    }
    
    @SuppressWarnings("unchecked")
    static void get() throws MQException, IOException {
        
        // 设置应用名称,方便服务器MQ 查看应用连接
        MQEnvironment.properties.put(CMQC.APPNAME_PROPERTY, "MQ Test By Java");
        MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY, CMQC.TRANSPORT_MQSERIES_BINDINGS);
        
        // 创建实例,连接队列管理器
        MQQueueManager queueManager = new MQQueueManager(mqQMName);
        
        // 以可读的方式访问队列管理器已定义的队列QUEUE1
        MQQueue getQueue = queueManager.accessQueue(mqQueue2Name, CMQC.MQOO_INPUT_AS_Q_DEF);
        
        // 从队列读取消息
        MQMessage theMessage = new MQMessage();
        MQGetMessageOptions gmo = new MQGetMessageOptions();
        getQueue.get(theMessage, gmo);
        
        String name = theMessage.readUTF();
        
        output("获取到MQ消息:" + name);
        getQueue.close();
        
        // 断开连接
        queueManager.disconnect();
    }
    
    private static void output(String msg) {
        String timeNow = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
        System.out.println("[" + timeNow + "] " + msg);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值