windows、linux下java连接本地MQ队列实现输入

自从前几天写了一篇websphere MQ安装以后,今天打算再写一篇java连接本地MQ队列实现put,get操作,希望可以给大家带来一些帮助,同时也给自己做一个总结。

先windows,后linux。

八戒(本人)下载的版本是WS_MQ_V7.5.0.2_TRIAL_FOR_WINDOWS_ML.zip,

下面附上官网下载链接:https://www.ibm.com/developerworks/cn/downloads/ws/wmq/ (选90天试用期,剩下的版本根据个人意愿下载)

Windows版:


安装好以后的界面如上图:下面就来创建一个MQ管理器

右键队列管理器,新建一个队列管理器,命名为bajie


默认监听器端口是1414,但是我之前已经有一个队列管理器,所以这里要修改为1415


可以看到,显示bajie证明,队列管理器创建成功。


下面来创建一个队列。

展开bajie,右键队列,新建本地队列(这里要注意,队列名称不管你用大写还是小写,MQ都会默认大写,所以一会要连接的时候只能用大写,小写会报错:找不到远程队列,八戒在linux上遇到过无数次以后才发现...)


提示:创建队列成功!


下来新建服务器连接通道

右键通道,新建,服务器连接通道


最后再确认一下编码字符集和端口号

右键bajie,点属性




下面来创建项目,本地创建一个Java项目,八戒jar包的默认路径是C:\Program Files (x86)\IBM\WebSphere MQ_2\java\lib,仅供参考,

核心jar包,我忘记了(你们可以百度一下),我全部放进工程中。

java代码

package cn.shayulajiao.MQ;

import com.ibm.mq.MQC;
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;

public class JulyTest {
	static MQQueueManager qMgr;
	static int CCSID = 1381;
	//static String queueString = "LOCALQUEUE";
	static String queueString = "BAJIE_QUEUE";
	
	public static void connect() throws MQException {
		MQEnvironment.hostname = "127.0.0.1";
		MQEnvironment.channel = "bajie_conn";
		MQEnvironment.port = 1415;
		MQEnvironment.CCSID = CCSID;
		//MQ中拥有权限的用户名
		MQEnvironment.userID = "MUSR_MQADMIN";
		//用户名对应的密码
		MQEnvironment.password = "123456";
		
		qMgr = new MQQueueManager("bajie");
	}
	
	public static void sendMsg(String msgStr) {
		int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
        MQQueue queue = null;
        try {
            // 建立Q1通道的连接
            queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
            MQMessage msg = new MQMessage();// 要写入队列的消息
            msg.format = MQC.MQFMT_STRING;
            msg.characterSet = CCSID;
            msg.encoding = CCSID;
            // msg.writeObject(msgStr); //将消息写入消息对象中
            msg.writeString(msgStr);
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            msg.expiry = -1; // 设置消息用不过期
            queue.put(msg, pmo);// 将消息放入队列
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (queue != null) {
                try {
                    queue.close();
                } catch (MQException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
	}
	
	public static void receiveMsg() {
        int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE;
        MQQueue queue = null;
        try {
            queue = qMgr.accessQueue(queueString, openOptions, null, null, null);
            System.out.println("该队列当前的深度为:" + queue.getCurrentDepth());
            System.out.println("===========================");
            int depth = queue.getCurrentDepth();
            // 将队列的里的消息读出来
            while (depth-- > 0) {
                MQMessage msg = new MQMessage();// 要读的队列的消息
                MQGetMessageOptions gmo = new MQGetMessageOptions();
                queue.get(msg, gmo);
                System.out.println("消息的大小为:" + msg.getDataLength());
                System.out.println("消息的内容:\n" + msg.readStringOfByteLength(msg.getDataLength()));
                System.out.println("---------------------------");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (queue != null) {
                try {
                    queue.close();
                } catch (MQException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
	public static void main(String[] args) throws MQException {
		connect();
		sendMsg("hello world");
		sendMsg("同是天涯沦落人,相逢何必曾相识");
		receiveMsg();
	}
}

走到这里基本上也差不多结束了,这里说一下可能会遇到的几个问题

完成代码是 2,原因为 2035

可能错误分析:

通道开启认证,将访问拒绝了


解决方案:

关闭认证:进入命令行

>runmqsc bajie //启动队列管理器bajie的MQSC (如果显示未找到该命令,说明你没有在path路径配置,理同jdk)

display qmgr chlauth

1:display qmgr chlauth

AMQ8408:显示队列管理器的细节

QMNAME(bajie) CHLAUTH(ENABLED)

//将认证关闭

alter qmgr chlauth(disabled)

2:alter qmgr chlauth(disabled)

AMQ8005:WebSphere MQ 队列管理器已更改



完成代码是 2,原因为 2035

可能错误分析:

应用程序“WebSphere MQ Client for java”没有提供用户标示和密码

解决方案:

需要在代码中加入用户标示和密码

//MQ中拥有权限的用户名
MQEnvironment.userID = "MUSR_MQADMIN";
//用户名对应的密码
MQEnvironment.password = "123456";


使用其他用户的话,需要用户已经存在系统中的mqm用户组中


当这些都已经结束的时候,八戒也应该告一段落再见,希望你也可以如愿以偿的看到你想要的结果。(linux下一篇文章写,这里写了好多先发出去......)



















  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值