消息:是websphere mq中最小的概念,包括:应用数据体和消息数据头
队列:可以简单地把队列看成一个容器,用来存放消息。由4块组成:本地队列、远程队列、别名队列、模型队列,其中只有本地队列是真正意义上的队列实体,可以存放消息。当消息被添加到队列时,缺省是添加到最后,删除时,却是从头开始删。
远程队列和别名队列只是一个定义,指向另一个队列实体。
本地队列按功能分又包括:初始化队列、传输队列、目标队列和死信队列。
1、初始化队列用做消息触发功能。
2、传输队列只是暂存待传的消息, 在条件许可的情况下, 通过管道将消息传送其它的队列管理器。
3、目标队列是消息的目的地, 可以长期存放消息。 如果消息不能送达目
标队列, 也不能再路由出去, 则被自动放入死信队列保存
队列管理器是消息队列的管理者,用来维护和管理消息队列,一台机器上可以创建一个或多个队列管理器,通常情况上,同一网络下队列管理器不能重名。
通道是两个队列管理器之前的一种单向的点对点的通信连接,消息在通道中只能单向的流动。如果需要双向的流动,可以创建一对通道,一来一去。
package com.hzbank.test.controller;
import com.ibm.mq.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/mq")
public class MqController {
// 定义队列管理器和队列的名称
private static String hostname = "10.80.63.101"; // MQ服务器的IP地址
private static int port = 1414; // MQ端口
private static int ccsid = 1381; // 服务器MQ服务使用的编码1381代表GBK、1208代表UTF
private static String qmName = "QM_JACK"; // MQ的队列管理器名称;
private static String channel = "CNN_JACK"; // 服务器连接的通道名称
private static String qName = "QUEUE_RECV"; // MQ远程队列的名称;
private static MQQueueManager qMgr; //队列管理器实例
private MQQueue qQueue;//队列实例
/**
* 初始化队列信息
*
* */
public void init(){
MQEnvironment.hostname = this.hostname; // 安裝MQ所在的ip address
MQEnvironment.port = this.port; // TCP/IP port
MQEnvironment.channel = this.channel;
MQEnvironment.CCSID = this.ccsid;
try {
qMgr = new MQQueueManager(this.qmName);//实例化具体的队列管理器
int qOptioin = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_INQUIRE
| MQC.MQOO_OUTPUT;
qQueue = qMgr.accessQueue(qName, qOptioin);//实例化具体的队列
} catch (MQException e) {
e.printStackTrace();
}
}
/***
*把消息放进队列中
*
*/
public void sendMessage(byte[] qByte){
try {
MQMessage qMsg = new MQMessage();//实例化具体的消息
qMsg.write(qByte);//把传输的数据写进消息中
MQPutMessageOptions pmo = new MQPutMessageOptions();
qQueue.put(qMsg, pmo);
System.out.println("消息已经放进队列");
} catch (MQException e) {
e.printStackTrace();
System.out
.println("A WebSphere MQ error occurred : Completion code "
+ e.completionCode + " Reason Code is "
+ e.reasonCode);
} catch (java.io.IOException e) {
e.printStackTrace();
System.out
.println("An error occurred whilst to the message buffer "
+ e);
}
}
/**
* 从消息队列取数据
*/
public void getMessage() {
try {
MQMessage retrievedMessage = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options += MQC.MQPMO_SYNCPOINT;
qQueue.get(retrievedMessage, gmo);
int length = retrievedMessage.getDataLength();
byte[] msg = new byte[length];
retrievedMessage.readFully(msg);
String sMsg = new String(msg,"GBK");
System.out.println("取到的消息是:"+sMsg);
} catch (RuntimeException e) {
e.printStackTrace();
} catch (MQException e) {
e.printStackTrace();
if (e.reasonCode != 2033) // 没有消息
{
e.printStackTrace();
System.out
.println("A WebSphere MQ error occurred : Completion code "
+ e.completionCode
+ " Reason Code is "
+ e.reasonCode);
}
} catch (java.io.IOException e) {
System.out
.println("An error occurred whilst to the message buffer "
+ e);
}
}
@RequestMapping("/test")
public void testRun(){
this.init();//初始化mq
try {
String str="";//假设要发送的数据是String类型的
str="我要尝试往队列中发送消息";
this.sendMessage(str.getBytes("UTF-8"));//往队列中发送消息
this.getMessage();//从队列中取消息
} catch (Exception e) {
e.printStackTrace();
}
}
}