找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 6371|回复: 2

[经验] 调用NC65外部交换平台内容超长时报空引用

[复制链接]
发表于 2021-9-7 17:19:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

×
通过外部交换平台传入凭证:分录13000多行,此时外部交换平台会报空引用;100行分录就没有问题。
报错位置:File的构造函数中
java.io.File.File(String)
     public File(String pathname) {
        if (pathname == null) {
            throw new NullPointerException();
        }
        this.path = fs.normalize(pathname);
        this.prefixLength = fs.prefixLength(this.path);
    }


通过调试追查发现,原因如下:
nc.bs.pfxx.ServletForXchange.normalDoAction(HttpServletRequest, HttpServletResponse, SysConfigInfo)   这段逻辑中:
存在问题:
        private void normalDoAction(HttpServletRequest request, HttpServletResponse response, SysConfigInfo globalParameter) {
                // 往线程注册上下文环境
                Logger.init("pfxx");
                IXChangeContext context = new XChangeContext();
                PfxxUtils.registerContext(context);
                boolean bcompress = false; // 是否压缩流
                RequestParameter requestParameter = null;
                String inputStreamFileName = null;
                String receiver = "Unknow";
                String clientAddress = null;
                try {
                        clientAddress = request.getRemoteAddr();
                        Logger.info("交换平台收到来自" + clientAddress + "传送数据请求,请求处理开始......");
                        //
                        Logger.info("校验发送方客户端地址");
                        checkClientAddress(clientAddress, globalParameter);
                        //
                        Logger.info("提取URL请求中的参数.");
                        requestParameter = ConfigInfoAnalyser.initRequestParameter(request);
                        //
                        ServletRequestManager.getCurrentContext().setRequestParameter(requestParameter);
                        //
                        requestParameter.setServerURL(request.getServerName() + ":" + request.getServerPort());
                        receiver = requestParameter.getGroupCode();
                        //
                        bcompress = requestParameter.isBcompress();
                        setResponseContentType(response);
                        //
                        Logger.info("校验文件长度");
                        checkContentLength(request.getContentLength());       //超长,此处会抛出异常  EnvInitException
                        //
                        Logger.info("将输入流转换为文档.");
                        inputStreamFileName = InputStreamFileHelper.getFileName(receiver, requestParameter.getFileName());
                        //此处才赋值
                        Document doc = getDocumentFromInputStream(request.getInputStream(), bcompress, inputStreamFileName,
                                        globalParameter);

                        Logger.info("开始初始化上下文......");
                        context.init(requestParameter, doc);//这块获取数据源
                        Logger.info("初始化上下文完成!!!");

                        // 处理信息内容
                        Logger.info("开始处理文档......");
                        // 读取控制参数,以决定是按一个文档一个事务发送还是每张单据起独立事务
                        if (globalParameter.getDealRule() == PfxxConstants.DEALRULE_ALL_OR_NONE) {
                                PfxxUtils.lookUpPFxxEJBService().processMessage(doc);
                        } else {
                                new XChangeProcessor().processMessage_Alone(doc);
                        }
                        Logger.info("处理文档完成!");
                        //
                        Logger.info("交换平台处理来自" + clientAddress + "传送的数据完成。");
                } catch (IOException ioe) {
                        Logger.error("从网络读取数据流出错!请检查网络状况,并重新发送数据!", ioe);
                        PfxxUtils.lookUpPFxxFileService().setInputStreamNetError(inputStreamFileName);
                        ResponseMessage rm = context.newResponseMessage();
                        rm.setResultCode(ISendResult.ERR_ENV_SERVLET);
                        rm.appendResultDescription(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("pfxx", "0pfxx0090")/*
                                                                                                                                                                                                                                 * @res
                                                                                                                                                                                                                                 * "从网络读取数据流出错!请检查网络状况,并重新发送数据!"
                                                                                                                                                                                                                                 */);
                        context.setFileSuccessfulProcess(false);
                        // 同样需要在xlog记录日志,对整个输入流写一条记录
                        PfxxLogManager.writeExceptionToXlog(context, receiver, clientAddress, ioe);
                } catch (SAXException saxe) {
                        Logger.error("从输入流转换document出错,请检验文档格式!", saxe);
                        PfxxUtils.lookUpPFxxFileService().setInputStreamDocFormatError(inputStreamFileName);
                        ResponseMessage rm = context.newResponseMessage();
                        rm.setResultCode(ISendResult.ERR_PFXX_BILL_FORMAT_INVALID);
                        rm.appendResultDescription(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("pfxx", "0pfxx0114")/*
                                                                                                                                                                                                                                 * @res
                                                                                                                                                                                                                                 * "从输入流转换document出错,请检验文档格式!"
                                                                                                                                                                                                                                 */);
                        context.setFileSuccessfulProcess(false);
                        // 同样需要在xlog记录日志,对整个输入流写一条记录
                        PfxxLogManager.writeExceptionToXlog(context, receiver, clientAddress, saxe);
                } catch (EnvInitException e) { // 环境初始化异常, 以文件写回执
                        Logger.error("交换平台初始化异常", e);
                        PfxxUtils.lookUpPFxxFileService().setInputStreamBizError(inputStreamFileName);   //变量为空,导致File内的空引用
                        ResponseMessage rm = context.newResponseMessage();
                        rm.setResultCode(e.getErrorCodeString());
                        rm.appendResultDescription(e.getMessage());
                        context.setFileSuccessfulProcess(false);
                        // 同样需要在xlog记录日志,对整个输入流写一条记录
                        PfxxLogManager.writeExceptionToXlog(context, receiver, clientAddress, e);
                } catch (BusinessException e) { // 非环境初始化异常, 以单据形式写回执
                        Logger.error(e.getMessage(), e);
                        PfxxUtils.lookUpPFxxFileService().setInputStreamBizError(inputStreamFileName);
                        context.setFileSuccessfulProcess(false);
                } catch (Throwable e) { // 初始化过程中的其他未明异常
                        Logger.error(e.getMessage(), e);
                        PfxxUtils.lookUpPFxxFileService().setInputStreamBizError(inputStreamFileName);
                        ResponseMessage rm = context.newResponseMessage();
                        rm.setResultCode(ISendResult.ERR_UNKOWN_EXCEPTION);
                        rm.appendResultDescription(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("pfxx", "0pfxx0091")/*
                                                                                                                                                                                                                                 * @res
                                                                                                                                                                                                                                 * "初始化过程中的其他未明异常:"
                                                                                                                                                                                                                                 */
                                        + e.getMessage());
                        context.setFileSuccessfulProcess(false);
                        // 同样需要在xlog记录日志,对整个输入流写一条记录
                        PfxxLogManager.writeExceptionToXlog(context, receiver, clientAddress, e);
                } finally {
                        // 处理大事务时单据号相关内存
                        dealBillCode(context.isFileSuccessfulProcess());
                        Logger.info("开始发送回执......");
                        sendBackMessage(response, bcompress);
                        Logger.info("发送回执结束!!!");
                        PfxxUtils.releaseFormulaParser();
                        PfxxUtils.releaseContext();
                        // 释放所有锁资源
                        // 2009-01-10 有可能释放其它线程的锁,导致锁失效
                        // releaseAllLocks();
                        // 日志
                        Logger.reset();
                }
        }


解决办法:
快速解决办法:外部交换平台日志--参数设置--单文件大小设置为最大值:10240KB

但其实指标不治本,在不能修改标准产品的前提下,分析业务,调整外部交换平台生成凭证的大小,才是合适的方式。



您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-11-21 01:30 , Processed in 0.052710 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表