快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新匍京1_龟发之家论坛



义务调整是大年夜型J2EE web利用中常见的事情。开拓者盼望以指定的距离光阴履行种种操作,并完成一些无需用户输入的义务。Java中可有无数措施来做到这一点澳门新匍京1,然则在web利用中却并没有这方面的统一标准。当许多开拓职员介入同一个项目,并且以各自不合的要领来实现义务调整时,就可能孕育发生很大年夜问题。内存和同步问题便是必须首先斟酌的两件事。事实上,一些开拓者试图调用操作系统层面的义务调整机制,如Unix平台上的cron。这种编程实践大概并不是太坏,但它将直接导致可移植性被抛到九霄云外。

为何必要义务调整?

在web利用中,大年夜多半义务因此一种"防止用户长光阴澳门新匍京1等待"的要领完成的。在Google搜索这样的例子中,削减等待光阴对用户体验来说至关紧张。异步义务的一种办理规划是在用户提交后天生一个线程(来处置惩罚异步义务),但这也不能办理那些必要以必然光阴距离重复运行义务、或在天天的指准光阴运行义务的环境。

让我们从一个数据库报表的例子来看看义务调整能若何赞助改良系统设计。报表可能是错综繁杂的,这取决于用户所需数据的种类,以及是否必要从一个或多个数据库网络大年夜量数据。用户可能必要很长光阴来运行这样的"按需"报表。是以,我们向这个报表示例中添加澳门新匍京1义务调整机制,以便用户可以安排在任何他们必要的光阴天生报表,并以PDF或其他款式在email中发送。用户可以让报表在天天的早晨2:22,系统正处于低负荷时运行;也可以选择只在特准光阴运行一次。经由过程在报表利用中加入义务调整,我们可以为产品添加一项有用的功能,并改良用户体验。

幸运的是,有一个强大年夜的开源办理规划可以让我们以标准的要领在web利用(或任何Java利用)中实施义务调整。以下示例展示了在web利用中,若何应用Quartz来创建一个义务调整框架。这个示例还应用了Struts Action framework 插件,以便在web利用启动时初始化义务调整机制。Struts是最常见的MVC框架,为大年夜多半开拓职员所认识。当然除此之外还有许多框架可以帮忙在web利用中实现MVC模式。

启动时初始化义务调整器

我们首先要做的是建立一个Struts插件,让它在容器启动时创建我们的义务调整器。在以下例子中,我们选择Tomcat作为web利用容器,不过这些示例在其他容器中也该当可以运行。我们要创建一个Struts插件类,并在struts-config.xml中加入澳门新匍京1几行代码以使之可以事情。

这个插件有两个可设置设置设备摆设摆设的初始化参数:startOnLoad指定是否要在容器启动时急速启动义务调整器,而 startupDelay指定启动义务调整器之前的等待光阴。启动延时很有用,由于我们可能必要首先履行一些更紧张的初始化步骤。此外还可以应用listener机制,以更繁杂的要领来看护SchedulerPlugIn何时启动Quartz Scheduler。

<PLUG-IN className="SchedulerPlugIn">

<SET-PROPERTY property="startOnLoad" value="false" />

<SET-PROPERTY property="startupDelay" value="0" />

</PLUG-IN>

我们要创建的是一个实现Struts插件接口org.apache.struts.action.PlugIn的单子类SchedulerPlugIn。Struts会按照设置设置设备摆设摆设文件中呈现的顺序初始化各个插件。要分外留意的是init()措施中的代码,在此我们初始化了所需的Quartz工具,并获得Scheduler。我们的义务信息就要提交到此org.quartz.Scheduler工具,后者将在随后评论争论。Scheduler工具由Quartz servlet根据其设置设置设备摆设摆设初始化,就像Struts初始化它的ActionServlet类一样。让我们来看init()措施:

