我在Terracotta集群环境下使用Quartz集群(两个Server实例A和B),采用StatefulJob,使用jobdataMap记录任务执行次数(count)。
A和B启动后,job在A结点执行,当A结点宕机后,B结点开始执行job,但是此时获取的jobdataMap中没有任何数据,也就重新开始计数。
相同的代码配置jdbcJobStore时,failover后计数正确。
代码如下:
quartz.properties:
org.quartz.scheduler.instanceName = ReportControlScheduler
org.quartz.scheduler.instanceId = AUTO
orgorg.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 4
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_job.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
#TerracottaJobStore
#org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
org.quartz.jobStore.class = org.terracotta.quartz.EnterpriseTerracottaJobStore
org.quartz.jobStore.tcConfigUrl = 10.4.46.121:9510
quartz_job.xml:
<?xml version='1.0' encoding='utf-8'?>
<job-scheduling-data
xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd"
version="2.0">
<schedule>
<job>
<name>ReportControlJob</name>
<group>Report</group>
<description>测试</description>
<job-class>com.neusoft.acap.eaf.QuartzJob</job-class>
<durability>false</durability>
<recover>false</recover>
<job-data-map>
<entry>
<key>count</key>
<value>0</value>
</entry>
</job-data-map>
</job>
<trigger>
<cron>
<name>report-trigger</name>
<group>Report_Group</group>
<description>Trigger</description>
<job-name>ReportControlJob</job-name>
<job-group>Report</job-group>
<cron-expression>0/15 * * * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
job代码:
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.quartz.SchedulerException;
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class QuartzJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
int count = 0;
System.out.println(context.isRecovering());
try {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
if(jobDataMap.containsKey("count")){
count = jobDataMap.getInt("count");
}
//显示job信息,count自动加1
System.out.println(context.getJobDetail().getDescription()+"--"+context.getTrigger().getDescription()+"--"+context.getScheduler().getSchedulerInstanceId()+"--"+context.getFireTime()+"---"+context.getNextFireTime()+"---"+count++);
jobDataMap.put("count", count);
//在下列等待中关闭任意结点,自动failover
System.out.println("开始等待");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("结束等待");
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分享到:
相关推荐
本配置手册将详细介绍如何在基于内存的模式下配置Quartz集群,利用Terracotta作为分布式数据管理平台。 首先,Terracotta Job Store for Quartz是Quartz与Terracotta集成的一种解决方案,它允许Quartz作业和触发器...
将Terracotta部署在两台PC上,每台机器的IP地址分别为192.168.2.13和192.168.2.19,这是为了创建一个集群环境,确保高可用性。 接着,要在两台机器上安装不同版本的Tomcat,如Tomcat 6.0.18、Tomcat 5.5.26和Tomcat...
在实际测试中,当 Terracotta 集群规模扩展到 8 个节点时,系统吞吐量仍能保持线性增长。 3. ** Tomcat 搭建 Web 应用集群的传统方法** - **负载均衡器粘 session**:所有同一 session 的请求均发送到同一 Tomcat ...
这时,Terracotta作为一个分布式内存管理平台,可以将Quartz作业存储和调度扩展到多台服务器上,形成一个集群,确保即使在服务器故障时任务也能继续执行。 首先,我们需要下载Terracotta 2.3.5版本。这个版本包含了...
在Tomcat集群中,Terracotta可以实现session复制和共享,确保用户在集群中的任意节点之间切换时,其会话状态保持一致,避免了session丢失的问题。 集群配置文件tc-config.xml是Terracotta的配置文件,用于定义集群...
**Terracotta 的实现方案**:利用 Terracotta 的集群间数据共享机制来优化 session 同步,即当在一个节点上对共享数据进行修改时,仅将变化的部分发送给 Terracotta 服务器,然后再由服务器转发给需要该数据的其他...
记载了terracotta如何与tomcat、jetty等服务器的集群,解释了tc-config.xml中各个配置的作用
其核心思想是在集群节点间共享数据时,仅传输数据的变化部分而非整个对象,从而大大减少了网络通信量。具体到session同步方面,Terracotta可以看作是对Tomcat自带的session复制机制的一种优化,既避免了对数据库的...
配置集群时,需要注意数据存储方式(如 JDBC 或 RAMJobStore)、节点间的通信机制(如 Terracotta 或 JMS)以及一致性策略,以确保任务的正确调度和避免重复执行。 总的来说,Quartz 是一个功能强大、易于使用的...
1. **自动负载均衡**:Terracotta能够自动检测集群中的节点状态,根据每个节点的负载情况动态调整数据分布,确保数据均匀分布在各个节点上,避免单点过载,从而实现负载均衡。 2. **故障转移**:当某个服务器出现...
Terracotta 对 Quartz 的扩展,实现了一个集群能力,不需要终端数据库的支持。 监听器和组件 监听器和组件可以捕捉到调度器的事件。然后就可以显示或者控制任务/触发器的行为。组建机制可以为 Quartz 提供附加的...
在多服务器的Web应用环境中,当用户在集群中的不同服务器之间移动时,保持其Session状态的一致性至关重要。如果Session信息不一致,可能导致用户登录状态丢失、购物车信息无法同步等问题,严重影响用户体验。 ** ...
2. **无锁数据一致性**:通过其独特的无锁数据一致性模型,Terracotta确保了在高并发环境下的数据完整性,避免了死锁和其他并发问题。 3. **热备与故障切换**:在集群中,如果一台服务器出现故障,Terracotta能自动...
Terracotta通过集成到Tomcat,解决了这个问题,它能自动将一个服务器上的session同步到集群中的其他服务器,确保即使在服务器故障情况下,用户的session信息也不会丢失。 **terracotta-3.7.7.tar.gz安装步骤** 1. *...
4. **Terracotta_Quartz_User_Guide.pdf**:对于使用 Terracotta 进行集群部署的用户,这份指南提供了有关在 Terracotta 集群环境中使用 Quartz 的信息。Terracotta 提供了分布式内存管理和故障恢复功能,使得 ...
演讲人程勇在《基于Terracotta和Continuent的可扩展集群架构》这一主题下首先探讨了关键应用架构面临的集群问题。 - **高可靠性问题**:随着企业业务的不断扩大,单一服务器往往难以满足日益增长的服务需求,因此...
当与Terracotta结合使用时,Ehcache可以实现分布式缓存,使得多台服务器上的应用可以共享同一份缓存数据,从而构建高可用的集群环境。在本篇中,我们将深入探讨如何在Java项目中配置Ehcache与Terracotta来实现这一...