IBMMQ之取发文件

package com.citic.main;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.PrintStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.regex.Pattern;

import com.citic.util.*;
import com.citic.util.comm.*;
import com.citic.msgutil.ProImpl;

/**
 * 本类功能:作为二级主类,上接MAIN方法,下接其它操作子类,主要对报文进行发送接收
 * 落脚点在发送MSG方法上:sendmsgs,最终由此方法提交并关闭MQ队列管理器
 * 不管发送还是接收报文,最终都要保证会调用sendmsgs方法
 * @author db2admin
 *
 */
public class MessageProcess implements IConstants{
    private static String[] MQString = null;
    private static int readcnt=5;
    private static String dval=ConfigFileUtil.getValue("debuglevel");
    private static int debuglevel=("".equals(dval)?ALL:Integer.parseInt(dval));
    private static MQUtil mqutil=new MQUtil();
    private int i=100;
    /*
    public static void main(String[] args) throws Exception{
        //log2file(ConfigFileUtil.getInstance().getPathName(".."));
        boolean fileflag=false;
        processOutMessage("d:\\data\\supis\\data\\datalist.txt");
    }*/
    
    //0.日志处理
    private static void log2file(String filepth){
        try {
            File tfile = new File(filepth + "logs/");
            if (!tfile.exists()) {
                tfile.mkdir();
            }

            FileOutputStream out = new FileOutputStream(tfile.getPath()
                    + "/systemout" + CommFun.strNow().substring(0, 8) + ".txt", true);
            FileOutputStream errout = new FileOutputStream(tfile.getPath()
                    + "/systemerrout" + CommFun.strNow().substring(0, 8) + ".txt", true);
            
            PrintStream ps = new PrintStream(out);
            PrintStream pserr = new PrintStream(errout);
            System.setOut(ps);
            System.setErr(pserr);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public static void processInMessage(String dataDate, final String filepatten,String sendpath) {
        String filePath = ((sendpath==null || "".equals(sendpath))?ConfigFileUtil.getInstance().getPathName(dataDate)+"send":sendpath);
        CommFun.log(debuglevel, "filePath:"+filePath+",dataDate:"+dataDate+",filepatten:"+filepatten);
        File file = new File(filePath);
        File[] filelist = file.listFiles(new FilenameFilter() {
            private Pattern pattern = Pattern.compile(filepatten.replace("_R",
                    "") + ".*\\.xml");

            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(name).matches();
            }
        });
        String[] files=new String[filelist.length];
        int i=0;
        for (File f : filelist) {
            // processInMessage(f.getAbsolutePath(),0);
            String fapth=f.getAbsolutePath();
            CommFun.log(debuglevel, "添加文件:"+fapth);
            files[i++]=fapth;
        }
        processInMessage(files,0,false);
        
    }
    
    /**
     * 1.3 2017-03-27 增加MQ的处理部分,如果传入readcnt无效,则需要读取config中的值
     * 接收报文:接收后需要分析报文入库,并产生回执和相应业务报文
     * 是1.1,1.2的主要逻辑实现
     * @param filename如果解析已有文件,则传入文件名,否则""
     * @param readcnt一次读取MQ的条数(不含重复条数)
     * @param redoflag是否重做标志,重做意味着不需要进行解析等流程,直接发送
     * @throws Exception
     */
    public static void processInMessage(String[] filename,int readcnt,boolean redoflag){
        CommFun.log(INFO,filename);
        boolean mqflag=false; //说明是MQ取的文件
        HashMap<String,String> hmmq=null;
        if (!"".equals(filename) && filename != null) {
            ConfigFileUtil.setValue("fileFlag", "true");
            //MQString = new String[] { filename };
            MQString = filename;
        } else {
            String rcnt = (readcnt > 0 ? String.valueOf(readcnt)
                    : ConfigFileUtil.getValue("readcnt"));
            //rcnt="";
            if (rcnt != null && !"".equals(rcnt)) {
                readcnt = Integer.parseInt(rcnt);
            }
            CommFun.log(INFO, "每次读取MQ条数为:"+readcnt+"!");
//            MQFileReceiver mqFileReceiver = new MQFileReceiver(readcnt);
            hmmq=mqutil.runGoupReceier(readcnt);
            
//            MQString = mqFileReceiver.getMQFileArray();
            if (hmmq==null || hmmq.size()<=0) {
                CommFun.log("没有取到MQ数据!退出!");
            }else{
                Object[] oba=hmmq.keySet().toArray();
                MQString=new String[oba.length];
                for(int i=0;i<oba.length;i++){
                    MQString[i]=(String) oba[i];
//                    System.out.println(MQString[i]+":"+MQString[i].getClass());
                }
            }
            mqflag=true;
        }
        if(MQString!=null){
            CommFun.log(debuglevel, "共获取MQ条数为:"+MQString.length);    
        }else{
            CommFun.log(debuglevel, "获取MQ条数为:0");
        }
        
        ProImpl pil=new ProImpl();
        HashMap<String,String> hm0=new HashMap<String, String>();
        HashMap<String,String> hm=null;
        for (int i = 0; MQString != null && i < MQString.length; i++) {
            hm=new HashMap<String, String>();
            CommFun.log(INFO,
                    "解析字串["+MQString.length+"-"+i+":原文件名为:"+(hmmq!=null && hmmq.size()>0?hmmq.get(MQString[i]):filename)+"]前300个字符:["
                            + (mqflag ? MQString[i].substring(0, 200)
                                    : MQString[i]) + "]");
            //对于重新处理标志,不进行解析程序,直接发送
            if(redoflag){
                hm.put(MQString[i], "");
            }else{
                CommFun.log(0,"解析文件:"+MQString[i]+"开始!");
                hm=pil.parserXml(MQString[i]);
                CommFun.log(0,"解析文件:"+MQString[i]+"完毕!");
            }
            
            StringBuffer[] stb = new StringBuffer[hm.size()];
            
            int i1 = 0;
            for (String s : hm.keySet()) {
                stb[i1++] = new StringBuffer(s + ":" + hm.get(s));
                hm0.put(s, "");
            }
            //0.对MQ提取的文件进行记载
            if (mqflag && hm.size() > 0) {
                CommFun.log(debuglevel, "MQ处理文件!");
                String tmpfilename = ConfigFileUtil.getInstance().getPathName()
                        + "docs" + File.separator + CommFun.strNowRand().substring(0, 8)
                        + ".txt";
                CommFun.log(INFO, tmpfilename);
                FileOperation.stringbuffer2file(stb, tmpfilename);
            }else{
                CommFun.log(debuglevel, "此次无文件发送,继续循环!");
                continue;
            }
        }
        //1.发送
        sendmsgs(hm0);
        CommFun.log(debuglevel, "处理完毕!");
    }
    
    public static void processOutMessage(String dataDate, final String filepatten){
        processOutMessage(dataDate,filepatten,"");
    }
    
    /**
     * 2.1对指定日期下的按模式匹配文件列表进行批量发送
     * @param dataDate
     * @param filepatten
     * @throws Exception
     */
    public static void processOutMessage(String dataDate, final String filepatten,String sendpath) {
        String filePath = ((sendpath==null || "".equals(sendpath))?ConfigFileUtil.getInstance().getPathName(dataDate)+"send":sendpath);
        CommFun.log(debuglevel, "filePath:"+filePath+",dataDate:"+dataDate+",filepatten:"+filepatten);
        File file = new File(filePath);
        File[] filelist = file.listFiles(new FilenameFilter() {
            private Pattern pattern = Pattern.compile(filepatten.replace("_S",
                    "").replace(".xml", "") + ".*\\.xml");

            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(name).matches();
            }
        });
        HashMap<String, String> hm = new HashMap<String, String>();
        for (File f : filelist) {
            // processInMessage(f.getAbsolutePath(),0);
            String fapth=f.getAbsolutePath();
            CommFun.log(debuglevel, "添加文件:"+fapth);
            hm.put(fapth, "");
        }
        sendmsgs(hm);
        CommFun.log(debuglevel, "通过通配符处理列表文件发送完毕,日期为:" + dataDate
                + ",filepattern:" + filepatten);
    }
    
