Java把文件放入IBM_MQ队列的代码

一、概述

以下代码可以实现读取一个文件夹内的所有文件,然后将文件转为字节流、放入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("推送所有文件结束");

    }



}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您想了解如何使用Java的onMessage监听IBM MQ消息队列,是吗? 首先,您需要确保您已经安装了IBM MQ客户端,并且您已经设置了必要的连接参数和队列管理器名称。 接下来,您可以使用Java的JMS(Java Message Service)API来编写消息监听器。以下是一个简单的示例代码: ```java import javax.jms.*; import com.ibm.mq.jms.MQConnectionFactory; import com.ibm.mq.jms.MQQueueConnectionFactory; public class MQListener implements MessageListener { public static void main(String[] args) throws Exception { MQConnectionFactory factory = new MQQueueConnectionFactory(); factory.setHostName("localhost"); factory.setPort(1414); factory.setChannel("myChannel"); factory.setQueueManager("myQueueManager"); Connection connection = factory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue("myQueue"); MessageConsumer consumer = session.createConsumer(queue); consumer.setMessageListener(new MQListener()); connection.start(); System.out.println("Listening for messages..."); } public void onMessage(Message message) { try { System.out.println("Received message: " + message.getBody(String.class)); } catch (JMSException e) { e.printStackTrace(); } } } ``` 在这个例子中,我们创建了一个MQListener类,实现了MessageListener接口。我们使用MQConnectionFactory创建了一个连接,并指定了连接参数。然后,我们创建了一个会话、一个队列和一个消息消费者。最后,我们将MessageListener添加到消息消费者中,并启动连接。 当有新的消息到达队列时,onMessage方法会被调用,并且我们可以在方法中处理该消息。 请注意,上述示例仅适用于IBM MQ。如果您要使用其他消息队列,您需要使用相应的JMS API和连接工厂。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐梦想永不停

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值