Redis数据结构list的任务队列

来源:互联网 发布:input type js修改 编辑:程序博客网 时间:2024/06/06 00:06

先搞一个队列,任务产生者,就一直往队列左边里塞啊塞,任务处理者就从右边第一个开始一个一个处理,理想是美好的,万一处理第一个时候出问题了,后面就没法继续处理了,所以就有了下面的图,先从这个第一个队列里取出右边的那个,放进第二个队列中,任务处理者从第二个队列中取出处理,如果处理成功就弹出,处理失败就弹回第一个队列的最左边,如下图:(自己写了个小demo)

public class TaskScheduler {


/**
* 任务生产者线程逻辑

* @QIANCC

*/
static class TaskProducer implements Runnable {


public void run() {
Jedis jedis = new Jedis("192.168.2.199");
System.out.println("任务生产者启动.......");
jedis.del("task-list");
while (true) {


UUID newTaskId = UUID.randomUUID();


jedis.lpush("task-list", newTaskId.toString());
System.out.println("生产者插入了一个新任务: " + newTaskId);
try {
int nextInt = new Random().nextInt(2);
Thread.sleep(1000 + nextInt * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}


}


}


/**
* 任务处理者线程逻辑

* @QIANCC

*/
static class TaskWorker implements Runnable {


public void run() {

Jedis jedis = new Jedis("192.168.2.199");
System.out.println("任务处理者启动.......");
jedis.del("status-list");


while (true) {
try {
Thread.sleep(1000);
// 从task-list弹出一个任务,并插入到status-list队列中
String taskId = jedis.rpoplpush("task-list", "status-list");
// 处理任务的逻辑......
int nextInt = new Random().nextInt(9);
// 模拟任务处理成功的情况
if (nextInt % 4 != 0) {


// 从status-list队列中弹出这个处理成功的任务
jedis.lpop("status-list");
System.out.println(taskId + ": 处理成功,并从任务调度系统中彻底删除");


} else {
// 模拟任务处理失败的情况
jedis.rpoplpush("status-list", "task-list");
System.out.println(taskId + ": 处理失败,并从status-list中弹回task-list");


}


} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}


}
}


public static void main(String[] args) throws Exception {


new Thread(new TaskProducer()).start();
Thread.sleep(200);
new Thread(new TaskWorker()).start();


}


}

原创粉丝点击