- 浏览: 176215 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (103)
- JS (17)
- 算法 (2)
- SVN (2)
- DB2 (1)
- JAVA (28)
- XML (2)
- DOM (2)
- flex (1)
- axis (1)
- weblogic (2)
- oracle (3)
- Struts2 (1)
- CSS (1)
- linux (4)
- ibatis (2)
- linux crontab (1)
- JSTL (1)
- jQuery (4)
- ajaxfileupload (1)
- POI (1)
- excel (1)
- JSONArray (0)
- JSONObject (0)
- JSON (2)
- postgresql (2)
- Ruby (2)
- mysql (7)
- tomcat (1)
- quartz (2)
- mail (1)
- UEditor (1)
- maven (1)
- eclipse (1)
- HttpClient (1)
- HttpGet (1)
- HttpPost (1)
- HttpHost (1)
- CredentialsProvider (1)
最新评论
-
快到碗里来_Jerry:
16777216L*Long.parseLong(ips[0] ...
IP地址与数字相互转换 -
谷超:
不知道楼主是否有更深入的研究
Quartz数据源配置 -
谷超:
楼主,quartz配置数据库信息后,是能够把job信息保存到数 ...
Quartz数据源配置
应用场景: 集群环境. 在多台服务器布置了相同的程序,程序中都包含有相同的定时器任务.如果不做处理,则会出现定时任务重复执行的问题,一般的业务场景这个是必须要避免的.
解决办法: 一. 只在一台服务器发布带有定时器的程序,其他的全都去除定时任务再发布. (如果这台服务器宕掉了,那就悲剧了) ; 二. 采用Quratz开源定时任务框架,并配置集群.(好处在于spring集成了对Quratz的支持,如果你也用了spring+Quratz,往下看).
本用例采用框架版本: Spring 3.0 + Quratz 1.8.5 参考:http://soulshard.iteye.com/blog/337886
起初采用spring对Quratz的原生支持,但是报错. 异常信息:
java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
据说是spring的bug,按照以上地址里给的解决办法,重写了MethodInvokingJobDetailFactoryBean. 但诡异的是,仍然报出 java.io.NotSerializableException,由于我的定时器里引用了Service层,这里抛出的是dataSource is not serializable.本以为是因为序列化的时候把Dao属性也获取并序列化了,所以就把getDao()都去掉了,但是还是会报错,看来不是按照这个逻辑执行程序的,按照上面地址里说的方案之一,说可以把service和Dao层都继承Serializable,但是我放弃了,因为我没办法把dataSource也继承 Serializable. 之后看了下面的留言,有一位仁兄写好了demo,并分享了出来.地址:http://download.csdn.net/source/2777549 OK,下面说详细代码.因为我下了那个demo之后还弄了好一会儿,有必要记录一下.
解决思路: 编写一个带有String类型属性的,实现Serializable的伪任务类,执行任务调度时,调用此类的实例,并注入真正要调用的类的Bean ID.也就是说,初始化任务的时候,注入的是这个类,而类中调用真正要执行的任务.从而避免了序列化问题.
伪任务类PseudoJob.java
public class BootstrapJob implements Serializable{
private static final long serialVersionUID = 4195235887559214105L;
private String targetJob ;
public void execute(ApplicationContext cxt) {
Job job = (Job)cxt.getBean(this.targetJob);
job.execute() ;
}
public String getTargetJob() {
return targetJob;
}
public void setTargetJob(String targetJob) {
this.targetJob = targetJob;
}
}
Job接口类:定时任务类必须继承Job接口
public interface Job extends Serializable{
void execute();
}
MethodInvokingJobDetailFactoryBean
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.StatefulJob;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.util.MethodInvoker;
public class MethodInvokingJobDetailFactoryBean implements FactoryBean, BeanNameAware, InitializingBean
{
private Log logger = LogFactory.getLog(getClass());
private String group = Scheduler.DEFAULT_GROUP;
private boolean concurrent = true;
private boolean durable = false;
private boolean volatility = false;
private boolean shouldRecover = false;
private String[] jobListenerNames;
private String beanName;
private JobDetail jobDetail;
private String targetClass;
private Object targetObject;
private String targetMethod;
private String staticMethod;
private Object[] arguments;
public String getTargetClass()
{
return targetClass;
}
public void setTargetClass(String targetClass)
{
this.targetClass = targetClass;
}
public String getTargetMethod()
{
return targetMethod;
}
public void setTargetMethod(String targetMethod)
{
this.targetMethod = targetMethod;
}
public Object getObject() throws Exception
{
return jobDetail;
}
public Class getObjectType()
{
return JobDetail.class;
}
public boolean isSingleton()
{
return true;
}
public void setBeanName(String beanName)
{
this.beanName = beanName;
}
public void afterPropertiesSet() throws Exception
{
try
{
logger.debug("start");
logger.debug("Creating JobDetail "+beanName);
jobDetail = new JobDetail();
jobDetail.setName(beanName);
jobDetail.setGroup(group);
jobDetail.setJobClass(concurrent ? MethodInvokingJob.class : StatefulMethodInvokingJob.class);
jobDetail.setDurability(durable);
jobDetail.setVolatility(volatility);
jobDetail.setRequestsRecovery(shouldRecover);
if(targetClass!=null)
jobDetail.getJobDataMap().put("targetClass", targetClass);
if(targetObject!=null)
jobDetail.getJobDataMap().put("targetObject", targetObject);
if(targetMethod!=null)
jobDetail.getJobDataMap().put("targetMethod", targetMethod);
if(staticMethod!=null)
jobDetail.getJobDataMap().put("staticMethod", staticMethod);
if(arguments!=null)
jobDetail.getJobDataMap().put("arguments", arguments);
logger.debug("Registering JobListener names with JobDetail object "+beanName);
if (this.jobListenerNames != null) {
for (int i = 0; i < this.jobListenerNames.length; i++) {
this.jobDetail.addJobListener(this.jobListenerNames[i]);
}
}
logger.info("Created JobDetail: "+jobDetail+"; targetClass: "+targetClass+"; targetObject: "+targetObject+"; targetMethod: "+targetMethod+"; staticMethod: "+staticMethod+"; arguments: "+arguments+";");
}
finally
{
logger.debug("end");
}
}
public void setConcurrent(boolean concurrent)
{
this.concurrent = concurrent;
}
public void setDurable(boolean durable)
{
this.durable = durable;
}
public void setGroup(String group)
{
this.group = group;
}
public void setJobListenerNames(String[] jobListenerNames)
{
this.jobListenerNames = jobListenerNames;
}
public void setShouldRecover(boolean shouldRecover)
{
this.shouldRecover = shouldRecover;
}
public void setVolatility(boolean volatility)
{
this.volatility = volatility;
}
public static class MethodInvokingJob implements Job
{
protected Log logger = LogFactory.getLog(getClass());
public void execute(JobExecutionContext context) throws JobExecutionException
{
try
{
logger.debug("start");
String targetClass = context.getMergedJobDataMap().getString("targetClass");
Class targetClassClass = null;
if(targetClass!=null)
{
targetClassClass = Class.forName(targetClass); // Could throw ClassNotFoundException
}
Object targetObject = context.getMergedJobDataMap().get("targetObject");
if(targetObject instanceof BootstrapJob){
ApplicationContext ac = (ApplicationContext)context.getScheduler().getContext().get("applicationContext");
BootstrapJob target = (BootstrapJob)targetObject ;
target.execute(ac);
}else{
String targetMethod = context.getMergedJobDataMap().getString("targetMethod");
String staticMethod = context.getMergedJobDataMap().getString("staticMethod");
Object[] arguments = (Object[])context.getMergedJobDataMap().get("arguments");
MethodInvoker methodInvoker = new MethodInvoker();
methodInvoker.setTargetClass(targetClassClass);
methodInvoker.setTargetObject(targetObject);
methodInvoker.setTargetMethod(targetMethod);
methodInvoker.setStaticMethod(staticMethod);
methodInvoker.setArguments(arguments);
methodInvoker.prepare();
methodInvoker.invoke();
}
}
catch(Exception e)
{
throw new JobExecutionException(e);
}
finally
{
logger.debug("end");
}
}
}</pre>
public static class StatefulMethodInvokingJob extends MethodInvokingJob implements StatefulJob
{
// No additional functionality; just needs to implement StatefulJob.
}
public Object[] getArguments()
{
return arguments;
}
public void setArguments(Object[] arguments)
{
this.arguments = arguments;
}
public String getStaticMethod()
{
return staticMethod;
}
public void setStaticMethod(String staticMethod)
{
this.staticMethod = staticMethod;
}
public void setTargetObject(Object targetObject)
{
this.targetObject = targetObject;
}
}
实际的任务调度类:TaskDemo.java
public class TaskDemo implements Job {
public void execute(){
System.out.println("这个是实际的任务");
}
}
Spring applicationContext.xml 配置
<bean name="taskJob" class="TaskDemo"/>
<bean id="_taskJob" class="PseudoJob">
<property name="targetJob" value="taskJob" />
</bean>
<!--这里的MethodInvokingJobDetailFactoryBean路径要写自己重写的那个,非Spring包下的-->
<bean id="taskJobDetail" class="MethodInvokingJobDetailFactoryBean">
<property name="concurrent" value="true" />
<property name="targetObject" ref="_taskJob" />
<property name="targetMethod" value="execute" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="taskJobDetail" />
</property>
<property name="cronExpression">
<value>0 0 6 * * ?</value>
</property>
</bean>
<!--dataSource采用spring中已有的dataSource-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="configLocation" value="classpath:quartz.properties" />
<property name="dataSource" ref="dataSource" />
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
<!-- 这个属性决定当在spring配置文件里修改任务执行时间的时候,是否更新数据库,默认是不更新的,也就是说,你第一通过修改配置文件定义了时间,之后再修改是不会起任何作用的-->
<property name="overwriteExistingJobs" value="true"/>
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
</bean>
OK,这样就大功告成了,别说还真神奇,经测试两台机器只有随机的一台执行定时任务.这篇文章只写了spring整合Quartz集群下的spring的配置,没有写Quartz的配置,有时间再整理一下.
Ps:好记性不如烂笔头儿,这技术的东西还是记载下来好.不过也真挺累啊.
转:Spring+Quartz的集群配置 | I'M .K + http://www.2016k.com/programmer/java/08-91.html
解决办法: 一. 只在一台服务器发布带有定时器的程序,其他的全都去除定时任务再发布. (如果这台服务器宕掉了,那就悲剧了) ; 二. 采用Quratz开源定时任务框架,并配置集群.(好处在于spring集成了对Quratz的支持,如果你也用了spring+Quratz,往下看).
本用例采用框架版本: Spring 3.0 + Quratz 1.8.5 参考:http://soulshard.iteye.com/blog/337886
起初采用spring对Quratz的原生支持,但是报错. 异常信息:
java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
据说是spring的bug,按照以上地址里给的解决办法,重写了MethodInvokingJobDetailFactoryBean. 但诡异的是,仍然报出 java.io.NotSerializableException,由于我的定时器里引用了Service层,这里抛出的是dataSource is not serializable.本以为是因为序列化的时候把Dao属性也获取并序列化了,所以就把getDao()都去掉了,但是还是会报错,看来不是按照这个逻辑执行程序的,按照上面地址里说的方案之一,说可以把service和Dao层都继承Serializable,但是我放弃了,因为我没办法把dataSource也继承 Serializable. 之后看了下面的留言,有一位仁兄写好了demo,并分享了出来.地址:http://download.csdn.net/source/2777549 OK,下面说详细代码.因为我下了那个demo之后还弄了好一会儿,有必要记录一下.
解决思路: 编写一个带有String类型属性的,实现Serializable的伪任务类,执行任务调度时,调用此类的实例,并注入真正要调用的类的Bean ID.也就是说,初始化任务的时候,注入的是这个类,而类中调用真正要执行的任务.从而避免了序列化问题.
伪任务类PseudoJob.java
public class BootstrapJob implements Serializable{
private static final long serialVersionUID = 4195235887559214105L;
private String targetJob ;
public void execute(ApplicationContext cxt) {
Job job = (Job)cxt.getBean(this.targetJob);
job.execute() ;
}
public String getTargetJob() {
return targetJob;
}
public void setTargetJob(String targetJob) {
this.targetJob = targetJob;
}
}
Job接口类:定时任务类必须继承Job接口
public interface Job extends Serializable{
void execute();
}
MethodInvokingJobDetailFactoryBean
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.StatefulJob;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.util.MethodInvoker;
public class MethodInvokingJobDetailFactoryBean implements FactoryBean, BeanNameAware, InitializingBean
{
private Log logger = LogFactory.getLog(getClass());
private String group = Scheduler.DEFAULT_GROUP;
private boolean concurrent = true;
private boolean durable = false;
private boolean volatility = false;
private boolean shouldRecover = false;
private String[] jobListenerNames;
private String beanName;
private JobDetail jobDetail;
private String targetClass;
private Object targetObject;
private String targetMethod;
private String staticMethod;
private Object[] arguments;
public String getTargetClass()
{
return targetClass;
}
public void setTargetClass(String targetClass)
{
this.targetClass = targetClass;
}
public String getTargetMethod()
{
return targetMethod;
}
public void setTargetMethod(String targetMethod)
{
this.targetMethod = targetMethod;
}
public Object getObject() throws Exception
{
return jobDetail;
}
public Class getObjectType()
{
return JobDetail.class;
}
public boolean isSingleton()
{
return true;
}
public void setBeanName(String beanName)
{
this.beanName = beanName;
}
public void afterPropertiesSet() throws Exception
{
try
{
logger.debug("start");
logger.debug("Creating JobDetail "+beanName);
jobDetail = new JobDetail();
jobDetail.setName(beanName);
jobDetail.setGroup(group);
jobDetail.setJobClass(concurrent ? MethodInvokingJob.class : StatefulMethodInvokingJob.class);
jobDetail.setDurability(durable);
jobDetail.setVolatility(volatility);
jobDetail.setRequestsRecovery(shouldRecover);
if(targetClass!=null)
jobDetail.getJobDataMap().put("targetClass", targetClass);
if(targetObject!=null)
jobDetail.getJobDataMap().put("targetObject", targetObject);
if(targetMethod!=null)
jobDetail.getJobDataMap().put("targetMethod", targetMethod);
if(staticMethod!=null)
jobDetail.getJobDataMap().put("staticMethod", staticMethod);
if(arguments!=null)
jobDetail.getJobDataMap().put("arguments", arguments);
logger.debug("Registering JobListener names with JobDetail object "+beanName);
if (this.jobListenerNames != null) {
for (int i = 0; i < this.jobListenerNames.length; i++) {
this.jobDetail.addJobListener(this.jobListenerNames[i]);
}
}
logger.info("Created JobDetail: "+jobDetail+"; targetClass: "+targetClass+"; targetObject: "+targetObject+"; targetMethod: "+targetMethod+"; staticMethod: "+staticMethod+"; arguments: "+arguments+";");
}
finally
{
logger.debug("end");
}
}
public void setConcurrent(boolean concurrent)
{
this.concurrent = concurrent;
}
public void setDurable(boolean durable)
{
this.durable = durable;
}
public void setGroup(String group)
{
this.group = group;
}
public void setJobListenerNames(String[] jobListenerNames)
{
this.jobListenerNames = jobListenerNames;
}
public void setShouldRecover(boolean shouldRecover)
{
this.shouldRecover = shouldRecover;
}
public void setVolatility(boolean volatility)
{
this.volatility = volatility;
}
public static class MethodInvokingJob implements Job
{
protected Log logger = LogFactory.getLog(getClass());
public void execute(JobExecutionContext context) throws JobExecutionException
{
try
{
logger.debug("start");
String targetClass = context.getMergedJobDataMap().getString("targetClass");
Class targetClassClass = null;
if(targetClass!=null)
{
targetClassClass = Class.forName(targetClass); // Could throw ClassNotFoundException
}
Object targetObject = context.getMergedJobDataMap().get("targetObject");
if(targetObject instanceof BootstrapJob){
ApplicationContext ac = (ApplicationContext)context.getScheduler().getContext().get("applicationContext");
BootstrapJob target = (BootstrapJob)targetObject ;
target.execute(ac);
}else{
String targetMethod = context.getMergedJobDataMap().getString("targetMethod");
String staticMethod = context.getMergedJobDataMap().getString("staticMethod");
Object[] arguments = (Object[])context.getMergedJobDataMap().get("arguments");
MethodInvoker methodInvoker = new MethodInvoker();
methodInvoker.setTargetClass(targetClassClass);
methodInvoker.setTargetObject(targetObject);
methodInvoker.setTargetMethod(targetMethod);
methodInvoker.setStaticMethod(staticMethod);
methodInvoker.setArguments(arguments);
methodInvoker.prepare();
methodInvoker.invoke();
}
}
catch(Exception e)
{
throw new JobExecutionException(e);
}
finally
{
logger.debug("end");
}
}
}</pre>
public static class StatefulMethodInvokingJob extends MethodInvokingJob implements StatefulJob
{
// No additional functionality; just needs to implement StatefulJob.
}
public Object[] getArguments()
{
return arguments;
}
public void setArguments(Object[] arguments)
{
this.arguments = arguments;
}
public String getStaticMethod()
{
return staticMethod;
}
public void setStaticMethod(String staticMethod)
{
this.staticMethod = staticMethod;
}
public void setTargetObject(Object targetObject)
{
this.targetObject = targetObject;
}
}
实际的任务调度类:TaskDemo.java
public class TaskDemo implements Job {
public void execute(){
System.out.println("这个是实际的任务");
}
}
Spring applicationContext.xml 配置
<bean name="taskJob" class="TaskDemo"/>
<bean id="_taskJob" class="PseudoJob">
<property name="targetJob" value="taskJob" />
</bean>
<!--这里的MethodInvokingJobDetailFactoryBean路径要写自己重写的那个,非Spring包下的-->
<bean id="taskJobDetail" class="MethodInvokingJobDetailFactoryBean">
<property name="concurrent" value="true" />
<property name="targetObject" ref="_taskJob" />
<property name="targetMethod" value="execute" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="taskJobDetail" />
</property>
<property name="cronExpression">
<value>0 0 6 * * ?</value>
</property>
</bean>
<!--dataSource采用spring中已有的dataSource-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="configLocation" value="classpath:quartz.properties" />
<property name="dataSource" ref="dataSource" />
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
<!-- 这个属性决定当在spring配置文件里修改任务执行时间的时候,是否更新数据库,默认是不更新的,也就是说,你第一通过修改配置文件定义了时间,之后再修改是不会起任何作用的-->
<property name="overwriteExistingJobs" value="true"/>
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
</bean>
OK,这样就大功告成了,别说还真神奇,经测试两台机器只有随机的一台执行定时任务.这篇文章只写了spring整合Quartz集群下的spring的配置,没有写Quartz的配置,有时间再整理一下.
Ps:好记性不如烂笔头儿,这技术的东西还是记载下来好.不过也真挺累啊.
转:Spring+Quartz的集群配置 | I'M .K + http://www.2016k.com/programmer/java/08-91.html
发表评论
-
JVM分析
2016-06-16 13:24 434在这里对linux下、sun(oracle) JDK的线程 ... -
新版apache HttpClient调用http接口
2016-03-29 10:49 1186新项目中使用新版的apache HttpClient调用h ... -
IP地址与数字相互转换
2015-12-03 11:50 952/** * ip地址转成整数. ... -
com.sun.xml.stream.ZephyrParserFactory not found
2015-10-12 14:52 2147org.springframework.beans.fact ... -
HTTP - 304实现
2015-09-30 09:21 1061最近公司做了一个CMS项目,其中涉及到图片上传后页面展现, ... -
java mail 发送邮件
2015-07-01 17:51 4701. 邮件发送封装类 import java.util.P ... -
银行卡验证
2015-06-05 16:06 1280现行 16 位银联卡现行卡号开头 6 位是 622126~6 ... -
java读取classpath文件
2015-02-26 10:05 779ClassLoader 提供了两个方法用于从装载的类路径中取 ... -
Java中如何获取spring中配置的properties属性文件内容
2015-02-13 15:27 1880String host = (String) Custom ... -
CXF动态客户端No operation was found with the name问题
2015-01-21 12:59 1114如果WebService发布时,接口和实现类指定的names ... -
RestTemplate设置代理
2015-01-16 10:35 4494RestTemplate restTemplate = ne ... -
java字符串压缩
2015-01-14 13:49 2172采用jdk自带的gzip和zip方法进行压缩。并用apac ... -
遍历JSONArray及JSONObject
2015-01-14 12:59 2730String json = "{''data' ... -
java 已知一个Date(),获取前一天和后一天
2014-11-10 16:36 1795import java.text.ParseExceptio ... -
遍历Collection
2014-07-29 13:37 968一、Map的遍历 import java.util.Has ... -
Service里直接写iBATIS
2014-03-05 15:08 684以前使用iBATIS时,DAO类,需要先定义一个接口,再定义 ... -
EntrySet比KeySet效率高
2014-03-05 14:57 946import java.util.Calendar; im ... -
Java跳出for循环
2014-02-21 12:44 1166a: for (Person person : ... -
Dom4j将document对象转换成String
2013-08-01 10:30 2706Dom4j将document对象转换成String: do ... -
IO中用ByteArrayOutputStream解决乱码问题
2013-07-31 20:48 7735IO中另外一种防止乱码的方法:使用ByteArrayOutp ...
相关推荐
java + quartz实现定时任务,实现集群配置,在集群环境下多节点运行定时Quartz定任务,就会存在重复处理任务的现象,为解决这一问题,下面我将介绍使用 Quartz 的 TASK ( 12 张表)实例化到数据库,基于数据库自动...
NULL 博文链接:https://vista-move.iteye.com/blog/2274246
spring 集成quartz定时任务 用数据库实现quartz的集群
本人花费多日时间,亲测有效。所需文件代码完整,只需导入常用开发IDE和mysql数据库即可正常使用。
spring3+ quartz1.8的使用开发,包括quartz在spring的各种配置,以及集群的多种版本数据库脚本,欢迎大家下载。
主要给大家介绍了关于spring boot + quartz集群搭建的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
NULL 博文链接:https://daoshud1.iteye.com/blog/1955099
spring-cloud-alibaba+dubbo+nacos+quartz以yml配置方式实现
NULL 博文链接:https://fanshuyao.iteye.com/blog/2392350
1、项目整体采用Maven分模块构建、SVN版本控制、PowerDesigner数据建模,基于约定标准的项目工程结构,同时讲解了很多主流Maven插件的使用配置。 2、前端页面采用流行的bootstrap、 angularjs 等流行的前端技术,...
1,如果只是集成spring和quartz,则只需要jar包,和编写配置文件,即可。 2,如果考虑集群部署,会用到tables_mysql.sql。
spring 集成 quartz ,支持集群,job支持spring@Autowired注入及@Resource注入
spring整合quartz使用jdbc存储任务,并配置为quartz集群应用
需要把app部署在多台服务器上,但只能让其中一台服务器的job执行,一台服务器挂了,另一台还能继续执行job,通过网上查找资料,都是java工程的方式,不好部署并测试,经过二天辛苦整合,终于整理成一个单spring web...
本文章是关于springboot集成quartz集群的步骤,LZ亲测。
springboot 集成 quartz 集群 加 sql 等 文章介绍 单机加集群都有 https://blog.csdn.net/weixin_42749765/article/details/88532413
用户管理:用户是系统操作者,该功能主要完成系统用户配置。 部门管理:配置系统组织机构(公司、部门、小组),树结构展现。 岗位管理:配置系统用户所属担任职务。 菜单管理:配置系统菜单,操作权限,按钮权限...
针对Quartz与Spring做集群的Demo实例,主要解决了Quartz的JOB序列化问题。 源代码说明: support pkg:扩展Spring与Quartz集成的不足之处。 core pkg: 是自身调度业务的封装 实例运行依赖Oracle数据库,根据quartz...