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

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

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

Worker+MQ解惑的更多相关文章

  1. 基于queue的python多进程日志管理

    在我们的异常检测应用中,需要对每组IoT设备分别训练一个模型,每个模型对一组设备的指标数据进行实时异常检测.方案采用master-worker+消息队列的方式实现模型对外服务,但是每个worker的日 ...

  2. Spark技术内幕:Client,Master和Worker 通信源码解析

    http://blog.csdn.net/anzhsoft/article/details/30802603 Spark的Cluster Manager可以有几种部署模式: Standlone Mes ...

  3. celery rabbit mq 详解

    Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...

  4. Java异常处理机制难点解惑-用代码说话

    是否需要看这篇文章? 下面的例子中,如果正常执行返回值多少? 如果出现了ArithmeticException返回值多少? 如果出现非ArithmeticException(如NullPointerE ...

  5. 关于MQ,你必须知道的

    我走过最长的路是你的套路 女:二号男嘉宾,假如我们牵手成功后,你会买名牌包包给我吗? 男:那你会听话吗? 女:会 听话. 男:听话 咱不买! OK那么消息队列MQ有什么套路呢?(这个话题转换生硬度连我 ...

  6. Rabbit MQ 消息确认和持久化机制

    一:确认种类 RabbitMQ的消息确认有两种.一种是消息发送确认,用来确认生产者将消息发送给交换器,交换器传递给队列的过程中消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是确认是否到 ...

  7. celery+Rabbit MQ实战记录

    基于以前的一篇文章,celery+Rabbit MQ的安装和使用, 本文更加详细的介绍如何安装和使用celey, Rabbit MQ. 并记录在使用celery时遇到的一些问题. 1.安装 Rabbi ...

  8. RabbitMQ学习笔记(3)----RabbitMQ Worker的使用

    1. Woker队列结构图 这里表示一个生产者生产了消息发送到队列中,但是确有两个消费者在消费同一个队列中的消息. 2. 创建一个生产者 Producer如下: package com.wangx.r ...

  9. Spark技术内幕:Client,Master和Worker 通信源代码解析

    Spark的Cluster Manager能够有几种部署模式: Standlone Mesos YARN EC2 Local 在向集群提交计算任务后,系统的运算模型就是Driver Program定义 ...

随机推荐

  1. Python基础知识学习_Day7

    一.Subprocess模块 1常用方法 执行命令,返回命令执行状态,0 or非0 >>> retcode = subprocess.call(["ls", &q ...

  2. 前端技术——WebFont与Sprite

    一.WebFont web font是应用在web中的一种字体技术,在CSS中使用font-face定义新的字体. 我们在文档中显示的字体应该在系统中能找到才会正常显示,比如你在word中使用了黑体字 ...

  3. SqlParameter 中 top 的使用

    public DataTable GetAdminTopDCSCheckReport(int top) { StringBuilder strSql = new StringBuilder(); st ...

  4. PHP的ip2long和long2ip函数的实现原理

    最近要做个十进制数字的可逆转换做邀请码,一直没搞清楚怎么弄的,实在太复杂了,今天弄IP时想到这个可以进行转换,于是研究了下原理: 主要是自己整理了下: $ip = '12.34.56.78'; $ip ...

  5. c#弱事件(weak event)

    传统事件publisher和listener是直接相连的,这样会对垃圾回收带来一些问题,例如listener已经不引用任何对象但它仍然被publisher引用 垃圾回收器就不能回收listener所占 ...

  6. xaml中的依赖属性

    wpf使用依赖属性完成数据绑定.动画.属性变更通知.样式化等.对于数据绑定.绑定到.NET属性源上的UI元素的属性必须是依赖属性 .net的一般属性定义如下 private int val;      ...

  7. VS2012 此模板尝试加载组件程序集”NuGet.VisualStudio.interop,Version=1.0.0.0 的解决

    VS2012 此模板尝试加载组件程序集”NuGet.VisualStudio.interop,Version=1.0.0.0 的解决办法 2014 年 5 月 3 日作者:mingceng 阅读次数: ...

  8. 安装器---Inno Setup

    Inno Setup[1]  用Delphi写成,其官方网站同时也提供源程序免费下载.它虽不能与Installshield这类恐龙级的安装制作软件相比,但也当之无愧算是后起之秀.Inno Setup是 ...

  9. sap 设备cnsapwin不支持页格式*****

    SAP SMARTFORMS 打印 CNSAPWIN 不支持页格式 解决办法: 在smartforms里的表格属性虽然定义了要打印的页格式 ZUNIA5 ,但是打印时会提示错误:" CNSA ...

  10. 语言总结—C/C++

    参考<程序员面试宝典> 1. 基本概念 1.1 赋值语句 例1. 按位与操作,例如:a=3,b=3,a&b值等于 0011 & 0011 结果还是0011,那么值还是3: ...