Worker+MQ解惑
用Worker来保证数据的一致性,再加上MQ来便于水平扩展,也提升了Worker的效率。这就是传说中的Worker+MQ,又叫做可靠消息方式。另外,将任务的查询和执行分工,形成父子任务,达到真正的分布式任务,也能提升Worker效率。
- package com.itlong.bjxizhan.support.web.job.base;
- import com.itlong.bjxizhan.common.DbContext;
- import com.itlong.bjxizhan.domain.pojo.Task;
- import com.itlong.bjxizhan.support.web.service.StandardTaskService;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import java.util.List;
- /**
- * Created by shenhongxi on 2016/7/12.
- */
- public class JobRunnable implements Runnable {
- private static final Logger log = LoggerFactory.getLogger(JobRunnable.class);
- private StandardTaskService standardTaskService;
- private List<Task> tasks;
- private String dbKey;
- private String tableIndex;
- @Override
- public void run() {
- if (tasks != null) {
- try {
- DbContext.setDbKey(dbKey);
- DbContext.setTableIndex(tableIndex);
- for (Task task : tasks) {
- task.setTableIndex(tableIndex);
- // 1. 一个job的多个实例,谁先成功锁定任务,谁先处理任务,若处理失败则解锁任务
- // 2. 对于1中解锁失败的,要利用另外的job来专门进行解锁
- // 3. 将任务分成几批,并行处理
- // 4. 这些任务的子任务分批串行处理,同样有锁定-处理-失败解锁
- // 5. 对于4中解锁失败的,同样要利用另外的job来专门进行解锁
- boolean locked = standardTaskService.lock(task);
- if (!locked) continue;
- boolean result = standardTaskService.process(task);
- standardTaskService.finished(result, task);
- }
- } catch (Exception e) {
- log.error("Do task error", e);
- throw new RuntimeException("Do task error");
- }
- }
- }
- public List<Task> getTasks() {
- return tasks;
- }
- public void setTasks(List<Task> tasks) {
- this.tasks = tasks;
- }
- public StandardTaskService getStandardTaskService() {
- return standardTaskService;
- }
- public void setStandardTaskService(StandardTaskService standardTaskService) {
- this.standardTaskService = standardTaskService;
- }
- public String getTableIndex() {
- return tableIndex;
- }
- public void setTableIndex(String tableIndex) {
- this.tableIndex = tableIndex;
- }
- public String getDbKey() {
- return dbKey;
- }
- public void setDbKey(String dbKey) {
- this.dbKey = dbKey;
- }
- }
***:org.quartz.Scheduler提供了start, bystand等方法可以对Scheduler进行管控
Worker+MQ解惑的更多相关文章
- 基于queue的python多进程日志管理
在我们的异常检测应用中,需要对每组IoT设备分别训练一个模型,每个模型对一组设备的指标数据进行实时异常检测.方案采用master-worker+消息队列的方式实现模型对外服务,但是每个worker的日 ...
- Spark技术内幕:Client,Master和Worker 通信源码解析
http://blog.csdn.net/anzhsoft/article/details/30802603 Spark的Cluster Manager可以有几种部署模式: Standlone Mes ...
- celery rabbit mq 详解
Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...
- Java异常处理机制难点解惑-用代码说话
是否需要看这篇文章? 下面的例子中,如果正常执行返回值多少? 如果出现了ArithmeticException返回值多少? 如果出现非ArithmeticException(如NullPointerE ...
- 关于MQ,你必须知道的
我走过最长的路是你的套路 女:二号男嘉宾,假如我们牵手成功后,你会买名牌包包给我吗? 男:那你会听话吗? 女:会 听话. 男:听话 咱不买! OK那么消息队列MQ有什么套路呢?(这个话题转换生硬度连我 ...
- Rabbit MQ 消息确认和持久化机制
一:确认种类 RabbitMQ的消息确认有两种.一种是消息发送确认,用来确认生产者将消息发送给交换器,交换器传递给队列的过程中消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是确认是否到 ...
- celery+Rabbit MQ实战记录
基于以前的一篇文章,celery+Rabbit MQ的安装和使用, 本文更加详细的介绍如何安装和使用celey, Rabbit MQ. 并记录在使用celery时遇到的一些问题. 1.安装 Rabbi ...
- RabbitMQ学习笔记(3)----RabbitMQ Worker的使用
1. Woker队列结构图 这里表示一个生产者生产了消息发送到队列中,但是确有两个消费者在消费同一个队列中的消息. 2. 创建一个生产者 Producer如下: package com.wangx.r ...
- Spark技术内幕:Client,Master和Worker 通信源代码解析
Spark的Cluster Manager能够有几种部署模式: Standlone Mesos YARN EC2 Local 在向集群提交计算任务后,系统的运算模型就是Driver Program定义 ...
随机推荐
- C#中的系统时间获取问题
C#获取当前系统时间 2010-01-02 16:24 --DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 取当前年月日 ...
- java 执行redis的部分方法
@Autowired private RedisTemplate<String, Object> redisTemplate; public void setRedisTemplate(R ...
- [转]numpy线性代数基础 - Python和MATLAB矩阵处理的不同
转自:http://blog.csdn.net/pipisorry/article/details/45563695 http://blog.csdn.net/pipisorry/article/de ...
- 在代理中托管特殊方法的python代码实现
任务简单的介绍是: 在新风格对象模型中,Python操作其实是在类中查找特殊方法的(经典对象是在实例中进行操作的),现在需要将一些新风格的实例包装到代理中,,此代理可以选择将一些特殊的方法委托给内部的 ...
- Mysq 5.7l服务无法启动,没有报告任何错误
昨天系统崩溃了,然后重装了Mysql 5.7 安装步骤和遇到问题及解决方案. 去官网下载Mysql 5.7的解压包(zip),解压到你要安装的目录. 我的安装目录是:D:\Java\Mysql 安装步 ...
- Spring Security(15)——权限鉴定结构
目录 1.1 权限 1.2 调用前的处理 1.2.1 AccessDecisionManager 1.2.2 基于投票的AccessDecisionManager实 ...
- Windows 多用户远程访问 Ubuntu 14.04桌面
使用X2Go实现多用户远程访问 Ubuntu 14.04桌面:VNC也可以,但是每次连接VNC就回新创建一个Seession,想要在下次远程登录的时候返回上次活动,需要记住开启的线程,这种繁琐的操作不 ...
- 基于Java 的增量与完全备份小工具
前段时间,因为各种原因,自己动手写了一个小的备份工具,用了一个星期,想想把它的设计思路放上来,当是笔记吧. 需求场景:这个工具起初的目的是为了解决朋友公司对其网络的限制(不可以用任何同步软件,git, ...
- 洛谷-乘积最大-NOIP2000提高组复赛
题目描述 Description 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你 ...
- cocos坐标系及坐标转换
cocos2dx的坐标系是以左下角为(0,0)点, 向右上为正 世界坐标系:相对于屏幕位置的坐标表示 节点坐标系:相对于父节点的坐标表示 可以相互转换: /** * 将世界坐标转换成节点坐标,忽略锚点 ...