二次开发

提示:文档中心正在完善中,我们将不断发布新文档,敬请期待...

源码修改实战之多线程生成页面

1、修改背景

自从SiteServer 5.0开源发布以来,市场反响很好。相比之前版本,不管是从功能上、安全性上还是性能上和用户体验上都实现了超方位的升级优化。

比如用户中心代码全部重写,转用 JavaScript 和 API 调用,采用ReactJS 与Restful API来完成所有功能,使用户中心成为单页应用,这意味着更快速、更实时、响应更灵敏。

再比如静态页生成机制,系统采用ASP.NET SignalR等新技术把控制台(siteserver.exe 服务组件)程序重写了,新系统的生成速度得到极大的提升。

最近又有用户在研究完源码之后反馈页面生成代码还有优化的空间,并提了一个很好的点子。SiteServer开发小伙伴又马不停蹄的开始评估、研究,觉得可行之后立即动手编码实现。今天就把这个修改全过程写出来,以供大家研究源码时参考。

如果还没有把开发环境搭起来的,可以参考这篇文章:SiteServer CMS 5.0 源码入门

2、创建页面生成任务

不管是创建任务还是执行任务,都分为是通过IIS的Web程序还是通过控制台程序siteserver.exe来实现。区别有两点,一是任务存储位置不同,一个存在内存中一个存在数据库中;另一个区别就是一个通过Web程序来执行任务另一个则是通过控制台程序siteserver.exe来执行任务。

现在以创建一个生成内容页面的任务为例,具体了解一下代码情况。

多线程生成01.png

如上图所示,这是创建生成内容页任务的界面,通过查看框架源代码能看到本页面路径:

/siteserver/cms/pageCreateContent.aspx?PublishmentSystemID=1

然后用Atom打开pageCreateContent.aspx,如下图所示:

多线程生成02.png

可以发现页面对应的C#代码控制类是:

SiteServer.BackgroundPages.Cms.PageCreateContent

用visual studio打开,如下图所示:

多线程生成03.png

上图红框部分代码就是创建生成内容页任务的函数调用了。再跟进去可以看到:

多线程生成04.png

从上面代码可以发现,这里有创建生成首页任务、生成栏目页任务、和生成内容页任务的代码。继续前面的代码跟踪进去:

多线程生成05.png

首先是定义了一个任务相关操作的接品ICreateTaskManager,然后分别有了两个实现的类:

CreateTaskManagerForMomery:实现Web程序中执行任务相关操作的具体类

CreateTaskManagerForDb:实现在控制台程序中执行任务相关操作的具体类

至于具体创建哪个类的实例,则由CreateTaskManager根据当前是否启用组件来决定,如下图所示:

多线程生成06.png

3、执行页面生成任务

上面提到过执行页面生成任务有两种情况,如果服务组件siteserver.exe启动了的话,则任务会通过控制台程序siteserver.exe来执行,否则通过Web程序来执行。

两种情况代码都大同小异,如果是通过控制台程序来执行的话,对应的代码文件siteserver项目中的ExecutionManager.cs:

多线程生成07.png

从上图代码中可以看到,程序不断去获取最早的一个任务,然后判断是否有任务,如果有则开始执行,直到没有任务才退出。

具体的执行代码:

多线程生成08.png

具体执行生成任务的代码主要是通过构建:FileSystemObject对象来实现。如果是通过Web程序来执行的话,对应的代码文件SiteServe.API项目中的CreateHub.cs:

多线程生成09.png

同样的,具体执行生成任务的代码也是通过构建:FileSystemObject对象来实现。所以多线程并发的功能代码,主要是在FileSystemObject.cs这个文件中,文件具体位置如下图所示:

多线程生成10.png

具体代码跟踪不讲了,直接定位到生成一个栏目下所有内容页的方法代码中:

多线程生成11.png

在这里,最多同时并发3个内容页的生成工作,如果设置并发太多了的话容易CPU占满。另外需要注意,还有内容列表页也需要进行相应的并发代码的改进,在这就不再一一介绍了,代码和步骤都差不多,而且都在本文件代码中进行修改即可。

4、配置是否启用多线程并发生成

把配置功能加在页面生成设置中,如下图所示:

多线程生成12.png

通过查看框架源代码能看到本页面路径:

/siteserver/cms/pageConfigurationCreate.aspx

然后用Atom打开pageConfigurationCreate.aspx,如下图所示:

多线程生成13.png

添加上图红框代码,以便管理员在后台可以对此功能是否开启进行设置。

另外通过下图红框所示:

多线程生成14.png

可以发现页面对应的C#代码控制类是:

SiteServer.BackgroundPages.Cms.PageConfigurationCreate

用visual studio打开,如下图所示:

多线程生成15.png

从上图可以看到,增加一个ID为IsCreateMultiThread的RadioButtonList控件,然后在Page_Load函数中为此控件进行初始化:

多线程生成16.png

从上图初始化代码能发现,是否启用多线程这个值是存放在:

PublishmentSystemInfo.Additional.IsCreateMultiThread,需要在实体类PublishmentSystemInfo中定义此字段,代码文件路径是SiteServe.API项目中的Model下的PublishmentSystemInfoExtend.cs文件:

多线程生成17.png

从上图可以看到,系统默认是不开启此功能的。至此,我们就完成了整个多线程并发生成页面的功能开发过程。希望通过这样一个小功能的修改过程描述能给大家以后进行二次开发起到一点的参考作用。