IBM MQ开发通用方法,包括客户端连接、服务器端连接、发送接受消息

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;
	}

}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值