WebSphere MQ发送文件范例

最近在研究使用WebSphere MQ发送、接收文件。

package com.genersoft.test;
 import java.io.File;
 import java.io.FileInputStream;
 import com.ibm.mq.MQC;
 import com.ibm.mq.MQEnvironment;
 import com.ibm.mq.MQException;
 import com.ibm.mq.MQMessage;
 import com.ibm.mq.MQPutMessageOptions;
 import com.ibm.mq.MQQueue;
 import com.ibm.mq.MQQueueManager;
 /**
 *
 * @author fts
 * @date 2016-01-22
 * @功能 发送文件
 *
 */
 public class MQFileSender {
 final int BUFFER_LEN = 1024*1024*3;
 private MQQueueManager qmgr;
 private MQQueue outQueue;
 private String queueName = “RECVQ”;
 private String host = “10.24.1.20”;
 private int port = 1414;
 private int ccsid = 1381;
 private String channel = “RECVQCHANNEL”;
 private String qmgrName = “GATEWAY1”;
 private MQMessage outMsg;
 private MQPutMessageOptions pmo;
 private String fileName = “D:\\1.jpg”;
 //private String fileName = “D:\\OperateFile\\New.java”;
 public static void main(String args[]) {
 MQFileSender mfs = new MQFileSender();
 mfs.runGoupSender();
 }
 public void runGoupSender() {
 try {
 init();
 sendGroupMessages();
 qmgr.commit();
 System.out.println(“\n Messages successfully Send “);
 } catch (MQException mqe) {
 mqe.printStackTrace();
 try {
 System.out.println(“\n Backing out Transaction “);
 qmgr.backout();
 System.exit(2);
 } catch (Exception e) {
 e.printStackTrace();
 System.exit(2);
 }
 } catch (Exception e) {
 e.printStackTrace();
 System.exit(2);
 }
 }
 private void init() throws Exception {
 /** 设置MQEnvironment 属性以便客户机连接 */
 MQEnvironment.hostname = host;
 MQEnvironment.channel = channel;
 MQEnvironment.port = port;
 MQEnvironment.CCSID = ccsid;
 // MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,MQC.TRANSPORT_WEBSPHERE
 // MQ);
 /* 连接到队列管理器 */
 qmgr = new MQQueueManager(qmgrName);
 /* 设置队列打开选项以便输出 */
 int opnOptn = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
 outQueue = qmgr.accessQueue(queueName, opnOptn, null, null, null);
 }
 public void sendGroupMessages() throws Exception {
 /* 设置放置消息选项 */
 pmo = new MQPutMessageOptions();
 pmo.options = pmo.options + MQC.MQPMO_LOGICAL_ORDER;
 pmo.options = pmo.options + MQC.MQPMRF_GROUP_ID;
 outMsg = new MQMessage();
 /* 设置消息标记,表示该消息属于组 */
 outMsg.messageFlags = MQC.MQMF_MSG_IN_GROUP;
 FileInputStream fis = new FileInputStream(new File(fileName));
 byte buffer[] = new byte[BUFFER_LEN];
 int count = 0;
 while (true) {
 count = fis.read(buffer, 0, BUFFER_LEN);
 if(count == -1){
 break;
 }
 outMsg.write(buffer,0,count);
 if(count < BUFFER_LEN){
 outMsg.messageFlags = MQC.MQMF_LAST_MSG_IN_GROUP;
 }
 outQueue.put(outMsg, pmo);
 outMsg.clearMessage();
 }
 fis.close();
 }
 }

接收文件代码:

