|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册账号
×
通过外部交换平台传入凭证:分录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
但其实指标不治本,在不能修改标准产品的前提下,分析业务,调整外部交换平台生成凭证的大小,才是合适的方式。
|
|