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获取消息,必须是将等待时间设置一个指定的时间.