public void init(ActionServlet actionServlet,

ModuleConfig moduleConfig) {

System.out.println("Initializing Scheduler PlugIn for Jobs!");

// Retrieve the ServletContext

// 获取ServletContext

ServletContext ctx = actionServlet.getServletContext();

// The Quartz Scheduler

// Quartz Scheduler工具

Scheduler scheduler = null;

// Retrieve the factory from the ServletContext.

// It will be put there by the Quartz Servlet

// 从ServletContext取得由Quartz Servlet放置在此的factory工具。

StdSchedulerFactory factory = (StdSchedulerFactory)

ctx.getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);

try{

// Retrieve the scheduler from the factory

// 从factory取得scheduler

scheduler = factory.getScheduler();

// Start the scheduler in case, it isn't started yet

// 假如scheduler尚未启动,则启动它

if (m_startOnLoad != null &&

m_startOnLoad.equals(Boolean.TRUE.toString())){

System.out.println("Scheduler Will start in " +

m_startupDelayString + " milliseconds!");

//wait the specified amount of time before

// starting the process.

// 在启动之前等待指定长度的光阴

Thread delayedScheduler =

new Thread(new DelayedSchedulerStarted (

scheduler, m_startupDelay));

//give the scheduler a name. All good code needs a name

//给义务调整器命名。好的代码总该着名字!

delayedScheduler.setName("Delayed_Scheduler");

//Start out scheduler

//启动义务调整器

delayedScheduler.start();

}

} catch (Exception e){

e.printStackTrace();

}

sm_scheduler = scheduler;

}

设置设置设备摆设摆设历程的第二步是在web.xml中加入用来初始化Quartz servlet(org.quartz.ee.servlet.QuartzInitializerServlet)的内容,由于必要它将SchedulerFactory添加到ServletContext中,以便在我们的Struts插件中可以造访。SchedulerFactory便是我们在Struts插件中得到Scheduler工具的滥觞。除了struts-config.xml 和web.xml之外,还要在web利用的classes目录下放置一个quartz.properties文件。此文件的位置也可以在web.xml中作为QuartzInitializerServlet的启动参数来指定。

QuartzInitializer

Quartz Initializer Servlet

org.quartz.ee.servlet.QuartzInitializerServlet

1

shutdown-on-unload

true

start-scheduler-on-load

false

这里着实完全可以不应用Struts和SchedulerPlugIn,但假如将来抉摘要以其它的义务调整框架调换Quartz的话,额外的抽象层就很有澳门新匍京1用了。长远看来,让统统维持疏松耦合总会使事情变得轻易些。假如你应用其它MVC框架,也可以用SchedulerPlugIn.init()措施中的代码达到同样的效果。此外,还可以用Servlet 2.3规范中的ServletContextListener来实现同样的初始化历程。

到此为止web利用已设置设置设备摆设摆设完毕,我们可以创建一个.war文件并支配到办事器上,从节制台察看SchedulerPlugIn的输出信息。然而在此之前,让我们先看看若何向义务调整器提交一项义务。

我们可以从web利用中的任何类造访SchedulerPlugIn的独一实例,并调整一些要履行的事情。首先必要一个Trigger(触发器)工具来奉告义务何时运行、每隔多久运行一次。Quartz支持多种触发器,在这个例子中我们应用CronTrigger。

Trigger trigger = new CronTrigger("trigger1", "group1");

trigger.setCronExpression("0 0 15 ? * WED");

以上的触发器会在每周三的下昼3点履行指定义务。现在我们只要创建一个JobDetail工具,并把它和上面的触发器一路通报给SchedulerPlugIn的scheduleWork()措施。

JobDetail jobDetail =

new JobDetail("Hello World Job",

"Hello World Group",

HelloWorld.class,

true, true, true);

//Schedule The work

//调整这项义务

SchedulerPlugIn.scheduleWork(scheduledJobDetail, trigger);

您可能还会对下面的文章感兴趣: