`

定时任务(如:定时发送短信邮箱等)

 
阅读更多

前面整过一个任务调度,它是固定在每天几点等执行,对于要手动加入的时间的定时发送短信不适用。


学习quartz首先了解三个概念:

调度器:负责调度作业和触发器;

触发器:设置作业执行的时间、参数、条件等;(简单触发器和Cron触发器)

作业:定时任务内容,被执行的程序;

下载必要的jar包,将quartz-x.x.x.jar 和core 和/或 optional 文件夹中的 jar 文件放在项目的文件夹或项目的类路径中 Quartz的几个核心的接口和类为:

Job接口:自己写的“定时程序”实现此接口的void execute(JobExecutionContext arg0)方法,Job还有一类为有状态的StatefulJob接口,假如我们需要在上一个作业执行完后,根据其执行结果再进行下次作业的执行,则需要 实现此接口。

Trigger抽象类:调度类(Scheduler)在时间到时调用此类,再由trigger类调用指定的定时程序。

Quertz中提供了两类触发器为:SimpleTrigger,CronTrigger。前者用于实现比较简单的定时功能,例如几点开始,几点结束,隔 多长时间执行,共执行多少次等,后者提供了使用表达式来描述定时功能,因此适用于比较复杂的定时描述,例如每个月的最后一个周五,每周的周四等。

JobDetail类:具体某个定时程序的具体描述,包括Name,Group,JobDataMap等。

JobExecutionContext类:定时程序执行的run-time的上下文环境,用于得到当前执行的Job的名字,配置的参数等。

JobDataMap类:用于描述一个作业的参数,参数可以为任何基本类型例如String,float等,也可为某个对象的引用.

JobListener,TriggerListener接口:用于监听触发器状态和作业扫行状态,在特写状态执行相应操纵。

JobStore类:在哪里执行定进程序,可选的有在内存中,在数据库中。

开始:边看例题边学习,首先从简单触发器开始…… 1、作业通过实现org.quartz.job接口,可以使 Java 类变成可执行的。这个类用一条非常简单的输出语句覆盖了execute(JobExecutionContext context)方法。 import java.util.Date;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

public class SimpleQuartzJob implements Job {

public SimpleQuartzJob() {

}

public void execute(JobExecutionContext context) throws JobExecutionException {

System.out.println("In SimpleQuartzJob - executing its JOB at "

+ new Date() + " by " + context.getTrigger().getName());

}

} 2、触发器和调度器

public void task() throws SchedulerException

{

//通过SchedulerFactory来获取一个调度器

SchedulerFactory schedulerFactory = new StdSchedulerFactory();

Scheduler scheduler = schedulerFactory.getScheduler();

//引进作业程序

JobDetail jobDetail =

new JobDetail("jobDetail-s1", "jobDetailGroup-s1", SimpleQuartzJob.class);

//new一个触发器

SimpleTrigger ***Trigger =

new SimpleTrigger("***Trigger", "triggerGroup-s1");

//设置作业启动时间

long ctime = System.currentTimeMillis();

***Trigger.setStartTime(new Date(ctime));

//设置作业执行间隔

***Trigger.setRepeatInterval();

//设置作业执行次数

***Trigger.setRepeatCount(10);

//设置作业执行优先级默以为5

//***Trigger.setPriority(10);

//作业和触发器设置到调度器中

scheduler.scheduleJob(jobDetail, ***Trigger);

//启动调度器

scheduler.start();

}

一个简单的quartz任务就完成了。

以下是我根据上边的介绍写的定时发送消息的代码:

PushJob.java

package cn.net.inch.mb.task;

import java.text.SimpleDateFormat;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import cn.net.inch.mb.domain.Message;
import cn.net.inch.mb.service.IMessageService;

public class PushJob implements Job {

	// private static IMessageService messageService = null;

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.out
				.println("-----------------------定时发送----------------------------------------------");
		Object object = context.getJobDetail().getJobDataMap().get("message");
		Object msgService = context.getJobDetail().getJobDataMap().get(
				"msgService");
		Message msgMessage = (Message) object;
		IMessageService messageService = (IMessageService) msgService;
		String title = msgMessage.getTitle();
		System.out.println("定时消息启动,消息标题为:" + title + "消息ID"
				+ msgMessage.getId());
		String content = msgMessage.getContent();
		SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-dd" + " "
				+ "HH:mm:ss");
		String pushTime = tempDate.format(new java.util.Date());

		System.out.println(" ad msgMessage:" + (msgMessage == null));

		try {
			System.out.println("进入推送");
			messageService.pushMsg(title, content, pushTime);
			msgMessage.setStatus("1");
			messageService.saveOrUpdateMessage(msgMessage);
		} catch (Exception e) {
			msgMessage.setStatus("3");
			messageService.saveOrUpdateMessage(msgMessage);
			e.printStackTrace();
		}

		System.out
				.println("-----------------------定时发送结束----------------------------------------------");
	}

}

 2.SimpleScheduler.java

package cn.net.inch.common.push;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

import cn.net.inch.mb.service.IMessageService;
import cn.net.inch.mb.task.PushJob;

public class SimpleScheduler {

	private Scheduler scheduler = null;

	private SimpleScheduler() throws SchedulerException {
		scheduler = createScheduler();
	}

	private static SimpleScheduler instance;

	public static synchronized SimpleScheduler getSimpleScheduler()
			throws SchedulerException {
		if (instance == null) {
			instance = new SimpleScheduler();
		}
		return instance;
	}

	static Log logger = LogFactory.getLog(SimpleScheduler.class);

	public static void main(String[] args) throws SchedulerException,
			ParseException {
		SimpleScheduler simple = new SimpleScheduler();
		try {
			// Create a Scheduler and schedule the Job
			Scheduler scheduler = simple.createScheduler();

			String ddd = "2012-01-13 15:56:30";
			Date d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(ddd);

			// simple.scheduleJob(d, PushJob.class);
			scheduler.start();
			logger.info("Scheduler started at " + new Date());
		} catch (SchedulerException ex) {
			logger.error(ex);
		}

	}

	public Scheduler createScheduler() throws SchedulerException {// 创建调度器
		return StdSchedulerFactory.getDefaultScheduler();
	}

	public void scheduleJob(Date date, Object object, Long id,
			IMessageService messageService) throws SchedulerException,
			ParseException {
		String dateStr = new SimpleDateFormat().format(date);
		dateStr = id + dateStr;
		System.out.println("调度类名称为:" + dateStr);

		JobDetail jobDetail = new JobDetail(dateStr, Scheduler.DEFAULT_GROUP,
				PushJob.class);
		// jobDetail.getJobDataMap().put("SCAN_DIR", "D:\\Tomcat\\conf");
		jobDetail.getJobDataMap().put("message", object);
		jobDetail.getJobDataMap().put("msgService", messageService);

		SimpleTrigger trigger = new SimpleTrigger(dateStr, "triggerGroup-s1");
		// TriggerUtils.makeSecondlyTrigger(3);// 每10秒触发一次
		// trigger.setName("scanTrigger");
		/*
		 * String ddd = "2012-01-05 19:22:00"; Date d = new
		 * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(ddd);
		 * trigger.setStartTime(d);// 设置第一次触发时间
		 */
		/*
		 * String ddd = "2012-01-06 19:00:00"; Date d = new
		 * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(ddd);
		 */
		trigger.setStartTime(date);
		scheduler.scheduleJob(jobDetail, trigger);
		System.out.println("创建scheduler");

		// removeJob("ScanDirectory", Scheduler.DEFAULT_GROUP);
	}
	/*
	 * public boolean removeJob(String jobName, String group) throws
	 * SchedulerException { scheduler.pauseJob(jobName, group); return
	 * scheduler.deleteJob(jobName, group); }
	 */
}

  Action触发:

jobName = new SimpleDateFormat().format(messageList.get(i)
							.getSendTime());
					jobName = messageList.get(i).getId() + jobName;
					Scheduler sched = gSchedulerFactory.getScheduler();
					sched.deleteJob(jobName, Scheduler.DEFAULT_GROUP);
					Scheduler scheduler = simple.createScheduler();
					simple.scheduleJob(messageList.get(i).getSendTime(),
							messageList.get(i), messageList.get(i).getId(),
							messageService);
					scheduler.start();
 

 

分享到:
评论

相关推荐

    java邮箱,手机,定时发送的全部jar

    标题提到的"java邮箱,手机,定时发送的全部jar"是指用于Java实现邮件、手机消息发送及定时任务的必备库。下面将详细讲解这些知识点: 1. **JavaMail API**: JavaMail API是Java用来处理邮件的标准API,它提供了...

    易语言利用139邮箱发送短信源码

    易语言是一种专为初学者设计的编程语言,它采用了贴近...这种技术可以广泛应用于各种场景,比如系统通知、定时任务触发的短信提醒等。了解和掌握这样的技术,对于提升开发者解决问题的能力和拓宽应用场景具有重要意义。

    php实现定时发送天气预报到139邮箱

    在本文中,我们将深入探讨如何使用PHP实现定时发送天气预报到139邮箱的功能,以及相关的编程技巧和知识点。这个项目涉及到多个关键组件,包括PHP的定时器、天气API的查询、邮件发送以及数据库交互。 首先,让我们...

    网课监控,让孩子认真上好网课,定时自动截屏,定时自动发送Emai

    C#源码,定时自动截屏,定时自动发送Email,自动加入自启动,使用前先配置好SendEmail.exe.config中的参数,程序启动后,无界面,全程后台运行,如需变更参数,请先到任务管理器中先结束SendEmail进程

    java邮箱和手机发送链接和验证码

    3. **定时任务**:`java定时发送`可能是指使用Java的定时任务框架,如`java.util.Timer`、`java.util.concurrent.ScheduledExecutorService`或Quartz等。通过设定定时任务,可以在特定时间间隔内自动发送邮件或...

    定时开机定时关机操作手册

    总结来说,时间金系统是一款全方位的计算机控制工具,集成了多种实用功能,能够满足用户对定时任务、电源管理和自动操作的需求。无论是家庭用户还是企业用户,都能从中受益,提升电脑使用的效率和便捷性。

    基于SpringBoot3.x+Mybatis-Plus开发的通用后台管理系统源代码+数据库,简单易用,快速上手

    Quartz定时任务:异常报警 多样验证码:图片验证码、腾讯滑块验证码,配置快速切换 日志管理:登录日志、操作日志 系统监控:资源监控、redis监控 接口限制:停用、限流 通知公告:富文本编辑器 功能测试:测试邮件...

    使用quartz的项目实例(发送邮件和短信)

    Quartz是一个开源的作业调度框架,它允许程序在预定的时间执行特定任务,比如发送邮件或短信。在这个项目实例中,我们将深入理解如何使用Quartz来实现这些功能。 首先,我们关注的是`manyshipsRemindInit.xml`文件...

    短信群发营销在商贸系统中的应用方案知识.pdf

    - **个人短信发送**:员工有自己的地址本,可以方便地选择联系人发送短信,支持群发、定时发送和个人签名功能。 - **文件短信发送**:批量发送短信时,可预先编辑TXT/Excel文件,一键发送,提高效率。 - **短信...

    matlab发邮件或短信.zip_matlab发邮件_matlab程序自动发邮件_短信_自动发短信

    在MATLAB中发送电子邮件和短信是一项实用的技能,特别是在自动化数据报告、远程监控或系统通知等场景下。...在实际应用中,你可能还需要考虑错误处理、日志记录、定时任务等复杂情况,确保程序的稳定性和可靠性。

    利用Google日历向手机发送短信 Java

    它可以用于创建自动化任务,如定时提醒、事件同步等。 2. **Java**:这是一个广泛使用的面向对象的编程语言,以其简洁、高效和跨平台性而闻名。在这个项目中,Java被用来编写能够调用Google日历API的代码。 3. **...

    Android短信验证框架

    - **实现定时任务**:使用AlarmManager或者CountDownTimer,每隔一段时间自动获取验证码。 - **HTTP请求**:通过HTTP客户端向服务器发送POST请求,携带手机号,获取验证码。 - **UI交互**:更新UI,展示验证码,...

    Java阿里云短信接口

    Java阿里云短信接口是开发者在Java应用程序中集成阿里云短信...在实际开发中,可能还需要考虑异常处理、批量发送、定时任务发送等多种情况,以及遵循最佳实践,如安全存储AccessKey、避免频繁调用导致的费用问题等。

    使用uCOS-II操作系统的短信息电话机

    - **信号量和邮箱**:创建多个信号量和邮箱用于任务间的通信,如唤醒振铃任务、短消息任务、键盘任务等。 #### 总结 通过将μC/OS-II操作系统移植到EPSON E0C88104单片机上,成功实现了短信息电话机的开发。这款...

    MAS业务各行业介绍

    2. **点点通业务**:支持对多个不同手机号码同时或定时发送定制短信,兼容txt文本导入,适合大规模个性化消息推送。 3. **房产信息发布**:直接向潜在买家发送最新房源信息,加速销售过程。 4. **会议通知**:通过...

    用友U8C预警平台-20190420.pptx

    **后台任务**主要用于处理耗时较长的操作或周期性的业务处理过程,如成本计算、与其他系统的数据同步等。后台任务不仅可以提高系统的响应速度,还能合理分配系统资源,提升整体运行效率。 #### 四、预警平台插件...

    WTS工作跟进系统 v1.18

    系统每天会定时将未完成的工作任务推送到个人的电子邮箱中(服务器需要支持jmail组件);b、RTX推送。系统每天会将任务汇总信息推送到个人及分管领导的RTX上(需要RTX服务器支持);c、短信推送。系统每天会将任务...

    WTS工作跟进系统V1.10

    系统每天会定时将未完成的工作任务推送到个人的电子邮箱中(服务器需要支持jmail组件);b、RTX推送。系统每天会将任务汇总信息推送到个人及分管领导的RTX上(需要RTX服务器支持);c、短信推送。系统每天会将任务...

    异彩同学录单校版

    2. **同学生日显示**:系统需要存储并管理用户的生日信息,可能使用数据库(如MySQL或MongoDB)来存储这些数据,并设置定时任务(如Cron Job)在用户生日时触发提醒。此外,前端展示可能涉及时间格式化和日历组件的...

Global site tag (gtag.js) - Google Analytics