`
第一弹
  • 浏览: 3134 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Terracotta Quartz集群环境下StatefulJob在Failover时状态数据丢失

阅读更多
我在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集群配置手册 [中文]

    本配置手册将详细介绍如何在基于内存的模式下配置Quartz集群,利用Terracotta作为分布式数据管理平台。 首先,Terracotta Job Store for Quartz是Quartz与Terracotta集成的一种解决方案,它允许Quartz作业和触发器...

    terracotta集群tomcat步骤

    将Terracotta部署在两台PC上,每台机器的IP地址分别为192.168.2.13和192.168.2.19,这是为了创建一个集群环境,确保高可用性。 接着,要在两台机器上安装不同版本的Tomcat,如Tomcat 6.0.18、Tomcat 5.5.26和Tomcat...

    Terracotta+tomcat集群配置详细说明(写了一晚上。。)

    在实际测试中,当 Terracotta 集群规模扩展到 8 个节点时,系统吞吐量仍能保持线性增长。 3. ** Tomcat 搭建 Web 应用集群的传统方法** - **负载均衡器粘 session**:所有同一 session 的请求均发送到同一 Tomcat ...

    quartz系列(三)terracotta2.3.5详细安装教程

    这时,Terracotta作为一个分布式内存管理平台,可以将Quartz作业存储和调度扩展到多台服务器上,形成一个集群,确保即使在服务器故障时任务也能继续执行。 首先,我们需要下载Terracotta 2.3.5版本。这个版本包含了...

    apache2.2+mod_JK+Tomcat7+Terracotta3.7 集群(重要)

    在Tomcat集群中,Terracotta可以实现session复制和共享,确保用户在集群中的任意节点之间切换时,其会话状态保持一致,避免了session丢失的问题。 集群配置文件tc-config.xml是Terracotta的配置文件,用于定义集群...

    通过 Terracotta实现基于Tomcat的Web应用集群

    **Terracotta 的实现方案**:利用 Terracotta 的集群间数据共享机制来优化 session 同步,即当在一个节点上对共享数据进行修改时,仅将变化的部分发送给 Terracotta 服务器,然后再由服务器转发给需要该数据的其他...

    terracotta 集群设置说明(中文)

    记载了terracotta如何与tomcat、jetty等服务器的集群,解释了tc-config.xml中各个配置的作用

    通过_Terracotta实现基于Tomcat的Web应用集群

    其核心思想是在集群节点间共享数据时,仅传输数据的变化部分而非整个对象,从而大大减少了网络通信量。具体到session同步方面,Terracotta可以看作是对Tomcat自带的session复制机制的一种优化,既避免了对数据库的...

    Quartz集群配置.doc

    配置集群时,需要注意数据存储方式(如 JDBC 或 RAMJobStore)、节点间的通信机制(如 Terracotta 或 JMS)以及一致性策略,以确保任务的正确调度和避免重复执行。 总的来说,Quartz 是一个功能强大、易于使用的...

    terracotta

    1. **自动负载均衡**:Terracotta能够自动检测集群中的节点状态,根据每个节点的负载情况动态调整数据分布,确保数据均匀分布在各个节点上,避免单点过载,从而实现负载均衡。 2. **故障转移**:当某个服务器出现...

    quartz scheduler 入门教程

    Terracotta 对 Quartz 的扩展,实现了一个集群能力,不需要终端数据库的支持。 监听器和组件 监听器和组件可以捕捉到调度器的事件。然后就可以显示或者控制任务/触发器的行为。组建机制可以为 Quartz 提供附加的...

    使用terracotta进行web session 同步

    在多服务器的Web应用环境中,当用户在集群中的不同服务器之间移动时,保持其Session状态的一致性至关重要。如果Session信息不一致,可能导致用户登录状态丢失、购物车信息无法同步等问题,严重影响用户体验。 ** ...

    terracotta-ee-4.1.2.jar,terracotta-license.key

    2. **无锁数据一致性**:通过其独特的无锁数据一致性模型,Terracotta确保了在高并发环境下的数据完整性,避免了死锁和其他并发问题。 3. **热备与故障切换**:在集群中,如果一台服务器出现故障,Terracotta能自动...

    terracotta-3.7.7.tar.gz

    Terracotta通过集成到Tomcat,解决了这个问题,它能自动将一个服务器上的session同步到集群中的其他服务器,确保即使在服务器故障情况下,用户的session信息也不会丢失。 **terracotta-3.7.7.tar.gz安装步骤** 1. *...

    官方 Quartz 2.2.2 Jar 包

    4. **Terracotta_Quartz_User_Guide.pdf**:对于使用 Terracotta 进行集群部署的用户,这份指南提供了有关在 Terracotta 集群环境中使用 Quartz 的信息。Terracotta 提供了分布式内存管理和故障恢复功能,使得 ...

    《基于Terracotta和Continuent的可扩展集群架构》

    演讲人程勇在《基于Terracotta和Continuent的可扩展集群架构》这一主题下首先探讨了关键应用架构面临的集群问题。 - **高可靠性问题**:随着企业业务的不断扩大,单一服务器往往难以满足日益增长的服务需求,因此...

    ehcache-terracotta代码配置

    当与Terracotta结合使用时,Ehcache可以实现分布式缓存,使得多台服务器上的应用可以共享同一份缓存数据,从而构建高可用的集群环境。在本篇中,我们将深入探讨如何在Java项目中配置Ehcache与Terracotta来实现这一...

Global site tag (gtag.js) - Google Analytics