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

介绍:该服务是专门做打印的,业务需求是生成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. [原]Greenplum failed segment的恢复方法

    当在使用greenplum过程中有不当的操作时,可能会出现segment节点宕掉的情况(比如在greenplum运行的过程中停掉其中几台segment节点的服务器),通过下面的方法可以恢复segmen ...

  2. JavaScript图形实例:线段构图

    在“JavaScript图形实例:四瓣花型图案”和“JavaScript图形实例:蝴蝶结图案”中,我们绘制图形时,主要采用的方法是先根据给定的曲线参数方程计算出两点坐标,然后将两点用线段连接起来,线段 ...

  3. Vacuum Pump Manufacturer - Vacuum Pump Range Use: Considerations

    The vacuum pump is a versatile bottle that holds your lotion, shampoo and conditioner. Keep away fro ...

  4. LeetCode 19. Remove Nth Node From End of List(删除链表中倒数第N个节点)

    题意:删除链表中倒数第N个节点. 法一:递归.每次统计当前链表长度,如果等于N,则return head -> next,即删除倒数第N个节点:否则的话,问题转化为子问题“对head->n ...

  5. Python学习第十八课——继承,接口继承等

    1.继承:字面意思 # 继承 : 字面意思 class father: pass class grandfather: pass class children(father): # 单继承 pass ...

  6. Uber为何会成为共享经济中全球市值最大的独角兽企业?

    自5月10日登陆纽交所以来,Uber的股价就像过山车一般起起伏伏,让无数投资者痛并快乐着.不过在经过半个月时间的试探后,如今Uber的股价已经稳定在40美元左右.截至美国东部时间5月24日股市收盘,U ...

  7. RESTful风格化

    RESTful Web Service介绍 Roy Thomas Fielding博士2000年提出的 REST是英文Representational State Transfer的缩写 表象化状态转 ...

  8. CentOS7中下载安装Multitail(让你的日志文件变得多彩)

    MultiTail是干啥的? Linux系统下查看日志的一个工具,允许您监视终端中多个窗口中的日志文件和命令输出,着色,过滤和合并. 具体介绍请看官网:https://www.vanheusden.c ...

  9. iOS直播集成和问题总结(阿里云直播)

    https://www.jianshu.com/p/714ce954e628 最近接手公司的直播项目,对以前遗留的问题做处理和优化, 于是顺便看了下阿里云直播的文档,在下面写下对直播的理解和遇到的问题 ...

  10. VBS 脚本对象

    Dictionary对象(1) 1.        属性: a)        compareMode b)       count c)        key d)       item 2.    ...