package com.genersoft.test;
 import java.io.File;
 import java.io.FileOutputStream;
 import com.ibm.mq.MQC;
 import com.ibm.mq.MQEnvironment;
 import com.ibm.mq.MQException;
 import com.ibm.mq.MQGetMessageOptions;
 import com.ibm.mq.MQMessage;
 import com.ibm.mq.MQQueue;
 import com.ibm.mq.MQQueueManager;
 /**
 *
 * @author futsh
 * @date 2016-01-22
 * @功能 接收文件
 *
 */
 public class MQFileReceiver {
 private MQQueueManager qmgr;
 private MQQueue inQueue;
 private String queueName = “RECVQ”;
 private String host = “10.24.1.20”;
 private int port = 1414;
 private int ccsid = 1381;
 private String channel = “RECVQCHANNEL”;
 private String qmgrName = “GATEWAY1”;
 private MQMessage inMsg;
 private MQGetMessageOptions gmo;
 private String fileName = “D:\\2.jpg”;
 //private String fileName = “D:\\OperateFile\\mq\\New.java”;
 public static void main(String args[]) {
 MQFileReceiver mfr = new MQFileReceiver();
 mfr.runGoupReceiver();
 }
 public void runGoupReceiver() {
 try {
 init();
 getGroupMessages();
 qmgr.commit();
 System.out.println(“\n Messages successfully Receive “);
 } catch (MQException mqe) {
 mqe.printStackTrace();
 try {
 System.out.println(“\n Backing out Transaction “);
 qmgr.backout();
 System.exit(2);
 } catch (Exception e) {
 e.printStackTrace();
 System.exit(2);
 }
 } catch (Exception e) {
 e.printStackTrace();
 System.exit(2);
 }
 }
 private void init() throws Exception {
 /* 为客户机连接设置MQEnvironment 属 */
 MQEnvironment.hostname = host;
 MQEnvironment.channel = channel;
 MQEnvironment.port = port;
 MQEnvironment.CCSID = ccsid;
 /* 连接到队列管理器 */
 qmgr = new MQQueueManager(qmgrName);
 /* 设置队列打开选项以输 */
 int opnOptn = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING;
 /* 打开队列以输 */
 inQueue = qmgr.accessQueue(queueName, opnOptn, null, null, null);
 }
 public void getGroupMessages() throws Exception {
 /* 设置获取消息选项 */
 gmo = new MQGetMessageOptions();
 gmo.options = MQC.MQGMO_FAIL_IF_QUIESCING;
 gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;
 /* 等待消息 */
 gmo.options = gmo.options + MQC.MQGMO_WAIT;
 /* 设置等待时间限制 */
 gmo.waitInterval = 5000;
 /* 只获取消息*/
 gmo.options = gmo.options + MQC.MQGMO_ALL_MSGS_AVAILABLE;
 /* 以辑顺序获取消息 */
 gmo.options = gmo.options + MQC.MQGMO_LOGICAL_ORDER;
 gmo.matchOptions = MQC.MQMO_MATCH_GROUP_ID;
 /* 创建消息缓冲*/
 inMsg = new MQMessage();
 FileOutputStream fos = new FileOutputStream(new File(fileName));
 /* 处理组消息*/
 while (true) {
 inQueue.get(inMsg, gmo);
 int msgLength = inMsg.getMessageLength();
 byte[] buffer = new byte[msgLength];
 inMsg.readFully(buffer);
 fos.write(buffer, 0, msgLength);
 char x = gmo.groupStatus;
 /*查看是否是最后消息标*/
 if (x == MQC.MQGS_LAST_MSG_IN_GROUP) {
 System.out.println(“Last Msg in Group”);
 break;
 }
 inMsg.clearMessage();
 }
 fos.close();
 }
 }

有时候可能会出现如下错误:

Exception in thread “main” java.lang.NoClassDefFoundError: javax/resource/ResourceException
 at com.ibm.mq.MQEnvironment. <clinit>(MQEnvironment.java:441)
 at com.ibm.mq.pcf.PCFAgent.connect(PCFAgent.java:276)
 at com.ibm.mq.pcf.PCFAgent. <init>(PCFAgent.java:190)
 at com.ibm.mq.pcf.PCFMessageAgent. <init>(PCFMessageAgent.java:160)
 at MQTest.MQTestMain.testName(MQTestMain.java:33)
 at MQTest.MQTestMain.main(MQTestMain.java:17)

解决: 增加 mq_install\java\lib到你的PATH javax/resource/ResourceException 这个类是在connector.jar中

附:connector.jar以及com.ibm.mq.jar

MQ所需jar包

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员叨叨叨

【PHP】Propel的使用,看这一篇就够了

本文为学习Propel框架使用的笔记,默认已经安装好Propel环境,若有读者不知如何安装Propel,可参考《听说你PHP配置Composer遇到了一些困境》...

2845
来自专栏Golang语言社区

go语言的sql包原理与用法分析

本文实例讲述了go语言的sql包原理与用法。分享给大家供大家参考,具体如下: go的sql包是在pkg/database中,里面的两个包sql和sql/driv...

4336
来自专栏Golang语言社区

go语言的sql包原理与用法分析

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。...

2924
来自专栏用户2442861的专栏

初学Redis(2)——用Redis作为Mysql数据库的缓存

http://blog.csdn.net/qtyl1988/article/details/39519951

1462
来自专栏用户2442861的专栏

如何给10^7个数据量的磁盘文件排序

第一节、如何给磁盘文件排序 问题描述: 输入:一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件,其中每个数都小于等于n,且n=...

602
来自专栏Flutter&Dart

DartVM服务器开发(第二十一天)--Dart中的Gson(jaguar_serializer)

将上面的Info改为List<Info> 重新运行命令pub run build_runner build 转换跟上面一样

1451
来自专栏恰同学骚年

Hadoop学习笔记—7.计数器与自定义计数器

  在上图所示中,计数器有19个,分为四个组:File Output Format Counters、FileSystemCounters、File Input...

972
来自专栏Greenplum

Greenplum 对JSON的支持

源文章:http://www.postgresqltutorial.com/postgresql-json/

641
来自专栏xiaoheike

Hibernate save, saveOrUpdate, persist, merge, update 区别

hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思。我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保...

1143
来自专栏逸鹏说道

如何让所有实体类用相同名称的主键(很有力的问题,比如所有表实体主键都用ID)

这个问题比较有力量,哈哈! 例如:有两个表userbases和products 两个表的主键分别为UserID和ProductID,那么,我想问有没有一种方法把...

3085

扫码关注云+社区