一、概述
以下代码可以实现读取一个文件夹内的所有文件,然后将文件转为字节流、放入IBM_MQ队列中(发送方代码)
;
接收方获取到流后转为文件即可。
注意,以下代码的字节流由两部分组成,约定的字符串+文件,接收方也需要按格式接收;如果不需要这样写,就自行修改,只发送文件即可。
二、代码
1.需要的jar包
com.ibm.mq-9.1.0.3.jar
com.ibm.mq.jmqi-9.1.0.3.jar
com.ibm.mq.allclient-9.0.0.jar
2.配置类ConfigUtil.java
这个类里有些ibm_mq的配置相关,例如队列名称等,代码如下:
import java.util.HashMap;
/**
* 配置类
*/
public class ConfigUtil {
//mq服务器的ip
private static final String IBM_MQ_host = "10.123.123.123";
//queue
private static final String IBM_MQ_Queue = "xxx.xxx.queue";
//mq管理器的名字
private static final String IBM_MQ_Manager = "xxx.xxx.manager";
//channel
private static final String IBM_MQ_channel = "xxx.xxx.CHANNEL";
//port
private static final String IBM_MQ_port = "1414";
//ccsid
private static final String IBM_MQ_ccsid = "1381";
//待上传的文件夹路径
private static final String FILE_PATH = "f:/pdf/";
private static final HashMap<String,String> map;
static {
map = new HashMap();
map.put("IBM_MQ_host",IBM_MQ_host);
map.put("IBM_MQ_channel",IBM_MQ_channel);
map.put("IBM_MQ_port",IBM_MQ_port);
map.put("IBM_MQ_ccsid",IBM_MQ_ccsid);
map.put("IBM_MQ_Queue",IBM_MQ_Queue);
map.put("IBM_MQ_Manager",IBM_MQ_Manager);
map.put("FILE_PATH",FILE_PATH);
}
private static final ConfigUtil cu = new ConfigUtil();
public static ConfigUtil getInstance(){
return cu;
}
public static HashMap<String,String> getConfigMap(){
return map;
}
}
3.工具类IBMMQUtil.java
这个类是发送mq的工具类,代码如下:
import com.ibm.mq.*;
import java.io.*;
public class IBMMQUtil {
/**
* 把数据放入队列中
*/
private static void putQueue(MQQueue queue, byte[] obj) throws Exception {
try {
//放置消息选项,用默认设置
MQPutMessageOptions pmo = new MQPutMessageOptions();
MQMessage outmsg = new MQMessage();
outmsg.format = MQC.MQFMT_STRING;
outmsg.write(obj, 0, obj.length);
queue.put(outmsg, pmo);
} catch (MQException e) {
System.out.println("把数据放入队列失败:an mq error ocurred : completion code is : "
+ e.completionCode + " The reason code is : "
+ e.reasonCode);
throw e;
} catch (Exception ee) {
System.out.println("把数据放入队列失败:"+ ee.getMessage());
throw ee;
}
}
/**
* Enviroment 配置
*/
private static void configEnviroment() {
String hostname = ConfigUtil.getInstance().getConfigMap().get("IBM_MQ_host");
String channel = ConfigUtil.getInstance().getConfigMap().get("IBM_MQ_channel");
String port = ConfigUtil.getInstance().getConfigMap().get("IBM_MQ_port");
String ccsid = ConfigUtil.getInstance().getConfigMap().get("IBM_MQ_ccsid");
MQEnvironment.hostname =hostname;
MQEnvironment.channel = channel;
MQEnvironment.port = Integer.valueOf(port);
MQEnvironment.CCSID = Integer.valueOf(ccsid);
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
}
public static byte[] getBytesFromFile(String strfilename) throws Exception {
InputStream is = null;
byte[] bytes;
try {
File file = new File(strfilename);
is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
return null;
}
bytes = new byte[(int) length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
if (offset < bytes.length) {
throw new IOException("Could not completely read file "
+ file.getName());
}
return bytes;
} catch (Exception e) {
System.out.println(e);
throw e;
}finally{
if(is!=null){
is.close();
}
}
}
public static Boolean upload(String path, String mqQueue, String mqQueueManager, String fileName) {
MQQueue queue = null;
MQQueueManager qMgr = null;
try {
System.out.println("start");
configEnviroment();
qMgr = new MQQueueManager(mqQueueManager);// 建立MQ队列管理器连接
System.out.println("read MQ config success");
ByteArrayOutputStream oOutputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(oOutputStream);
//TODO ---------------注意,这里是先约定了格式,先在流里写一个字节数组,然后在流里写一个pdf文件;读取方也需要先读字节数组、后读pdf才行----------------------
//如果不需要这样写,把这个注释就行,只写pdf字节数组即可
//这个是字节数组
oos.writeObject(new String[]{"pdf",fileName});
//TODO ---------------特殊格式到此为止----------------------
byte[] bytes = getBytesFromFile(path); // pdf文件转为字节数组
//这个是pdf文件
oos.writeObject(bytes);// 把pdf文件写入
byte[] bImage = oOutputStream.toByteArray(); //然后oOutputStream就有值了,获取到其中的字节数组(2部分,约定的字节数组+pdf字节数组)
oos.close();
oOutputStream.close();
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
queue = qMgr.accessQueue(mqQueue, openOptions, null, null, null);
putQueue(queue, bImage); //把字节数组放入IBM_MQ
System.out.println("文件:"+path+",把数据放入IBM_MQ队列成功");
return true;
} catch (Exception e) {
System.out.println("文件:"+path+",把数据放入IBM_MQ队列失败"+e.toString());
return false;
}finally{
if (qMgr != null && qMgr.isConnected())
try {
if (queue != null && queue.isOpen()) {
queue.close();
queue = null;
}
if (qMgr.isOpen())
qMgr.close();
qMgr.disconnect();
qMgr = null;
}catch (Exception e) {
System.out.println(e);
}
}
}
}
4.主类Main.java
这个类是程序入口类,里面有main方法,代码如下:
import java.io.File;
public class Main {
/**
* main方法,可以把文件转为字节流放入ibm_mq队列(任意文件都行,不是只pdf才行)
*/
public static void main(String[] args) throws Exception {
//调用把pdf放入ibm_mq队列的方法
//这个是文件夹路径,会把文件夹里的所有文件都推送过去
uploadPdf(ConfigUtil.getInstance().getConfigMap().get("FILE_PATH"));
}
public static void uploadPdf(String path){
File file=new File(path);
//找到文件夹下的所有文件的名字
String[] names=file.list();
System.out.println("开始执行pdf推送IBM_MQ,待推送文件夹为--"+path);
boolean flag=false;
int count=0;
for(String name:names){
System.out.println("文件名称为:"+name);
String fwpath=path+name;//实际文件地址
File File;
try {
File = new File(fwpath);
//传入文件路径,mq队列名,mq管理器名,文件名
flag = IBMMQUtil.upload(fwpath, ConfigUtil.getInstance().getConfigMap().get("IBM_MQ_Queue"),ConfigUtil.getInstance().getConfigMap().get("IBM_MQ_Manager"), name);
if(flag==true){//根据调用方法是否成功怕段是否删除服务器上的文件
System.out.println("上传成功,返回true");
if (File.exists()) {
//File.delete();
//System.out.println("删除上传成功的文件");
}
}
count = count+1;
} catch (Exception e) {
System.out.println("文件上传出现异常!");
e.printStackTrace();
}
}
System.out.println("推送所有文件结束");
}
}