摘要:已经上线的项目,出现服务挂掉的情况。

介绍:该服务是专门做打印的,业务需求是生成PDF文件进行页面预览,主要是使用ItextPDF+freemaker技术生成一系列PDF文件,其中生成流程有:解析模板生成临时PDF文件--->在临时PDF文件上注入文本和签名域--->旋转页面--->合并生成的多个PDF文件--->删除全部临时文件。

由于该业务生成的文件只是用来预览,不做保存,所以需要生成后就要删除。而每次生成的文件都是放在一个临时文件夹下,临时文件夹一开始我是根据建议书ID创建的(此处是导致宕机的关键所在),由于业务是每个用户只会操作自己账户下的建议书,既不会出现多人操作同一个建议书,既建议书(ID)具有唯一性,所以临时文件夹就以建议书ID命名。但是页面在预览的时候还有个另存为的业务,预览和另存为都是调的同一个生成文件的接口,如果用户在预览还在加载的时候就去点击另存为,此时会有新的线程去做同样的操作。由于该接口操作很多文件,所以响应会有点慢,导致预览的线程正在处理生成的文件,而另存为的线程又去生成同样的文件,并且是在同一个文件夹内,此时可能会出现预览线程正在处理的文件突然被另存为线程生成的文件覆盖,或者由于预览线程已经生成同样的文件而另存为线程生成不了,在这一过程中导致了服务的宕机。

bug修复过程:

开始以为是文件流未关闭导致的内存溢出,从而导致服务宕机,但是通过监控发现内存充足,后来查看生产环境上宕机的日志,猜测是上面提到的原因。通过线程睡眠模拟复现宕机bug,经过几番尝试,终于复现了!

而这个bug的罪归祸首就是那个临时文件夹,仅仅修改临时文件夹随机生成即可。

针对服务宕机的更深的分析需要一些时间去处理,暂时由于时间问题不做分析!

记-ItextPDF+freemaker 生成PDF文件---导致服务宕机的更多相关文章

  1. 由Redis的hGetAll函数所引发的一次服务宕机事件

    昨晚通宵生产压测,终于算是将生产服务宕机的原因定位到了,心累.这篇博客,算作一个复盘和记录吧... 先来看看Redis的缓存淘汰算法思维导图: 说明:当实际占用的内存超过Redis配置的maxmemo ...

  2. Itext生成pdf文件

    来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...

  3. 根据PDF模板生成PDF文件(基于iTextSharp)

    根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...

  4. Java 动态生成 PDF 文件

    每片文章前来首小诗:   今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天.  --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...

  5. itext 生成pdf文件添加页眉页脚

    原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpd ...

  6. JavaWeb项目生成PDF文件添加水印图片并导出

    一.前言 首先需要在Maven中添加相应的jar包依赖,若项目没用到Maven,也可自行下载相应所需的jar包(itextpdf.jar 与 itext-asian.jar),如下图所示.点此下载 M ...

  7. 在spring boot 中使用itext和itextrender生成pdf文件

    转载请注明出处 https://www.cnblogs.com/majianming/p/9539376.html 项目中需要对订单生成pdf文件,在第一版本其实已经有了比较满意的pdf文档,但是还是 ...

  8. Java生成PDF文件(转)

    原文地址:https://www.cnblogs.com/shuilangyizu/p/5760928.html 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iT ...

  9. Java Itext 生成PDF文件

    利用Java Itext生成PDF文件并导出,实现效果如下: PDFUtil.java package com.jeeplus.modules.order.util; import java.io.O ...

随机推荐

  1. Numpy中rot90函数实现矩阵旋转

    从NumPy的官方完整查到rot90函数语法格式如下: rot90(m, k=1, axes=(0, 1) m是要旋转的数组(矩阵),k是旋转的次数,默认旋转1次,那是顺时针还是逆时针呢?正数表示逆时 ...

  2. Springboot三层架构

    control调用service调用dao

  3. DOM的一些小总结

    HTML DOM的结构:可以把HTML看成一个个的节点. 节点: HTML DOM对象 --  方法和属性 一些DOM 对象方法 nodeName 属性 nodeValue 属性 nodeType:节 ...

  4. leetcode菜鸡斗智斗勇系列(6)--- 检查一个string里面有几个对称的字段

    1.原题: https://leetcode.com/problems/split-a-string-in-balanced-strings/ Split a String in Balanced S ...

  5. 关于TXT文件中英文字母出现频率排序问题

    题目要求: 输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位. 源码: package demo; import java.io.File;  ...

  6. DVWA靶机实战-文件上传漏洞(二)

    继续打靶机:当前靶机的安全级别:medium 第一步 上传一句话木马,这次没有之前那么顺利了,文件显示上传失败,被过滤. 点开右下角view source查看源码: 只允许上传image/jpeg格式 ...

  7. nginx的access的阶段的access模块、auth_basic模块、auth_request模块及satisfy指令介绍

    access 模块 示例从上向下匹配 location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 200 ...

  8. Eclipse开发快捷键

    ctrl+alt+r:查找资源 ctrl+o:快速outLine ctrl+e:快速切换编辑器 ctrl+./ctrl+1:下一个错误修改

  9. 吴裕雄--天生自然ORACLE数据库学习笔记:Oracle 11g的闪回技术

    alter system set db_recovery_file_dest_size=4g scope=both; connect system/1qaz2wsx as sysdba; archiv ...

  10. kafka 高吞吐量的因素

    1.顺序的方式存储数据: 2.批量发送: 3.零拷贝: 来源:咕泡学院