1,接口方法:IQueueManager.java
/**
* @author weiya
*
*/
public interface IQueueManager {
/**
* 发送消息
*
* @param b
* @param queueName
* @roseuid 447BE52F01C2
*/
void putMessage(byte[] b, String queueName) throws QueueAccessException;
/**
* 发送消息
*
* @param b
* @param queueName
* @roseuid 447BE52F01C2
*/
void putMessage(String msg, String queueName) throws QueueAccessException;
/**
* 获取消息
*
* @param queueName
* @return byte[]
* @roseuid 447BE55102FC
*/
byte[] getMessage(String queueName) throws QueueAccessException;
/**
* 浏览消息
*
* @param queueName
* @return byte[]
* @roseuid 447BE5D700FA
*/
byte[] browseMessage(String queueName) throws QueueAccessException;
/**
* 浏览消息
*
* @param queueName
* @return byte[]
* @roseuid 447BE5D700FA
*/
IMessage browseMessageN(String queueName) throws QueueAccessException;
/**
* 从队列当前位置浏览
* @param queueName
* @return
* @throws QueueAccessException
*/
IMessage browseNextMessage(String queueName) throws QueueAccessException;
/**
* 删除队列中当前第一条消息
*
* @param queueName
* @roseuid 447BE5F300F3
*/
void deleteMessage(String queueName) throws QueueAccessException;
/**
* 删除队列中的消息ID等于messageId的消息,若消息ID为空,则返回
* @param queueName
* @param messageId
* @throws UniediException
*/
void deleteMessage(String queueName,byte[] messageId) throws QueueAccessException;
/**
* 释放所有MQ资源
*
* @throws MQException
*/
public void release() throws QueueAccessException;
/**
* 释放MQ队列资源
*
* @param queueName
* @throws QueueAccessException
*/
public void releaseQueue(String queueName) throws QueueAccessException;
/**
* 资源管理器提交
*
* @throws MQException
*/
public void commit() throws QueueAccessException;
/**
* 资源管理器回滚
*
* @throws MQException
*/
public void rollback() throws QueueAccessException;
/**
* 重新连接队列管理器,仅供服务器连接方式使用.
* @param queueManager
* @throws QueueAccessException
*/
public void reconnect() throws QueueAccessException;
/**
* 查询是否存在此队列
* @param queueName
* 要查询队列的名称
* @return
* 若存在此则返回true,不存在则返回false
* @throws QueueAccessException
*/
public boolean queryQueue(String queueName) throws QueueAccessException;
/**
* 查看队列消息的深度
* @param queueName
* @return
* @throws QueueAccessException
*/
public int queryQueueDepth(String queueName) throws QueueAccessException;
}
2,实现类方法:IbmMqImpl.java
/**
* @author weiya
*
*/
public class IbmMqImpl implements IQueueManager {
private MQQueueManager qMgr;
private String queueManager;
private Destination destination;
private MQConsoleImpl mqc;
private static final Logger logger = Logger.getLogger(IbmMqImpl.class);
private Map<String, MQQueue> putQueues = new Hashtable<String, MQQueue>();
private Map<String, MQQueue> getQueues = new Hashtable<String, MQQueue>();
private Map<String, MQQueue> browseQueues = new Hashtable<String, MQQueue>();
/**
* 联接方式
*
* @roseuid 447FA3030128
*/
public IbmMqImpl(String queueManager) throws QueueAccessException {
try {
this.queueManager = queueManager;
qMgr = new MQQueueManager(queueManager);
} catch (MQException e) {
throw new QueueAccessException("Using server mode,connect queue manager " + queueManager + " error.", e);
}
}
// 客户机连接方式
@SuppressWarnings( { "unchecked", "deprecation" })
public IbmMqImpl(String hostName, int port, int charSet, String qmgrName, String channel) throws QueueAccessException {
MQEnvironment.hostname = hostName;
MQEnvironment.port = port;
MQEnvironment.channel = channel;
MQEnvironment.CCSID = charSet;
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
try {
qMgr = new MQQueueManager(qmgrName);
} catch (MQException e) {
throw new QueueAccessException("Using client mode,connect queue manager " + qmgrName + " error.", e);
}
}
/**
* 得到浏览消息队列的实例
*/
@SuppressWarnings("deprecation")
private MQQueue getBrowseQueue(String queueName) throws MQException {
MQQueue queue = null;
queue = (MQQueue) browseQueues.get(queueName);
if (queue == null) {
//int openOptions = MQC.MQOO_BROWSE | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE | MQC.MQOO_BIND_NOT_FIXED | MQC.MQOO_BIND_ON_OPEN;
int openOptions = MQC.MQOO_BROWSE | MQC.MQOO_INPUT_SHARED|MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_BIND_NOT_FIXED ;
queue = qMgr.accessQueue(queueName, openOptions);
browseQueues.put(queueName, queue);
}
return queue;
}
/**
* 得到获取消息队列的实例
*/
@SuppressWarnings("deprecation")
private MQQueue getGetQueue(String queueName) throws MQException {
MQQueue queue = null;
queue = (MQQueue) getQueues.get(queueName);
if (queue == null) {
//int openOptions = MQC.MQOO_INPUT_SHARED | MQC.MQOO_BIND_ON_OPEN | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE | MQC.MQOO_BIND_NOT_FIXED;
int openOptions = MQC.MQOO_BROWSE | MQC.MQOO_INPUT_SHARED|MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_BIND_NOT_FIXED ;
queue = qMgr.accessQueue(queueName, openOptions);
getQueues.put(queueName, queue);
}
return queue;
}
/**
* 得到发送消息队列的实例
*/
@SuppressWarnings("deprecation")
private MQQueue getPutQueue(String queueName) throws MQException {
MQQueue queue = null;
queue = (MQQueue) putQueues.get(queueName);
if (queue == null) {
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_BIND_ON_OPEN;
//int openOptions = MQC.MQOO_BROWSE | MQC.MQOO_INPUT_SHARED|MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_BIND_NOT_FIXED ;
queue = qMgr.accessQueue(queueName, openOptions);
putQueues.put(queueName, queue);
}
return queue;
}
/**
* 发送消息
*
* @param b
* 消息内容
* @param queueName
* 队列名称
* @roseuid 447FA303013C
*/
@SuppressWarnings("deprecation")
public void putMessage(byte[] b, String queueName) throws QueueAccessException {
MQQueue mqPut = null;
try {
mqPut = getPutQueue(queueName);
// 设置放消息时的参数
MQPutMessageOptions mpmo = new MQPutMessageOptions();
//mpmo.options = mpmo.options | MQC.MQPMO_SYNCPOINT;
// mpmo.options = mpmo.options + MQC.MQGMO_BROWSE_FIRST;
// mpmo.options = mpmo.options | MQC.MQPMO_NO_SYNCPOINT;
// mpmo.options = mpmo.options | MQC.MQPMO_FAIL_IF_QUIESCING;
MQMessage mqMessage = new MQMessage();
mqMessage.messageFlags = MQC.MQMF_SEGMENTATION_ALLOWED;
mqMessage.characterSet = 1208;
// 准备用户数据消息
mqMessage.write(b);
mqPut.put(mqMessage, mpmo);
} catch (MQException e) {
if (e.completionCode == MQException.MQCC_FAILED && e.reasonCode == MQException.MQRC_UNKNOWN_OBJECT_NAME) {
throw new InvalidQueueException(queueName + " MQException occur when getting the messsage.", e);
} else {
throw new QueueAccessException(queueName + " MQException occur when sending the messsage.", e);
}
} catch (IOException e) {
throw new QueueAccessException(queueName + " IOException occur when sending the messsage.", e);
}
}
/**
* 从队列中取得消息
*
* @param queueName
* @return byte[]
* @roseuid 447FA3030178
*/
@SuppressWarnings("deprecation")
public byte[] getMessage(String queueName) throws QueueAccessException {
byte[] bb = null;
MQQueue mqGet = null;
try {
mqGet = getGetQueue(queueName);
// 设置取消息时的参数
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = gmo.options + MQC.MQGMO_BROWSE_FIRST;
// gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;
gmo.options = gmo.options + MQC.MQGMO_WAIT;
gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.options = gmo.options + MQC.MQGMO_COMPLETE_MSG;
gmo.options = gmo.options + MQC.MQOO_BIND_NOT_FIXED;
gmo.waitInterval = 3000;
MQMessage inMsg = new MQMessage();
mqGet.get(inMsg, gmo);
bb = new byte[inMsg.getDataLength()];
inMsg.readFully(bb);
} catch (MQException e) {
if (!(e.completionCode == MQException.MQCC_FAILED && e.reasonCode == MQException.MQRC_NO_MSG_AVAILABLE)) {
throw new QueueAccessException(queueName + " MQException occur when getting the messsage.", e);
}
} catch (IOException e) {
throw new QueueAccessException(queueName + " IOException occur when getting the messsage.", e);
}
return bb;
}
/**
* 从队列中浏览消息
*
* @param queueName
* @return byte[]
* @roseuid 447FA30301A0
*/
@SuppressWarnings("deprecation")
public byte[] browseMessage(String queueName) throws QueueAccessException {
byte[] b = null;
MQQueue browseQueue = null;
try {
browseQueue = getBrowseQueue(queueName);
// // 设置取消息时的参数
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = gmo.options + MQC.MQGMO_BROWSE_FIRST;
gmo.options = gmo.options + MQC.MQGMO_WAIT;
gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.options = gmo.options + MQC.MQGMO_COMPLETE_MSG;
gmo.options = gmo.options + MQC.MQOO_BIND_NOT_FIXED;
gmo.waitInterval = 3000;
// 设置取消息时的参数
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = gmo.options + MQC.MQGMO_BROWSE_FIRST;
gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.options = gmo.options + MQC.MQGMO_COMPLETE_MSG;
// gmo.options = gmo.options + MQC.MQGMO_WAIT;
// gmo.waitInterval = MQC.MQWI_UNLIMITED ;
MQMessage inMsg = new MQMessage();
browseQueue.get(inMsg, gmo);
b = new byte[inMsg.getDataLength()];
inMsg.readFully(b);
// logger.info("消息深度="+browseQueue.getCurrentDepth());
} catch (MQException e) {
if (e.completionCode == MQException.MQCC_FAILED && e.reasonCode == MQException.MQRC_UNKNOWN_OBJECT_NAME) {
throw new InvalidQueueException(queueName + " MQException occur when browsing the messsage.", e);
} else if (!(e.completionCode == 2 && e.reasonCode == 2033)) {
throw new QueueAccessException(queueName + " MQException occur when browsing the messsage.", e);
}
} catch (IOException e) {
throw new QueueAccessException(queueName + " IOException occur when browsing the messsage.", e);
} catch (NumberFormatException e) {
throw new QueueAccessException(queueName + " NumberFormatException occur when browsing the messsage.", e);
}
return b;
}
/**
* @param queueName
* @roseuid 447FA30301BE
*/
@SuppressWarnings("deprecation")
public void deleteMessage(String queueName) throws QueueAccessException {
MQQueue mqGet = null;
try {
mqGet = getGetQueue(queueName);
// 设置取消息时的参数
MQGetMessageOptions gmo = new MQGetMessageOptions();
// gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;
gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.options = gmo.options + MQC.MQGMO_COMPLETE_MSG;
MQMessage inMsg = new MQMessage();
mqGet.get(inMsg, gmo);
} catch (MQException e) {
throw new QueueAccessException(queueName + " MQException occur when deleting the messsage.", e);
}
}
/**
* @roseuid 447FA30301F0
*/
public void release() throws QueueAccessException {
releaseQueue(putQueues);
releaseQueue(getQueues);
releaseQueue(browseQueues);
if (qMgr != null) {
try {
qMgr.close();
qMgr.disconnect();
} catch (MQException e) {
qMgr = null;
throw new QueueAccessException("MQException occur when releasing the resource.", e);
}
qMgr = null;
}
}
public void releaseQueue(String queueName) throws QueueAccessException {
if (queueName == null || queueName.equals(""))
return;
try {
MQQueue mqQueue = null;
mqQueue = putQueues.get(queueName);
if (mqQueue != null)
mqQueue.close();
mqQueue = getQueues.get(queueName);
if (mqQueue != null)
mqQueue.close();
mqQueue = browseQueues.get(queueName);
if (mqQueue != null)
mqQueue.close();
putQueues.remove(queueName);
getQueues.remove(queueName);
browseQueues.remove(queueName);
} catch (MQException e) {
e.printStackTrace();
}
}
private void releaseQueue(Map<String, MQQueue> queues) throws QueueAccessException {
String queueName = null;
MQQueue mqQueue = null;
for (Iterator<String> it = queues.keySet().iterator(); it.hasNext();) {
queueName = (String) it.next();
mqQueue = queues.get(queueName);
if (mqQueue != null) {
try {
mqQueue.close();
} catch (MQException e) {
throw new QueueAccessException("MQException occur when releasing the resource.", e);
}
mqQueue = null;
}
}
queues.clear();
}
/**
* @roseuid 447FA30301FA
*/
public void commit() throws QueueAccessException {
if (qMgr != null) {
try {
qMgr.commit();
} catch (MQException e) {
throw new QueueAccessException("MQException occur when committing the resource.", e);
}
}
}
/**
* @roseuid 447FA303020E
*/
public void rollback() throws QueueAccessException {
if (qMgr != null) {
try {
qMgr.backout();
} catch (MQException e) {
throw new QueueAccessException("MQException occur when rollback the resource.", e);
}
}
}
public void reconnect() throws QueueAccessException {
release();
try {
qMgr = new MQQueueManager(queueManager);
} catch (MQException e) {
throw new QueueAccessException("Using server mode,connect queue manager " + queueManager + " error.", e);
}
}
public boolean queryQueue(String queueName) throws QueueAccessException {
boolean flag = false;
if (mqc == null) {
MQConditionPo mp = new MQConditionPo();
mp.setConnectionType(MQConditionPo.SERVER_CONNECTION_TYPE);
mp.setQueueManagerName(queueManager);
try {
mqc = new MQConsoleImpl(mp);
} catch (QueueAccessException e) {
if (mqc != null)
mqc.release();
mqc = null;
throw new QueueAccessException("Using server mode,get agent (" + queueManager + ") error.", e);
}
}
try {
flag = mqc.queryQueue(queueName);
} catch (QueueAccessException e) {
mqc = null;
throw new QueueAccessException("Using server mode,query queue (" + queueName + ") error.", e);
}
return flag;
}
public int queryQueueDepth(String queueName) throws QueueAccessException {
MQQueue browseQueue = null;
try {
browseQueue = getBrowseQueue(queueName);
return browseQueue.getCurrentDepth();
} catch (MQException e) {
if (!(e.completionCode == 2 && e.reasonCode == 2033)) {
throw new QueueAccessException(queueName + " MQException occur when querying the queue(" + queueName + ") depth.", e);
}
} catch (NumberFormatException e) {
throw new QueueAccessException(queueName + " NumberFormatException occur when querying the queue(" + queueName + ") depth.", e);
}
return 0;
}
@SuppressWarnings("deprecation")
public IMessage browseNextMessage(String queueName) throws QueueAccessException {
QMessage qMessage = null;
byte[] b = null;
MQQueue browseQueue = null;
try {
browseQueue = getBrowseQueue(queueName);
// 设置取消息时的参数
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = gmo.options + MQC.MQGMO_BROWSE_NEXT;
gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.options = gmo.options + MQC.MQGMO_COMPLETE_MSG;
MQMessage inMsg = new MQMessage();
browseQueue.get(inMsg, gmo);
b = new byte[inMsg.getDataLength()];
inMsg.readFully(b);
qMessage = new QMessage();
qMessage.setMessageContent(b);
qMessage.setMQMessageId(inMsg.messageId);
int d1 = browseQueue.getMaximumMessageLength();
int d2 = qMessage.getMessageContent().length;
//System.out.print("MQMessageId-->"+Base64Util.encode(new String(inMsg.messageId))+"\n");
if (d1<d2){
logger.info("队列大小限制为"+d1+",但实际大小为"+d2+",所以是分段,建议扩大启动脚本的虚拟内存.");
//deleteMessage(queueName, inMsg.messageId);
}
} catch (MQException e) {
if (e.completionCode == MQException.MQCC_FAILED && e.reasonCode == MQException.MQRC_UNKNOWN_OBJECT_NAME) {
throw new InvalidQueueException(queueName + " MQException occur when browsing the messsage.", e);
} else if (!(e.completionCode == 2 && e.reasonCode == 2033)) {
throw new QueueAccessException(queueName + " MQException occur when browsing the messsage.", e);
}
} catch (IOException e) {
throw new QueueAccessException(queueName + " IOException occur when browsing the messsage.", e);
} catch (NumberFormatException e) {
throw new QueueAccessException(queueName + " NumberFormatException occur when browsing the messsage.", e);
}
return qMessage;
}
@SuppressWarnings("deprecation")
public void deleteMessage(String queueName, byte[] messageId) throws QueueAccessException {
// 若消息ID为空,则返回
if (messageId == null) {
return;
}
MQQueue mqGet = null;
try {
mqGet = getGetQueue(queueName);
// 设置取消息时的参数
MQGetMessageOptions gmo = new MQGetMessageOptions();
// gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;
gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.options = gmo.options + MQC.MQGMO_COMPLETE_MSG;
gmo.matchOptions = MQC.MQMO_MATCH_MSG_ID;
MQMessage inMsg = new MQMessage();
inMsg.messageId = messageId;
mqGet.get(inMsg, gmo);
} catch (MQException e) {
throw new QueueAccessException(queueName + " MQException occur when deleting the messsage.", e);
}
}
public void putMessage(String msg, String queueName) throws QueueAccessException {
this.putMessage(msg.getBytes(), queueName);
}
public IMessage browseMessageN(String queueName) throws QueueAccessException {
// TODO Auto-generated method stub
return null;
}
}