总体方案
创建一个定时任务,每一次执行完后间隔一定时间就会扫描缓存,缓存中一旦添加了任务,就会被扫描到,然后发送到消息队列,监听器一旦监听到消息就会进行处理,如果处理失败,则再次生成任务(次数加1,时间戳会根据规则增加),到达规定次数后则不在执行
具体细节
首先创建一个执行完后间隔’
w
e
b
h
o
o
k
.
f
i
x
e
d
D
e
l
a
y
’
后
执
行
下
一
次
,
从
缓
存
中
取
出
数
据
,
一
旦
取
到
数
据
就
发
送
到
消
息
队
列
中
,
并
且
删
除
掉
缓
存
里
面
的
数
据
!
[
在
这
里
插
入
图
片
描
述
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
2019041020062966.
p
n
g
?
x
−
o
s
s
−
p
r
o
c
e
s
s
=
i
m
a
g
e
/
w
a
t
e
r
m
a
r
k
,
t
y
p
e
Z
m
F
u
Z
3
p
o
Z
W
5
n
a
G
V
p
d
G
k
,
s
h
a
d
o
w
1
0
,
t
e
x
t
a
H
R
0
c
H
M
6
L
y
9
i
b
G
9
n
L
m
N
z
Z
G
4
u
b
m
V
0
L
3
d
l
a
X
h
p
b
l
80
N
D
M
y
M
T
k
0
M
g
=
=
,
s
i
z
e
1
6
,
c
o
l
o
r
F
F
F
F
F
F
,
t
7
0
)
监
听
器
一
旦
监
听
到
消
息
就
会
进
行
处
理
,
如
果
处
理
失
败
,
则
再
次
生
成
任
务
(
次
数
加
1
,
时
间
戳
会
根
据
规
则
增
加
)
,
到
达
规
定
次
数
后
则
不
在
执
行
@
R
a
b
b
i
t
L
i
s
t
e
n
e
r
(
q
u
e
u
e
s
=
"
{webhook.fixedDelay}’后执行下一次,从缓存中取出数据,一旦取到数据就发送到消息队列中,并且删除掉缓存里面的数据 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019041020062966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMyMTk0Mg==,size_16,color_FFFFFF,t_70) 监听器一旦监听到消息就会进行处理,如果处理失败,则再次生成任务(次数加1,时间戳会根据规则增加),到达规定次数后则不在执行 @RabbitListener(queues = "
webhook.fixedDelay’后执行下一次,从缓存中取出数据,一旦取到数据就发送到消息队列中,并且删除掉缓存里面的数据![在这里插入图片描述](https://img−blog.csdnimg.cn/2019041020062966.png?x−oss−process=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMyMTk0Mg==,size16,colorFFFFFF,t70)监听器一旦监听到消息就会进行处理,如果处理失败,则再次生成任务(次数加1,时间戳会根据规则增加),到达规定次数后则不在执行@RabbitListener(queues="{webhook.queue}")
// 参数中使用@Header获取mesage
public void helloReply(String json) {
logger.debug(“task:{}”, json);
Task task = gson.fromJson(json, Task.class);
try {
handler.handler(task.getData());
} catch (Exception e) {
if (webhookUtil.getInterval().size() > task.getTimes()) {
Task next = new Task();
next.setTimes(task.getTimes() + 1);
next.setTimestamp(task.getTimestamp() + webhookUtil.getInterval().get(task.getTimes())*1000);
next.setData(task.getData());
webhookUtil.addNext(next);
if (logger.isDebugEnabled()) {
logger.debug(“处理失败,添加到下次执行:” + gson.toJson(task), e);
}
} else {
logger.error(“处理{}次失败,停止处理”, webhookUtil.getInterval().size(), e);
}
}
}
测试
向缓存中添加一条数据,定时任务会到时间自动检测到这条数据
配置文件
spring-mq.xml