Oralce增量同步方案-定时任务

使用Quarz调度Kettle执行定时抽取

以下只罗列一些关键部分。重点关注java代码模块;

1.工程Maven依赖;重点关注意红色字体标注内容。

 

 
  1. <?xml version="1.0"?>

  2. <project

  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

  4. xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  5. <modelVersion>4.0.0</modelVersion>

  6. <parent>

  7. <groupId>com.topsci</groupId>

  8. <artifactId>fqs-sync</artifactId>

  9. <version>1.0.8</version>

  10. </parent>

  11. <artifactId>fqs-sync-etl</artifactId>

  12. <version>1.0.8</version>

  13. <packaging>war</packaging>

  14. <name>fqs-sync-etl Maven Webapp</name>

  15. <url>http://maven.apache.org</url>

  16. <repositories>

  17. <repository>

  18. <id>pentaho-releases</id>

  19. <url>http://maven-repository.com/artifact/pentaho-kettle</url>

  20. </repository>

  21. <repository>

  22. <id>people.apache.snapshots</id>

  23. <url> http://repository.apache.org/content/groups/snapshots-group/ </url>

  24. <releases>

  25. <enabled>false</enabled>

  26. </releases>

  27. <snapshots>

  28. <enabled>true</enabled>

  29. </snapshots>

  30. </repository>

  31. </repositories>

  32. <dependencies>

  33. <dependency>

  34. <groupId>pentaho-kettle</groupId>

  35. <artifactId>kettle-core</artifactId>

  36. <version>7.1.0.0-12</version>

  37. </dependency>

  38. <dependency>

  39. <groupId>com.verhas </groupId>

  40. <artifactId>license3j</artifactId>

  41. <version>1.0.7</version>

  42. </dependency>

  43. <dependency>

  44. <groupId>pentaho-kettle</groupId>

  45. <artifactId>kettle-dbdialog</artifactId>

  46. <version>7.1.0.0-12</version>

  47. </dependency>

  48. <dependency>

  49. <groupId>pentaho-kettle</groupId>

  50. <artifactId>kettle-engine</artifactId>

  51. <version>7.1.0.0-12</version>

  52. </dependency>

  53. <dependency>

  54. <groupId>pentaho</groupId>

  55. <artifactId>metastore</artifactId>

  56. <version>7.1.0.0-12</version>

  57. </dependency>

  58. <dependency>

  59. <groupId>com.oracle</groupId>

  60. <artifactId>ojdbc6</artifactId>

  61. </dependency>

  62. <dependency>

  63. <groupId>com.fasterxml.jackson.core</groupId>

  64. <artifactId>jackson-core</artifactId>

  65. </dependency>

  66. <dependency>

  67. <groupId>com.fasterxml.jackson.core</groupId>

  68. <artifactId>jackson-databind</artifactId>

  69. </dependency>

  70.  
  71. <dependency>

  72. <groupId>org.slf4j</groupId>

  73. <artifactId>slf4j-api</artifactId>

  74. <version>1.7.7</version>

  75. </dependency>

  76. <dependency>

  77. <groupId>com.google.guava</groupId>

  78. <artifactId>guava</artifactId>

  79. <version>18.0</version>

  80. </dependency>

  81. <dependency>

  82. <groupId>junit</groupId>

  83. <artifactId>junit</artifactId>

  84. <version>${junit.version}</version>

  85. <!-- 表示开发的时候引入,发布的时候不会加载此包 -->

  86. <!-- <scope>test</scope> -->

  87. </dependency>

  88. <dependency>

  89. <groupId>org.quartz-scheduler</groupId>

  90. <artifactId>quartz</artifactId>

  91. <version>2.3.0</version>

  92. </dependency>

  93.  
  94. <dependency>

  95. <groupId>com.oracle</groupId>

  96. <artifactId>ojdbc6</artifactId>

  97. </dependency>

  98. <dependency>

  99. <groupId>com.topsci</groupId>

  100. <artifactId>fqs-commons</artifactId>

  101. </dependency>

  102. <dependency>

  103. <groupId>com.topsci</groupId>

  104. <artifactId>fqs-enty</artifactId>

  105. </dependency>

  106. <dependency>

  107. <groupId>org.springframework</groupId>

  108. <artifactId>spring-core</artifactId>

  109. </dependency>

  110. <dependency>

  111. <groupId>org.springframework</groupId>

  112. <artifactId>spring-jdbc</artifactId>

  113. </dependency>

  114. <dependency>

  115. <groupId>org.springframework</groupId>

  116. <artifactId>spring-context-support</artifactId>

  117. </dependency>

  118. <dependency>

  119. <groupId>org.springframework</groupId>

  120. <artifactId>spring-test</artifactId>

  121. </dependency>

  122. <dependency>

  123. <groupId>org.mybatis</groupId>

  124. <artifactId>mybatis</artifactId>

  125. </dependency>

  126. <dependency>

  127. <groupId>org.mybatis</groupId>

  128. <artifactId>mybatis-spring</artifactId>

  129. </dependency>

  130. <!-- mybatis分页插件 -->

  131. <dependency>

  132. <groupId>com.github.pagehelper</groupId>

  133. <artifactId>pagehelper</artifactId>

  134. <version>4.0.1</version>

  135. </dependency>

  136. <dependency>

  137. <groupId>org.aspectj</groupId>

  138. <artifactId>aspectjweaver</artifactId>

  139. <version>1.8.4</version>

  140. </dependency>

  141. <!-- 引入boncp数据库连接池 -->

  142. <dependency>

  143. <groupId>com.jolbox</groupId>

  144. <artifactId>bonecp-spring</artifactId>

  145. <version>0.8.0.RELEASE</version>

  146. </dependency>

  147. <!-- API框架生成 -->

  148. <dependency>

  149. <groupId>io.springfox</groupId>

  150. <artifactId>springfox-swagger2</artifactId>

  151. <version>2.7.0</version>

  152. </dependency>

  153. <dependency>

  154. <groupId>io.springfox</groupId>

  155. <artifactId>springfox-swagger-ui</artifactId>

  156. <version>2.7.0</version>

  157. </dependency>

  158. <dependency>

  159. <groupId>org.slf4j</groupId>

  160. <artifactId>jcl-over-slf4j</artifactId>

  161. <version>1.7.25</version>

  162. </dependency>

  163. <!-- 对内系统系统通讯 -->

  164. <dependency>

  165. <groupId>com.rabbitmq</groupId>

  166. <artifactId>amqp-client</artifactId>

  167. </dependency>

  168. <dependency>

  169. <groupId>org.springframework.amqp</groupId>

  170. <artifactId>spring-rabbit</artifactId>

  171. </dependency>

  172. </dependencies>

  173. <!-- 远程部署至开发服务器 -->

  174. <pluginRepositories>

  175. <pluginRepository>

  176. <id>apache.snapshots</id>

  177. <name>Apache Snapshots</name>

  178. <url> http://repository.apache.org/content/groups/snapshots-group/ </url>

  179. <releases>

  180. <enabled>false</enabled>

  181. </releases>

  182. <snapshots>

  183. <enabled>true</enabled>

  184. </snapshots>

  185. </pluginRepository>

  186. </pluginRepositories>

  187. <build>

  188. <finalName>fqs-sync-etl</finalName>

  189. <plugins>

  190. <plugin>

  191. <groupId>org.apache.maven.plugins</groupId>

  192. <artifactId>maven-compiler-plugin</artifactId>

  193. <version>2.3.2</version>

  194. <configuration>

  195. <source>1.8</source>

  196. <target>1.8</target>

  197. </configuration>

  198. </plugin>

  199. <plugin>

  200. <groupId>org.apache.tomcat.maven</groupId>

  201. <artifactId>tomcat7-maven-plugin</artifactId>

  202. <version>2.0-SNAPSHOT</version>

  203. <configuration>

  204. <url>http://192.168.6.221:8580/manager/text</url>

  205. <server>192.168.1.22_tomcat7</server>

  206. <username>admin</username>

  207. <password>admin</password>

  208. </configuration>

  209. </plugin>

  210. </plugins>

  211. </build>

  212. </project>

