在Java Web应用中如何实现任务有效调度

为何需要任务调度?

在web应用中,大多数任务是以一种"防止用户长时间等待"的方式完成的。在Google搜索这样的例子中,减少等待时间对用户体验来说至关重要。异步任务的一种解决方案是在用户提交后生成一个线程(来处理异步任务),但这也不能解决那些需要以一定时间间隔重复运行任务、或在每天的指定时间运行任务的情况。

让我们从一个数据库报表的例子来看看任务调度能如何帮助改善系统设计。报表可能是错综复杂的,这取决于用户所需数据的种类,以及是否需要从一个或多个数据库收集大量数据。用户可能需要很长时间来运行这样的"按需"报表。因此,我们向这个报表示例中添加任务调度机制,以便用户可以安排在任何他们需要的时间生成报表,并以PDF或其他格式在email中发送。用户可以让报表在每天的凌晨2:22,系统正处于低负荷时运行;也可以选择只在特定时间运行一次。通过在报表应用中加入任务调度,我们可以为产品添加一项有用的功能,并改善用户体验。

幸运的是,有一个强大的开源解决方案可以让我们以标准的方式在web应用(或任何Java应用)中实施任务调度。以下示例展示了在web应用中,如何使用Quartz来创建一个任务调度框架。这个示例还使用了Struts Action framework 插件,以便在web应用启动时初始化任务调度机制。Struts是最常见的MVC框架,为大多数开发人员所熟悉。当然除此之外还有许多框架可以协助在web应用中实现MVC模式。

启动时初始化任务调度器

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

这个插件有两个可配置的初始化参数: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;
}

时间: 2025-01-20 14:27:14

在Java Web应用中如何实现任务有效调度的相关文章

java web应用中新起一个线程 在线程中怎么获取系统登录的数据

问题描述 java web应用中新起一个线程 在线程中怎么获取系统登录的数据 java web应用中新起一个线程 在线程中怎么获取系统登录的数据,系统登录用的是Spring Secrity 解决方案 可以使用缓存,自己写一个缓存类.或者使用Redis.

Java web开发中要是用jdbc连接access数据库,连接url怎么写相对位置

问题描述 Java web开发中要是用jdbc连接access数据库,连接url怎么写相对位置 Java web开发中要是用jdbc连接access数据库,连接url怎么写相对位置,注意这里是jdbc方法连接 而不是jdbc-odbc 例如access数据库就在项目中(project文件夹下) 代码为: try { // 加载jdbc - odbc驱动 Class.forName("com.hxtt.sql.access.AccessDriver"); // 根据url创建连接实例 a

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

java web项目中jsp页面表单提交给servlet 然后显示空白页面

问题描述 java web项目中jsp页面表单提交给servlet 然后显示空白页面 经检查 servlet没问题 全查可以用 不知道什么原因 求解答 解决方案 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈解决了 解决方案二: jsp页面显示空白

源代码- java web 项目中,如何实现显示的页面带关键字搜索功能

问题描述 java web 项目中,如何实现显示的页面带关键字搜索功能 我有一个关键字表 表结构如下 Id ID 关键字 Keywords 链接 Link 优先级 priority 0 默认 1初级 2中级 3高级 匹配次数 mateCount 0全文匹配 1只为第一个出现的关键字匹配 里面的数据格式为 ID Keywords Link priority mateCount 1 龙投网 http://www.lootou.cn 3 0 2 股票入门 http://www.lootou.cn/gu

就像这样子的就可以啦-跪求一份简单文本编辑器插件,能copy在java web项目中就能运行的那一种

问题描述 跪求一份简单文本编辑器插件,能copy在java web项目中就能运行的那一种 解决方案 http://kindeditor.net/demo.php 解决方案二: http://kindeditor.net/demo.php http://ueditor.baidu.com/website/onlinedemo.html http://ckeditor.com/demo

在Java web应用中,处理字符串是用stringbuffer还是stringbuilder

问题描述 在Java web应用中,处理字符串是用stringbuffer还是stringbuilder 两者之间的差别就在于线程安全的问题上.一直都搞不明白,在web应用中多次请求同一个方法,需不需要考虑线程安全问题. 在这种情况下,是需要使用哪一个.是不是还应该分局部变量和全局变量来说. 刚接触这个,求大神们解答,实在搞混了 解决方案 StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronize

java web项目中应用的服务器推送技术都有哪些?有没有性能问题

问题描述 java web项目中应用的服务器推送技术都有哪些?有没有性能问题 java web项目中应用的服务器推送技术都有哪些?有没有性能问题 解决方案 Web实时推送,选择GoEasy推送服务, 代码简单易懂,几分钟就可以自己写好一个在线聊天demo. 中英文文档齐全.官网:https://goeasy.io 解决方案二: 目前,websocket是个很好的方向. 解决方案三: websocket. http://blog.csdn.net/jiangcs520/article/detail

Java Web开发过程中隐藏很深的问题

Java Web开发过程中隐藏很深的问题 (1)企业状态不对 企业的状态由订单状态决定,但是同一个应用,一个企业可以有多个订单, 那么在有多个订单的情况下,企业的状态由那个订单决定呢? 答:由 最新的订单决定. 但是代码逻辑不对:   应该使用有序的for循环:     (2)org.json.JSONObject的getString 方法可能抛出异常 Java代码   //记录分享人               String sharer=appInfoObject.getString("sh