1.用redis中的List可以实现队列,这样可以用来做消息处理和任务调度的队列
2.代码模拟
代码结构
生产者模拟程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/**
*
*/
package
scheduleTest;
import
java.util.Random;
import
java.util.UUID;
import
redis.clients.jedis.Jedis;
/**
* 模拟一个生产者
* <p>Title: TaskProducer</p>
* <p>Description: </p>
* <p>Company: </p>
* @author 夏 杰
* @date 2015年12月11日 下午4:26:48
* @vesion 1.0
*/
public
class
TaskProducer
implements
Runnable{
Jedis jedis =
new
Jedis(
"120.55.195.177"
,
6379
);
public
void
run() {
Random random =
new
Random();
while
(
true
){
try
{
Thread.sleep(random.nextInt(
600
) +
600
);
// 模拟生成一个任务
UUID taskid = UUID.randomUUID();
//将任务插入任务队列:task-queue
jedis.lpush(
"task-queue"
, taskid.toString());
System.out.println(
"插入了一个新的任务: "
+ taskid);
}
catch
(Exception e){
e.printStackTrace();
}
}
}
}
|
消费者模拟程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/**
*
*/
package
scheduleTest;
import
java.util.Random;
import
redis.clients.jedis.Jedis;
/**
* 模拟消费者
* <p>Title: TaskConsumer</p>
* <p>Description: </p>
* <p>Company: </p>
* @author 夏 杰
* @date 2015年12月11日 下午4:44:23
* @vesion 1.0
*/
public
class
TaskConsumer
implements
Runnable {
Jedis jedis =
new
Jedis(
"120.55.195.177"
,
6379
);
public
void
run() {
Random random =
new
Random();
while
(
true
){
//从任务队列"task-queue"中获取一个任务,并将该任务放入暂存队列"tmp-queue"
String taskid = jedis.rpoplpush(
"task-queue"
,
"tmp-queue"
);
// 处理任务----纯属业务逻辑,模拟一下:睡觉
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
//模拟成功和失败的偶然现象
if
(random.nextInt(
13
) %
7
==
0
){
// 模拟失败的情况,概率为2/13
//将本次处理失败的任务从暂存队列"tmp-queue"中,弹回任务队列"task-queue"
jedis.rpoplpush(
"tmp-queue"
,
"task-queue"
);
System.out.println(taskid +
"处理失败,被弹回任务队列"
);
}
else
{
// 模拟成功的情况
// 将本次任务从暂存队列"tmp-queue"中清除
jedis.rpop(
"tmp-queue"
);
System.out.println(taskid+
"处理成功,被清除"
);
}
}
}
}
|
调度主程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/**
*
*/
package
scheduleTest;
/**
* <p>Title: TaskShedulerSystem</p>
* <p>Description: </p>
* <p>Company: </p>
* @author 夏 杰
* @date 2015年12月11日 下午4:19:09
* @vesion 1.0
*/
public
class
TaskShedulerSystem {
public
static
void
main(String[] args)
throws
Exception {
// 启动一个生产者线程,模拟任务的产生
new
Thread(
new
TaskProducer()).start();
Thread.sleep(
15000
);
//启动一个线程者线程,模拟任务的处理
new
Thread(
new
TaskConsumer()).start();
//主线程休眠
Thread.sleep(Long.MAX_VALUE);
}
}
|
运行结果
插入了一个新的任务: 8025c8b8-f81f-4560-a653-3f339cc371a6
插入了一个新的任务: 98dcf980-10d9-4df6-8765-a4873f6b6a74
插入了一个新的任务: d9636112-4cea-4f49-9f70-88e934aa2a66
插入了一个新的任务: 0a8a2799-d672-4444-b53d-74b679559565
插入了一个新的任务: 3948e29e-0217-434a-b7fe-c3be2f0b1073
插入了一个新的任务: f06c3a03-83a1-4278-a7c8-61d88afcbadf
插入了一个新的任务: fbf7ed91-b1f1-4713-8490-325d77f951b0
插入了一个新的任务: 99cbf0e4-d981-45ad-88f4-10db1604171e
插入了一个新的任务: ca7cd3cf-9ae3-41a1-b8e1-c8ac9a729255
插入了一个新的任务: 3c954253-d195-4185-b27d-390a6e441eaa
插入了一个新的任务: 4b7f2b4d-c77b-4813-9a63-2b6975cb44a1
插入了一个新的任务: 662e0d60-7163-444c-9f1a-43451bb442c3
插入了一个新的任务: d9cca9bd-9870-468d-9beb-f2c3e029c58c
插入了一个新的任务: 7af0318f-7771-4996-99aa-7adb26214f6c
插入了一个新的任务: 7deb7d15-9234-44c8-92d6-53e44b578f6b
插入了一个新的任务: 419a4e25-4343-43f6-bd0e-1f02c6aea19f
插入了一个新的任务: b955ac83-6371-461e-b86b-2a12f45809cc
8025c8b8-f81f-4560-a653-3f339cc371a6处理成功,被清除
插入了一个新的任务: 73218c74-dfd6-46c3-84eb-a14df4a3f7f5
98dcf980-10d9-4df6-8765-a4873f6b6a74处理成功,被清除
插入了一个新的任务: f90f9781-6456-474f-8736-93dc3dcc548f
d9636112-4cea-4f49-9f70-88e934aa2a66处理成功,被清除
插入了一个新的任务: cc499c95-3153-4392-9341-3e7173cbf685
0a8a2799-d672-4444-b53d-74b679559565处理失败,被弹回任务队列
插入了一个新的任务: 437c33ae-8adb-49fd-8aad-9e7a396aa72b
3948e29e-0217-434a-b7fe-c3be2f0b1073处理失败,被弹回任务队列
插入了一个新的任务: dbd99594-0a82-4dee-a481-117e1541c549
f06c3a03-83a1-4278-a7c8-61d88afcbadf处理成功,被清除
插入了一个新的任务: d9900559-a995-49cd-9300-540375c21ea0
fbf7ed91-b1f1-4713-8490-325d77f951b0处理成功,被清除
插入了一个新的任务: 72dd3c9a-0cf7-4dd4-9a8d-378da4a531a1