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

介绍:该服务是专门做打印的,业务需求是生成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. 「JSOI2015」最大公约数

    「JSOI2015」最大公约数 传送门 考虑先枚举区间左端点, 然后我们会发现所有可能的区间虽然有 \(O(n)\) 个,但是本质不同的区间 \(\gcd\) 只有 \(\log n\) 级别,而且是 ...

  2. Spring Boot 项目本地运行无异常,部署到 Linux 服务器运行报错:java.lang.ClassNotFoundException

    一 背景 最近在用 Springboot 开发项目 A,引了小伙伴开发的模块 B,本地起服务,运行的好好的,等部署到服务器上,一运行就报错:Caused by: java.lang.ClassNotF ...

  3. JavaScript - onunload失效

    参考 https://stackoverflow.com/questions/7794301/window-onunload-is-not-working-properly-in-chrome-bro ...

  4. DataTable和实体类之间的转换

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

  5. 奖学金(0)<P2007_1>

    奖学金 (scholar.pas/c/cpp) [问题描述] 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分 ...

  6. 数据库先系统与原理第三章笔记:数据库SQL查询语言

    SQL概述 SQL发展 SQL特点 SQL查询基本概念 单表查询 投影查询 1.查询指定列: SELECT 列名1,列名2,列名3,.....FROM Table_Name; #查询全部列:SELEC ...

  7. Java基础知识笔记第九章:组件及事件处理

    java Swing 图形用户界面(GUI : Graphics User Interface) 窗口 JFrame常用方法 JFrame()创建一个无标题的窗口. JFrame(String s)创 ...

  8. Struts笔记二:栈值的内存区域及标签和拦截器

    值栈和ognl表达式 1.只要是一个MVC框架,必须解决数据的存和取的问题 2.struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 1.  ValueStack是一个接口,在struts ...

  9. Socket通信实现步骤

    public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ...

  10. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)

    static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数):c\c++中静态变量.对象 ...