再遇org.apache.catalina.connector.ClientAbortException: java.net.SocketException: 断开的管道 (Write failed)

再遇org.apache.catalina.connector.ClientAbortException: java.net.SocketException: 断开的管道 (Write failed)

优付商户平台“付款记录”页面,商户操作员点击“下载结算凭证”按钮,系统会将所选条件的交易的回单文件以zip包的形式返回给浏览器页面。

 

 

 

由于程序涉及到复杂计算,同时涉及到读库、网络、磁盘IO,耗时比较长。为了防止重复请求,今天,我用redis分布式锁做了防重复提交控制。

@RequestMapping(value = "/downLoadBill")
public void downLoadBill(HttpServletRequest request, HttpServletResponse response) throws Exception {
    UserVO userVO=(UserVO) request.getSession().getAttribute("userVO");
    log.info("==MERCHANT==结算凭证下载,执行开始==企业id={}", userVO.getMERID());
    response.setCharacterEncoding(Constant.CHARSET);

    String lockKey="downLoadBill:"+userVO.getMERID();
    String lockValue = UUID.randomUUID().toString();
    boolean getLock = JedisUtils.tryGetDistributedLock(lockKey, lockValue,15000);
    if (!getLock) {
        log.info("结算凭证下载中,请勿重复提交");
        response.getWriter().write("您似乎进行了重复提交操作。请重新发起请求,因数据量大,希望您耐心等待系统响应!");
        return;
    }
    
    ....
    OutputStream responseStream = new BufferedOutputStream(response.getOutputStream());
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=" + new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"));
    responseStream.write(buffer);
    responseStream.flush();
    
    ....
}    
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 再遇org.apache.catalina.connector.ClientAbortException: java.net.SocketException: 断开的管道 (Write failed)