2.采用spring调度任务,本例采用手动触发机制。既用户会手动点击一次数据同步按钮触发任务

 

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

  4. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"

  5. xmlns:cache="http://www.springframework.org/schema/cache"

  6. xsi:schemaLocation="

  7. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

  8. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

  9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

  10. http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd

  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  12. <!-- 声明Job调度工厂 -->

  13. <bean id="scheduler" autowire="no"

  14. class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

  15. <property name="schedulerName" value="scheduler" />

  16. <property name="jobFactory">

  17. <bean class="com.atsig.etl.job.SpringQuarzFactory" />

  18. </property>

  19. <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />

  20. <!--必须的,QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动 -->

  21. <property name="startupDelay" value="10" />

  22. <!--可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->

  23. <property name="overwriteExistingJobs" value="true" />

  24. <!-- 设置自动启动 -->

  25. <property name="autoStartup" value="true" />

  26. <property name="waitForJobsToCompleteOnShutdown" value="true" />

  27. <!-- 注册jobDetail -->

  28. <property name="jobDetails">

  29. <list>

  30. <ref bean="historyTaskDetail" />

  31. <ref bean="baseTaskDetail" />

  32. <ref bean="todayTaskDetail" />

  33. </list>

  34. </property>

  35. </bean>

  36. <bean id="todayTaskDetail"

  37. class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

  38. <property name="jobClass" value="com.atsig.etl.job.TodayTask" />

  39. <!-- 必须标识job是持久的,删除触发器的时候不被删除 -->

  40. <property name="durability" value="true" />

  41. <!--requestsRecovery属性为true,则当Quartz服务被中止后,再次启动任务时会尝试恢复执行之前未完成的所有任务 -->

  42. <property name="requestsRecovery" value="true" />

  43. </bean>

  44.  
  45. <bean id="historyTaskDetail"

  46. class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

  47. <property name="jobClass" value="com.atsig.etl.job.HistoryTask" />

  48. <!-- 必须标识job是持久的,删除触发器的时候不被删除 -->

  49. <property name="durability" value="true" />

  50. <!--requestsRecovery属性为true,则当Quartz服务被中止后,再次启动任务时会尝试恢复执行之前未完成的所有任务 -->

  51. <property name="requestsRecovery" value="true" />

  52. </bean>

  53.  
  54. <bean id="baseTaskDetail"

  55. class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

  56. <property name="jobClass" value="com.atsig.etl.job.BaseTask" />

  57. <!-- 必须标识job是持久的,删除触发器的时候不被删除 -->

  58. <property name="durability" value="true" />

  59. <!--requestsRecovery属性为true,则当Quartz服务被中止后,再次启动任务时会尝试恢复执行之前未完成的所有任务 -->

  60. <property name="requestsRecovery" value="true" />

  61. </bean>

 
  1. import java.text.SimpleDateFormat;

  2. import java.util.ArrayList;

  3. import java.util.List;

  4. import java.util.Map;

  5. import java.util.concurrent.BrokenBarrierException;

  6.  
  7. import javax.annotation.Resource;

  8.  
  9. import org.apache.commons.lang.StringUtils;

  10. import org.canmeng.utils.BeanUtils;

  11. import org.canmeng.utils.JsonUtil;

  12. import org.canmeng.utils.PropertiesUtil;

  13. import org.canmeng.utils.TransResultUtil;

  14. import org.canmeng.utils.date.DateUtil;

  15. import org.pentaho.di.core.KettleEnvironment;

  16. import org.pentaho.di.core.util.EnvUtil;

  17. import org.pentaho.di.trans.Trans;

  18. import org.quartz.Job;

  19. import org.quartz.JobExecutionContext;

  20. import org.quartz.JobExecutionException;

  21. import org.slf4j.Logger;

  22. import org.slf4j.LoggerFactory;

  23. import org.springframework.amqp.core.AmqpTemplate;

  24. import org.springframework.amqp.core.TopicExchange;

  25. import org.springframework.beans.factory.annotation.Autowired;

  26. import org.springframework.stereotype.Component;

  27. import org.springframework.transaction.annotation.Transactional;

  28.  
  29.  
  30. import com.fasterxml.jackson.annotation.JsonInclude.Include;

  31. import com.fasterxml.jackson.databind.DeserializationFeature;

  32. import com.fasterxml.jackson.databind.ObjectMapper;

  33.  
  34. /**

  35. * @ClassName: TodayTask

  36. * @Description: 当日数据同步任务

  37. * @author tzhang

  38. * @date 2017年9月4日 上午9:48:24

  39. *

  40. */

  41. @Component

  42. @Transactional

  43. public class BaseTask implements Job {

  44. @Autowired

  45. private FqsDeptSubairlineMapper deptSubairlineMapper;

  46. @Autowired

  47. private FqsDeptMapper deptMapper;

  48. @Autowired

  49. private AommsServiceConfigMapper serviceConfigMapper;

  50.  
  51. private static PropertiesUtil config = PropertiesUtil.getInstance("config.properties");

  52. private ObjectMapper objectMapper = new ObjectMapper();

  53. @Resource

  54. private AmqpTemplate innerRbmqTemplate;

  55. @Resource

  56. private TopicExchange ampTopic;

  57. //权限消息变更通知

  58. private final static String PERMS_ROUTINGKEY=config.getPropsValue("notification.perms.routingkey");

  59. private static List<Trans> transList=new ArrayList<Trans>();

  60. public static Logger logger = LoggerFactory.getLogger(BaseTask.class);

  61.  
  62. {

  63. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

  64. objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

  65. // 序列化的时候跳过null字段

  66. objectMapper.setSerializationInclusion(Include.NON_NULL);

  67. // objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);

  68. objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

  69. }

  70. public void initBaseKtr(){

  71. try {

  72. // transList=LoadKtrUtil.loadKtr(SyncTableType.BASE);

  73. //手工替换飞机注册号 数据库连接

  74. } catch (Exception e) {

  75. logger.error("加载基础数据模型转换出错:", e);

  76. }

  77. }

  78. private static JobExecutionException exception;

  79.  
  80. public JobExecutionException getException() {

  81. return exception;

  82. }

  83. public void clearException(){

  84. exception=null;

  85. }

  86. public void execute(JobExecutionContext context) throws JobExecutionException {

  87. long startTime=System.currentTimeMillis();

  88. try {

  89. boolean isNotify=false;

  90. transList=LoadKtrUtil.loadKtr(SyncTableType.BASE);

  91. KettleEnvironment.init();

  92. EnvUtil.environmentInit();

  93. for (Trans trans :transList) {

  94. trans.execute(null); // You can pass arguments instead of null.

  95. trans.waitUntilFinished();

  96. if (trans.getErrors()>0) {

  97. this.exception= new JobExecutionException(trans.getName()+"执行转换出错,请联系管理员查看日志文件!");

  98. break;

  99. }

  100. /*if(StringUtils.indexOf(trans.getName(), "AOMMS_SERVICE_DETAIL")>=0||) {

  101.  
  102. }*/

  103. List<Map<String, Object>> transResults=TransResultUtil.loadResult(trans);

  104. logger.info("运行基础数据抽取作业{}",trans.getName());

  105. if(transResults.size()>0) {

  106. isNotify=true;

  107. String transName=trans.getName();

  108. if(StringUtils.indexOf(transName, "AOMMS_SERVICE_DETAIL")>=0) {

  109. updateOrDelDeptService(transResults);

  110. }else if(StringUtils.indexOf(transName, "SSUBAIRLINE")>=0) {

  111. updateOrDelDeptSubline(transResults);

  112. }

  113. }

  114. }

  115. if(isNotify) {

  116. notifyIaETLModify(new MQProtocol<String>(MessageType.IA,DataFlag.U,PERMS_ROUTINGKEY));

  117. }

  118. long endTime=System.currentTimeMillis();

  119. logger.info("{}耗时:{}s",context.getTrigger().getDescription(), (endTime-startTime)/1000);

  120. } catch (Exception e) {

  121. e.printStackTrace();

  122. // exception=new JobExecutionException("执行转换出错,请联系管理员查看日志文件!");

  123. }finally{

  124. try {

  125. SyncDataResources.waitSyncJob.await();

  126. } catch (InterruptedException e) {

  127. e.printStackTrace();

  128. } catch (BrokenBarrierException e) {

  129. e.printStackTrace();

  130. }

  131. }

  132. }

  133.  
  134.  
  135. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值