我使用Quartz1.5.2和Spring3.2.1来做调度器任务,在我的应用程序中,我需要在某个时候重新安排任务,但我发现每次重新安排任务时,它都会在第一次执行两次。
下面是我的Quartz+Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd ">
<bean id="testScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="startupDelay" value="0"/>
<property name="triggers">
<list>
<ref bean="testJobTrigger" />
</list>
</property>
</bean>
<bean id="testJob" class="com.lucumt.quartz.JobScheduler"></bean>
<bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testJob" />
<property name="targetMethod" value="schedulerJob" />
<property name="concurrent" value="false"/>
</bean>
<bean id="testJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="testJobDetail" />
<property name="cronExpression" value="0/10 * * * * ?" />
</bean>
</beans>
我把它作为一个web应用程序,下面是web.xml的代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Dynamic Quartz Scheduler</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-context-*.xml</param-value>
</context-param>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-context-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
</web-app>
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContext;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.web.context.ServletContextAware;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class JobScheduler implements ServletContextAware {
private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private ServletContext context;
private int count = 0;
private String type = "10";
@Override
public void setServletContext(ServletContext context) {
this.context=context;
}
public void schedulerJob() {
count++;
System.out.println("=========fixed output: " + df.format(new Date())+"\t"+count);
if(count%4==0){
if(type.equals("10")){
this.resetJob("0/30 * * * * ?");
}else if(type.equals("30")){
this.resetJob("0/10 * * * * ?");
}
if(type.equals("10")){
type = "30";
}else{
type = "10";
}
}
}
public void resetJob(String expression){
System.out.println("****************change to:\t" + expression);
ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
Scheduler scheduler = (Scheduler) applicationContext.getBean("testScheduler");
try {
CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("testJobTrigger", Scheduler.DEFAULT_GROUP);
trigger.setCronExpression(expression);
scheduler.rescheduleJob("testJobTrigger", Scheduler.DEFAULT_GROUP, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
//I think these two lines may cause the problem,but I don't know how to modify it.
ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
Scheduler scheduler = (Scheduler) applicationContext.getBean("testScheduler");
public void resetJob(String expression){
System.out.println("****************change to:\t" + expression);
ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
Scheduler scheduler = (Scheduler) applicationContext.getBean("testScheduler");
try {
//CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("testJobTrigger", Scheduler.DEFAULT_GROUP);
CronTriggerBean trigger = new CronTriggerBean();
trigger.setName("testJobTrigger");
trigger.setGroup(Scheduler.DEFAULT_GROUP);
trigger.setJobName("testJobDetail");
trigger.setCronExpression(expression);
scheduler.rescheduleJob("testJobTrigger", Scheduler.DEFAULT_GROUP, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
尝试创建一个新的触发器对象,不要重用旧的触发器对象。
如何将CronTimer迭代器设置为1?或者如何停止排定程序多次执行作业。 有什么建议吗?谢谢,古扬·沙阿。
我有一个使用Quartz1.6.6的Java应用程序。它被部署到Weblogic上,Weblogic的体系结构包括两个应用服务器。 令人困惑的是,我有另一个Java应用程序,其中包含了Quartz调度,它似乎运行得非常愉快。另一个应用程序有一个相同的机制,每分钟触发一个触发器,从日志中我可以看到该作业每60秒只运行一次。 昨天下午作业已运行的次数示例: 15:10:46,984 15:10:49,
我有一个代码来安排每5分钟执行一个作业。代码如下 制作触发器的代码如下所示。 现在我通过下面的代码安排作业
问题内容: 我正在尝试使用jaxb- maven插件使用JAXB将多个XSD转换为不同包中的POJO。我已将其设置为使用多个执行块,然后执行第一个执行块,然后出现一条消息:模式或绑定文件中未检测到更改 这是我pom.xml的摘录: 这是我收到的错误消息: 如果我交换执行块,则第一个总是执行,其余两个块得到相同的消息。 关于如何解决这个问题的任何想法? 问题答案: 通过升级到版本1.6进行了修复 和
从HomeActivity我正在尝试从CreateProfileActivity获取结果。在这里我要做什么来开始这个活动 以下是HomeActivity中方法的实现: 当im完成并按下save in后,下面是我将数据发送回HomeActivity的操作: 在上调用setResult方法一次,但由于某种未知原因,当数据到达方法时,get execute两次。第一个结果的和第二个结果的。在此之后,得到