Java调用WASMQ

WAS MQ的api使用与其它的MQ如ActiveMQ差别很大,下面以调用本地队列为列介绍一下:

创建发送端:

public class Sender {

private MQQueueManager qMgr;
private MQQueue mqQueue;

public void init() throws Exception {

MQEnvironment.channel = "SYSTEM.DEF.SVRCONN";
MQEnvironment.hostname = "mq所在机器ip";
MQEnvironment.port = mq队列管理器的端口;
qMgr = new MQQueueManager("队列管理器");

}

public void open() throws MQException {

int openOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_FAIL_IF_QUIESCING;
mqQueue = qMgr.accessQueue("队列", openOptions);

}

public void send(String msg) throws Exception {

MQPutMessageOptions pmo = new MQPutMessageOptions();
MQMessage mqMsg = new MQMessage();
mqMsg.write(msg.getBytes());
mqQueue.put(mqMsg, pmo);

}

public void close() throws MQException {

mqQueue.close();
qMgr.disconnect();

}

}

接收端:

public class Receiver {

private MQQueueManager qMgr;
private MQQueue mqQueue;

public void init() throws Exception {

MQEnvironment.channel = "SYSTEM.DEF.SVRCONN";
MQEnvironment.hostname = "同上";
MQEnvironment.port = 同上;
qMgr = new MQQueueManager("同上");

}

public void open() throws MQException {

int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF;
mqQueue = qMgr.accessQueue("同上", openOptions);

}

public String receive() {

byte[] message = null;

try {

MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = gmo.options + MQConstants.MQGMO_SYNCPOINT; 
gmo.options = gmo.options + MQConstants.MQGMO_WAIT;    
gmo.options = gmo.options + MQConstants.MQGMO_FAIL_IF_QUIESCING;   
gmo.waitInterval = 1000 ;  //设置等待时间,MQConstants.MQWI_UNLIMITED则一直等待,有直到有消息

MQMessage mqMsg = fetchMessage(gmo);

if (mqMsg != null) {

int len = mqMsg.getDataLength();
message = new byte[len];
mqMsg.readFully(message, 0, len);

}

} catch (Exception e) {
e.printStackTrace();
}

if (message != null) {
return new String(message);
} else {
return null;
}

}

public MQMessage fetchMessage(MQGetMessageOptions gmo) {

MQMessage msg = new MQMessage();

try {
mqQueue.get(msg, gmo);
} catch (Exception e) {
msg = null;
}

return msg;

}

public void close() throws MQException {

mqQueue.close();
qMgr.disconnect();

}

}

因为是本地队列,所以发送端与接收端ip与端口,队列名称一致,如果是远程队列,换成对应的ip,端口与队列名称就好了.

与其它MQ最大的区别是无法像ActiveMQ那样在一个队列上通过程序动态创建多个队列通道,这里队列必须事先存在,接收消息这里不再是设置Listener,然后调用onMessage(),这里是将等待时间设置成MQConstants.MQWI_UNLIMITED(-1),然后继承线程类,用while循环实现的.但是这里注意,本地话应用还好,可以通过主线程关闭队列,达到终止的目的,但是如果是Web应用,这里绝对不能设置成MQConstants.MQWI_UNLIMITED,获取消息的过程中,队列与队列管理器对象处于阻塞状态,任何其它的操作都不能进行,必须等待成功获取消息之后才可,这就意味着如果关闭应用,你的应用永远也关闭不了,所以Web获取消息,必须是将等待时间设置一个指定的时间.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值