一种可伸缩的生成文本的方法

xiaoxiao2020-10-23  13

一种可伸缩的生成文本的方法
【技术领域】
[0001]本发明涉及计算机网络技术领域,特别地涉及一种可伸缩的生成文本的方法。
【背景技术】
[0002]文本文件是一类重要的计算机文件,由于结构简单,文本文件被广泛用于记录信息。为了提升开发效率,使代码可以重用,在生成文本时引入了模板引擎(templateengine),使用模板引擎后就可以达到逻辑分离的功能,使程序应用逻辑和页面显示逻辑分开,能让程序开发者专注于资料的控制或是功能的达成;而视觉设计师则可专注于页面排版,让页面看起来更具有专业感。
[0003]以用Java语言生成一种常见的文本一一HTML页面为例。在用Java语言进行HTML页面生成时,通常情况下,开发人员不会直接编写整个HTML页面,而是按照一定的逻辑,将一个HTML页面分块成很多个HTML模板,再用基于Java的模板引擎最终生成整个HTML页面。
[0004]通常使用的基于Java的模板引擎有Velocity,FreeMarker等。例如Velocity,它允许任何人仅仅使用简单的模板语言(template language)来引用由Java代码定义的对象,并且将Java对象和模板本身以渲染的方式,最终生成一个HTML片段。当Velocity应用于Web页面开发时,页面设计人员可以只关注页面的显示效果,而由Java程序开发人员关注业务逻辑编码。Velocity将Java代码从web页面中分离出来,这样为web站点的长期维护也提供了便利。
[0005]当需要用Velocity渲染一个HTML页面时,现有技术通常包含以下几个步骤:
[0006]1.将整个HTML页面中的变量按照Velocity语法替换成Java对象的引用以生成Velocity模板文件;
[0007]2.通过Java后台逻辑单线程依次组装Velocity模板文件所需要的数据;
[0008]3.将Velocity模板文件和Java后台逻辑组装的数据作为Velocity中植染方法的输入,执行Velocity中的渲染(render)方法,最终得到渲染方法的输出生成完整的HTML页面。
[0009]由此可见,现有基于Java的生成文本的方法有以下几个缺点:
[0010]1.如果模板文件内容很多,会导致整个模板文件很长,增加开发人员的开发维护成本。
[0011]2.Java后台准备数据的过程为单线程,如果模板文件需要的数据很多,Java后台组装数据的逻辑需要很长时间才能将所有数据准备好,之后再调用渲染方法,因此页面生成时间很长。
[0012]3.如果服务器CPU利用率较低时,渲染文本的过程还是必须遵循依次准备数据再渲染的过程,无法更高效的利用服务器的CPU资源。

【发明内容】