    /**
     * 2.2输入文件,根据文件列表进行发送
     * @param filename
     */
    public static void processOutMessage(String filename) {
        if (filename == null || "".equals(filename)) {
            CommFun.log(debuglevel, "传入参数无效");
            return;
        }
        
        File file = new File(filename);
        if (!file.exists()) {
            CommFun.log(debuglevel, "[" + filename + "]不存在");
            throw new RuntimeException("[" + filename + "]不存在");
        }

        try {
            FileReader filereader = new FileReader(file);
            BufferedReader bf = new BufferedReader(filereader);
            String st;
            HashMap<String,String> hm=new HashMap<String, String>();
            while ((st = bf.readLine()) != null && !"".equals(st)) {
                CommFun.log(debuglevel, st);
                if(new File(st).exists()){
                    hm.put(st, "");    
                }else{
                    CommFun.log(debuglevel, "["+st+"]不存在!");
                }
            }
            sendmsgs(hm);
            CommFun.log(debuglevel, "通过列表文件发送完毕");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 2.3产生相应报文并发送
     * @param hm
     */
    public static void processOutMessage(String dateString, String msgtype,
            String sendType, String appendString, String sender) {
        ProImpl pil=new ProImpl();
        HashMap<String,String> hm0=new HashMap<String, String>();
        HashMap<String,String> hm=null;
        String[] msgtypes=msgtype.split(",");
        for(int i=0;i<msgtypes.length;i++){
            CommFun.log(ALL, "生成第[" + i + "]个报文:[" + msgtypes[i] + "]");
            hm=new HashMap<String, String>();
            hm=pil.createXml(Integer.parseInt(dateString),msgtypes[i],sendType,appendString,sender);
            //0.对MQ提取的文件进行记载
            if (hm.size() > 0) {
                CommFun.log(debuglevel, "MQ处理文件!");
                StringBuffer[] stb = new StringBuffer[hm.size()];
                int i1 = 0;
                CommFun.log(DATA, "需要发送以下["+hm.size()+"]个文件!");
                for (String s : hm.keySet()) {
                    String tmpmsgid=hm.get(s);
                    stb[i1++] = new StringBuffer(s + ":" + tmpmsgid);
                    hm0.put(s, tmpmsgid);
                    CommFun.log(DATA, s + ":" + tmpmsgid);
                }
                String tmpfilename = ConfigFileUtil.getInstance().getPathName()
                        + "docs" + File.separator + CommFun.strNowRand().substring(0, 8)
                        + ".txt";
                CommFun.log(DATA, tmpfilename);
                FileOperation.stringbuffer2file(stb, tmpfilename);
            }else{
                CommFun.log(debuglevel, "此次无文件发送,继续坛坛循环!");
                continue;
            }
        }
        
        String flagstr=ConfigFileUtil.getValue("sendflag");
        boolean sendflag=false;
        if(flagstr.length()>0 && flagstr.toUpperCase().startsWith("Y")){
            sendflag=true;
        }
        
        if(sendflag){
            CommFun.log(DATA,"发送文件:"+hm0.toString());
        }else{
            hm0=new HashMap<String, String>();
            CommFun.log(DATA,"只生成数据,不发送"+hm0.toString());
        }
        
        //1.发送
        sendmsgs(hm0);
        try {
            DBOperation.updateMsgHeadSend(hm0.values().toArray());
        } catch (SQLException e) {
            CommFun.log(ERR, e.getMessage());
            e.printStackTrace();
        }
        
        CommFun.log(debuglevel, "处理完毕!");
    }
    
    
    /**
     * 提取公共方法,发送并对MQ进行善后
     * @param hm
     */
    private static void sendmsgs(HashMap<String,String> hm){
        //1.发送
        if(hm!=null && hm.size()>0){
            CommFun.log("MQ共需要发送文件["+hm.size()+"]个");
            int i=0;
            String[] strs=new String[hm.size()];
            for (String s : hm.keySet()) {
                if (s == null || "".equals(s)) {
                    CommFun.log(debuglevel, "[" + s + "]" + "文件为空,不发送!");
                } else {
                    CommFun.log(debuglevel, "[" + s + "]" + "文件不为空,发送!");
                    strs[i++]=s;
                }
            }
            mqutil.runGoupSender(strs);
            CommFun.log("MQ已发送文件["+hm.size()+"]个");
        }
        // 2.对MQ队列管理器进行相应管理,最终的MQ处理
        mqutil.commit();
    }
}
View Code

 

posted @ 2020-04-04 16:08  silencemaker1221  阅读(479)  评论(0编辑  收藏  举报