• Worker+MQ解惑


        用Worker来保证数据的一致性,再加上MQ来便于水平扩展,也提升了Worker的效率。这就是传说中的Worker+MQ,又叫做可靠消息方式。另外,将任务的查询和执行分工,形成父子任务,达到真正的分布式任务,也能提升Worker效率。

    Java代码  收藏代码
    1. package com.itlong.bjxizhan.support.web.job.base;  
    2.   
    3. import com.itlong.bjxizhan.common.DbContext;  
    4. import com.itlong.bjxizhan.domain.pojo.Task;  
    5. import com.itlong.bjxizhan.support.web.service.StandardTaskService;  
    6. import org.slf4j.Logger;  
    7. import org.slf4j.LoggerFactory;  
    8.   
    9. import java.util.List;  
    10.   
    11. /** 
    12.  * Created by shenhongxi on 2016/7/12. 
    13.  */  
    14. public class JobRunnable implements Runnable {  
    15.   
    16.     private static final Logger log = LoggerFactory.getLogger(JobRunnable.class);  
    17.   
    18.     private StandardTaskService standardTaskService;  
    19.   
    20.     private List<Task> tasks;  
    21.   
    22.     private String dbKey;  
    23.   
    24.     private String tableIndex;  
    25.   
    26.     @Override  
    27.     public void run() {  
    28.         if (tasks != null) {  
    29.             try {  
    30.                 DbContext.setDbKey(dbKey);  
    31.                 DbContext.setTableIndex(tableIndex);  
    32.                 for (Task task : tasks) {  
    33.                     task.setTableIndex(tableIndex);  
    34.   
    35.                     // 1. 一个job的多个实例,谁先成功锁定任务,谁先处理任务,若处理失败则解锁任务  
    36.                     // 2. 对于1中解锁失败的,要利用另外的job来专门进行解锁  
    37.                     // 3. 将任务分成几批,并行处理  
    38.                     // 4. 这些任务的子任务分批串行处理,同样有锁定-处理-失败解锁  
    39.                     // 5. 对于4中解锁失败的,同样要利用另外的job来专门进行解锁  
    40.                     boolean locked = standardTaskService.lock(task);  
    41.                     if (!locked) continue;  
    42.   
    43.                     boolean result = standardTaskService.process(task);  
    44.   
    45.                     standardTaskService.finished(result, task);  
    46.                 }  
    47.             } catch (Exception e) {  
    48.                 log.error("Do task error", e);  
    49.                 throw new RuntimeException("Do task error");  
    50.             }  
    51.         }  
    52.     }  
    53.   
    54.     public List<Task> getTasks() {  
    55.         return tasks;  
    56.     }  
    57.   
    58.     public void setTasks(List<Task> tasks) {  
    59.         this.tasks = tasks;  
    60.     }  
    61.   
    62.     public StandardTaskService getStandardTaskService() {  
    63.         return standardTaskService;  
    64.     }  
    65.   
    66.     public void setStandardTaskService(StandardTaskService standardTaskService) {  
    67.         this.standardTaskService = standardTaskService;  
    68.     }  
    69.   
    70.     public String getTableIndex() {  
    71.         return tableIndex;  
    72.     }  
    73.   
    74.     public void setTableIndex(String tableIndex) {  
    75.         this.tableIndex = tableIndex;  
    76.     }  
    77.   
    78.     public String getDbKey() {  
    79.         return dbKey;  
    80.     }  
    81.   
    82.     public void setDbKey(String dbKey) {  
    83.         this.dbKey = dbKey;  
    84.     }  
    85. }  

     ***:org.quartz.Scheduler提供了start, bystand等方法可以对Scheduler进行管控

  • 相关阅读:
    DB2中的ROW_NUMBER() OVER()函数用法 转
    各个数据库分页语句汇总
    db2导出DDL
    db2数据库操作
    在myeclipse+tomcat中出现org.apache.juli.logging.LogFactory这样的错误,为什么?
    spring的事务管理有几种方式实现 (转自:http://blog.csdn.net/bopzhou/article/details/7094108)
    JAVA 判断一个字符串是不是一个合法的日期格式
    oracle添加字段 与 db2 添加字段
    ajax详细讲解
    Js 时间间隔计算(间隔天数)
  • 原文地址:https://www.cnblogs.com/ainima/p/6331708.html
Copyright © 2020-2023  润新知