[0013]有鉴于此,本发明提供一种可伸缩的生成文本的方法,具体方案为:将一个大模板文件分解成多个子模板文件,并编写渲染任务关联对应的模板文件和数据,然后将渲染任务发给线程池进行多线程渲染,全部渲染任务结束后将渲染结果进行拼接以生成完整的文本。该方法能够更快的渲染文本文件,可以在服务器CPU利用率较低时,尽可能多的利用服务器的CPU资源,加快文本的渲染,并且在服务器利用率达到一定程度时自动保护服务器(PU资源,延长服务器在接收到大量渲染请求下的工作时间。
[0014]为实现上述目的,本发明提供了一种可伸缩的生成文本的方法。
[0015]本发明的一种可伸缩的生成文本的方法包括:将整个模板文件分解成多个子模板文件;生成渲染任务列表,所述渲染任务列表中包含多个渲染任务,所述多个渲染任务用于关联该多个渲染任务对应的所述多个子模板文件,并且实现渲染前准备数据的逻辑;将所述多个渲染任务进行多线程渲染;以及将所述多个渲染任务的渲染结果拼接以生成文本。
[0016]可选地,将整个模板文件分解成多个子模板文件包括:将文本中的变量按照模板引擎的语法替换成Java对象的引用生成整个模板文件;以及分解成多个子模板文件。
[0017]可选地,将整个模板文件分解成多个子模板文件包括:将文本中的变量分解成多个小组;以及将每个小组的变量按照模板引擎的语法替换成Java对象的引用生成子模板文件。
[0018]可选地,将整个模板文件分解成多个子模板文件包括:将整个模板文件,按页面结构和所估计的数据准备所需要的时间的长短,分解成多个子模板文件。
[0019]可选地,所述多个渲染任务包含与所述多个渲染任务相对应的位置信息。
[0020]可选地,在将所述渲染任务列表进行多线程渲染之前,判定线程池是否处于满负荷状态。
[0021]可选地,当线程池未满负荷时,当前提交渲染任务的线程将当前渲染任务提交给所述线程池进行多线程渲染;以及当线程池满负荷时,当前提交渲染任务的线程不再请求使用多线程方式执行渲染任务,而是直接使用当前线程进行渲染。
[0022]可选地,在接收到新的渲染请求时,所述线程池开启新的线程执行渲染任务。
[0023]可选地,将所述多个渲染任务的渲染结果拼接以生成文本包括:按所述多个渲染任务提交的先后顺序将所述多个渲染任务的渲染结果依次拼接以生成文本。
[0024]根据本发明的技术方案,将整个模板文件分解成多个子模板文件,可使每个子模板文件的内容相对较少,从而降低了开发维护成本;每个子模板文件对应一个渲染任务,可以多线程并行获取数据,使得页面中各个模块数据的准备工作更高效,组织数据的逻辑也更清晰,从而开发方式更为高效;将多个渲染任务进行多线程渲染,根据线程池的工作负载情况调整渲染方式,可以在更高效利用服务器CPU资源的同时对服务器CPU资源起到一定的保护作用,不至于在高并发场景下产生过多的渲染线程,从而加剧CPU资源的竞争,是一种可动态伸缩的生成文本的方式。
【附图说明】
[0025]附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
[0026]图1是根据本发明实施例的一种可伸缩的生成文本的方法的主要步骤示意图;
[0027]图2是根据本发明实施例的一种可伸缩的生成文本的方法的详细步骤流程图。
【具体实施方式】
[0028]以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
[0029]图1是根据本发明实施例的一种可伸缩的生成文本的方法的主要步骤示意图。如图1所示,本发明实施例的一种可伸缩的生成文本的方法主要包括如下的步骤Sll至步骤S14。
[0030]步骤Sll:将整个模板文件分解成多个子模板文件。该步骤可以通过以下两种方案执行:
[0031]方案一,将文本中的变量按照模板引擎的语法替换成Java对象的引用生成整个模板文件;以及分解成多个子模板文件。
[0032]方案二,将文本中的变量分解成多个小组;以及将每个小组的变量按照模板引擎的语法替换成Java对象的引用生成子模板文件。
[0033]在实际应用中,可以根据所需要渲染的文本的页面结构、程序编写及维护的难易程度等来灵活决定选用哪种方案。
[0034]将整个模板文件分解成多个子模板文件,原则上是将整个模板文件,按页面结构和所估计的数据准备所需要的时间的长短,分解成多个子模板文件。通常情况下,可将多个比较耗时的接口分解到不同的渲染任务中,以保证多个任务耗时的均衡性。
[0035]步骤S12:生成渲染任务列表,所述渲染任务列表中包含多个渲染任务,所述多个渲染任务用于关联该多个渲染任务对应的所述多个子模板文件,同时实现渲染前准备数据的逻辑。
[0036]按照步骤Sll生成的每个子模板文件分别对应关联一个渲染任务,所有子模板文件对应关联的渲染任务是依次提交给线程池进行渲染的。同时,渲染任务还可以实现渲染前准备数据的逻辑,即:Java后台单线程依次组装模板文件所需要的数据。由于渲染任务列表包含有多个渲染任务,因此可以多线程同时组装多个子模板文件所需要的数据,从而大大节省了准备数据的时间。
[0037]所述多个渲染任务包含与所述多个渲染任务相对应的位置信息。在将整个模板文件分解成多个子模板文件时,会按照页面结构等情况来进行分解,此时每个子模板文件应包含 其在整个模板文件中的位置信息,以便渲染完成后进行结果拼接,生成相应的文本。
[0038]步骤S13:将所述多个渲染任务进行多线程渲染。当步骤S12完成后,提交渲染任务的线程将所述多个渲染任务提交给线程池进行多线程同时渲染。
[0039]在将所述渲染任务列表进行多线程渲染之前,先判定线程池是否处于满负荷状
??τ O
[0040]当线程池未满负荷时,当前提交渲染任务的线程将当前渲染任务提交给所述线程池进行多线程渲染。在接收到新的渲染请求时,所述线程池开启新的线程执行渲染任务。
[0041]当线程池满负荷时,当前提交渲染任务的线程不再请求使用多线程方式执行渲染任务,而是直接使用当前线程进行渲染。
[0042]当渲染任务完成后,将渲染结果保存在各线程指定的对象中。
[0043]步骤S14:将所述多个渲染任务的渲染结果拼接以生成文本。当渲染任务列表中的所有渲染任务完成后,以所述多个渲染任务提交的先后顺序将所述多个渲染任务的渲染结果依次拼接,生成整个文本页面。
[0044]由步骤Sll至步骤S14可以看出,将整个模板文件分解成多个子模板文件,因此每个子模板文件的内容相对较少,从而降低了开发维护成本;每个子模板文件对应一个渲染任务,可以多线程并行获取数据,使得页面中各个模块数据的准备工作更高效,组织数据的逻辑也更清晰,从而开发方式更为高效;将多个渲染任务多线程渲染,根据线程池的工作负载情况调整渲染方式,可以在更高效利用服务器CPU资源的同时对服务器CPU资源起到一定的保护作用,不至于在高并发场景下产生过多的渲染线程,从而加剧CPU资源的竞争,是一种可动态伸缩的生成文本的方式。
[0045]图2是根据本发明实施例的一种可伸缩的生成文本的方法的详细步骤流程图。
[0046]如图2所示,以用基于Java的模板引擎Velocity渲染文本页面为例进行说明。为了实现将整个模板文件分解成多个子模板文件(步骤S21),可以采用如下两种方法:
[0047]1、先将整个文本页面中的变量按照Velocity语法替换成Java对象的引用生成Velocity模板文件,再根据文本的页面结构和所估计的数据准备所需要的时间的长短等将Velocity模板文件分解成多个子Velocity模板文件。
[0048]2、先将整个文本页面中的变量根据文本的页面结构和所估计的数据准备所需要的时间的长短等分解成多个小组,再将各个小组的变量按照Velocity语法替换成Java对象的引用生成Velocity模板文件。
[0049]完成步骤S21后,根据生成的各个子Velocity模板文件,编写对应的渲染任务,以关联渲染任务及其对应的子Velocity模板文件,同时实现渲染前准备数据的逻辑。渲染任务有多个,以渲染任务列表的形式被提交给渲染工厂进行渲染(步骤S22)。渲染工厂用于对渲染任务进行渲染并将渲染结果拼接以生成文本。渲染工厂中包含有线程池,在接收到渲染任务之前,渲染工厂先进行初始化操作,例如,可设置渲染工厂的线程池大小、最小线程数和工作队列大小等。当渲染工厂接收到渲染任务后,先遍历接收到的渲染任务列表,之后初始化渲染任务,并向渲染任务传入渲染任务总数量等信息,然后根据渲染任务的特征,为其注入公共工具类等可以共享的变量,再采用多线程的方式渲染上述多个子Velocity模板文件(步骤S23)。
[0050]在将渲染任务列表进行多线程渲染之前,需要判定渲染工厂对应的线程池是否处于满负荷状态(步骤S24)。当线程池满负荷时,当前提交渲染任务的线程不再请求使用多线程方式执行渲染任务,而是直接使用当前线程进行渲染(步骤S25)。当线程池未满负荷时,当前提交渲染任务的线程将当前渲染任务提交给线程池进行多线程渲染,此时渲染工厂的线程池开启一个新的线程执行渲染任务(步骤S26)。当各个线程渲染任务完成后,将渲染结果保存在各个线程的指定对象中(步骤S27),然后检查渲染任务列表是否执行完毕(步骤S28),若没有执行完毕,则转向步骤S23,若已执行完毕,则按照渲染任务提交的先后顺序将所述多个渲染任务的渲染结果依次拼接(步骤S29),以生成一个完整的文本页面。[0051 ] 由上述优选实施例可以看出,本发明提出的可伸缩的生成文本的方法,在利用多线程进行渲染时可以根据线程池的工作负载情况调整渲染方式,在线程池已占用线程数较少时,可利用多线程渲染文本,在线程池已占用线程数较多时改变成单线程渲染方式,并且在已占用线程数减少后又可以恢复成多线程渲染,加快了文本页面生成速度,从而节省了生成文本页面的时间。
[0052]本发明不仅仅是通过提交渲染任务前检测线程池状态的方式提供了一种高效利用CPU的方法,同样还提出了一种将Velocity模板数据分解到多个渲染任务中,由多线程执行渲染并行获取数据的方法,使得页面中各个模块数据的准备工作更高效的同时,组织数据的逻辑也更清晰,是一种更高效的开发方式。
[0053]以上结合具体实施例描述了本发明的基本原理,在本发明的装置和方法中,显然,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本发明的等效方案。并且,执行上述系列处理的步骤可以自然地按照说明的顺序按时间顺序执行,但是并不需要一定按照时间顺序执行。某些步骤可以并行或彼此独立地执行。
[0054]上述【具体实施方式】,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。
【主权项】
1.一种可伸缩的生成文本的方法,其特征在于,包括: 将整个模板文件分解成多个子模板文件; 生成渲染任务列表,所述渲染任务列表中包含多个渲染任务,所述多个渲染任务用于关联该多个渲染任务对应的所述多个子模板文件,并且实现渲染前准备数据的逻辑; 将所述多个渲染任务进行多线程渲染;以及 将所述多个渲染任务的渲染结果拼接以生成文本。2.根据权利要求1所述的方法,其特征在于,将整个模板文件分解成多个子模板文件包括: 将文本中的变量按照模板引擎的语法替换成Java对象的引用生成整个模板文件;以及 分解成多个子模板文件。3.根据权利要求1所述的方法,其特征在于,将整个模板文件分解成多个子模板文件包括: 将文本中的变量分解成多个小组;以及 将每个小组的变量按照模板引擎的语法替换成Java对象的引用生成子模板文件。4.根据权利要求1所述的方法,其特征在于,将整个模板文件分解成多个子模板文件包括:将整个模板文件,按页面结构和所估计的数据准备所需要的时间的长短,分解成多个子模板文件。5.根据权利要求1所述的方法,其特征在于,所述多个渲染任务包含与所述多个渲染任务相对应的位置信息。6.根据权利要求1所述的方法,还包括: 在将所述渲染任务列表进行多线程渲染之前,判定线程池是否处于满负荷状态。7.根据权利要求6所述的方法,还包括: 当线程池未满负荷时,当前提交渲染任务的线程将当前渲染任务提交给所述线程池进行多线程渲染;以及 当线程池满负荷时,当前提交渲染任务的线程不再请求使用多线程方式执行渲染任务,而是直接使用当前线程进行渲染。8.根据权利要求7所述的方法,还包括:在接收到新的渲染请求时,所述线程池开启新的线程执行渲染任务。9.根据权利要求1所述的方法,其特征在于,将所述多个渲染任务的渲染结果拼接以生成文本包括:按所述多个渲染任务提交的先后顺序将所述多个渲染任务的渲染结果依次拼接以生成文本。
【专利摘要】本发明提供一种可伸缩的生成文本的方法,能够更快的渲染文本文件,更高效的利用服务器的CPU资源。该方法包括:将整个模板文件分解成多个子模板文件;生成渲染任务列表,所述渲染任务列表中包含多个渲染任务,所述多个渲染任务用于关联该多个渲染任务对应的所述多个子模板文件,并且实现渲染前准备数据的逻辑;将所述多个渲染任务进行多线程渲染;以及将所述多个渲染任务的渲染结果拼接以生成文本。采用本发明的技术方案,降低了模板文件的开发维护成本,数据准备更为高效,服务器的CPU资源利用更为合理。
【IPC分类】G06F9/46
【公开号】CN104881320
【申请号】CN201510267434
【发明人】刘锟洋
【申请人】北京京东尚科信息技术有限公司, 北京京东世纪贸易有限公司
【公开日】2015年9月2日
【申请日】2015年5月22日
转载请注明原文地址:https://www.famiwei.com/read-8138755.html

最新回复(0)