多线程和匿名内部类

本文介绍了一个用于上传和解析COS文件的服务端接口实现。该接口接收上传的COS文件,验证文件类型,并将其保存到本地进行解压缩。之后通过多线程方式对解压后的XML文件进行异步解析,解析完成后更新数据库中的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    @POST @Path("/uploadCOS")
    public long uploadCOS(
            @FormDataParam("file") final InputStream fileInputStream,
            @FormDataParam("saveFileName") String saveFileName,     //文件名称
            @FormDataParam("orgId") final long orgId,
            @FormDataParam("categoryId") final long categoryId,
            @FormDataParam("__file_length") long __file_length
            ) throws Exception {
        final Long userPkId = ThreadLocalLoginedInfo.get().getUserPkId();
        final String userName = ThreadLocalLoginedInfo.get().getUserName();
        //先保存他的上传信息
        UploadInfo ui = new UploadInfo();
        ui.setTitle(saveFileName);
        ui.setCreateDate(new Date());
        ui.setIsDel(false);
        ui.setOrgId(orgId);
        ui.setResult("正在解析");
        ui.setUserPkId(userPkId);
        ui.setUserName(userName);
        final long uid = uploadInfoDao.add(ui);
        
        saveFileName = saveFileName.toLowerCase();
        if(!saveFileName.endsWith(".cos")){
            UploadInfo con = new UploadInfo();
            con.setId(uid);
            UploadInfo val = new UploadInfo();
            val.setResult("上传的不是COS文件");
            uploadInfoDao.update(val, con);
            return 2;
        }
        
        try {
            //将上传文件保存到本地
            final File cosFile = inputStreamChangeFile(fileInputStream);
            //解压文件
            ZipFile zFile = new ZipFile(cosFile);
            final File destDir = unzip(zFile);
            //获取解压完的文件
            final File[] extractedFiles = getFileList(zFile, destDir);
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        long start = System.currentTimeMillis();
                        //开始解析XML
                        standardBillService.analyzeXML(extractedFiles, orgId, categoryId,userPkId,userName);
                        UploadInfo con = new UploadInfo();
                        con.setId(uid);
                        UploadInfo val = new UploadInfo();
                        val.setResult("解析完成");
                        uploadInfoDao.update(val, con);
                        long end = System.currentTimeMillis();
                        System.out.println("上传完成,耗时:"+((end-start)/1000)+"秒");
                        System.out.println("上传完成,耗时:"+((end-start)/1000/60)+"分钟");
                    } catch (Exception e) {
                        e.printStackTrace();
                        StackTraceElement[] st = e.getStackTrace();
                        String message = "";
                        // 把出现的异常详细信息记录到备注中
                        for (StackTraceElement s : st) {
                            String exclass = s.getClassName();
                            String method = s.getMethodName();
                            message += "[类:" + exclass + "]调用" + method + "方法时,在第" + s.getLineNumber() + "行代码处发生异常\r\n";
                        }
                        
                        UploadInfo con = new UploadInfo();
                        con.setId(uid);
                        UploadInfo val = new UploadInfo();
                        val.setResult("解析文件出现异常,异常类型 :" + e.getClass().getName() + ":" + e.getMessage() + ",具体异常位置信息 :" + message);
                        uploadInfoDao.update(val, con);
                    } finally{
                        cosFile.delete();
                        deleteAll(destDir);//删除文件夹里面的所有文件
                    }
                }
            });
            thread.start();
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
            StackTraceElement[] st = e.getStackTrace();
            String message = "";
            // 把出现的异常详细信息记录到备注中
            for (StackTraceElement s : st) {
                String exclass = s.getClassName();
                String method = s.getMethodName();
                message += "[类:" + exclass + "]调用" + method + "方法时,在第" + s.getLineNumber() + "行代码处发生异常\r\n";
            }
            
            UploadInfo con = new UploadInfo();
            con.setId(uid);
            UploadInfo val = new UploadInfo();
            val.setResult("解析文件出现异常,异常类型 :" + e.getClass().getName() + ":" + e.getMessage() + ",具体异常位置信息 :" + message);
            uploadInfoDao.update(val, con);
            return 0;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值