1
1
package com .codingapi .springboot .framework .trigger ;
2
2
3
3
import java .lang .reflect .ParameterizedType ;
4
- import java .util .ArrayList ;
5
4
import java .util .Iterator ;
6
5
import java .util .List ;
7
6
import java .util .Map ;
8
7
import java .util .concurrent .ConcurrentHashMap ;
8
+ import java .util .concurrent .CopyOnWriteArrayList ;
9
9
10
+
11
+ /**
12
+ * Trigger与Event模式都提供了订阅的功能。
13
+ *
14
+ * Trigger模式可以控制触发的规则,例如是否进入触发器,触发器是否在触发以后删除。
15
+ * Trigger是单独的消息数据不占用Event的通道。由于Event利用了Spring的事件底层,因此在大规模的事件情况下会堵塞spring的事件通道。
16
+ */
10
17
@ SuppressWarnings ("all" )
11
18
public class TriggerContext {
12
19
@@ -23,45 +30,69 @@ private TriggerContext(){
23
30
this .triggers = new ConcurrentHashMap <>();
24
31
}
25
32
26
- public void addTrigger (TriggerHandler trigger ){
27
- Class <? extends Trigger > clazz = getTriggerClass (trigger );
33
+ /**
34
+ * 添加触发器
35
+ * @param handler 触发订阅
36
+ */
37
+ public void addTrigger (TriggerHandler handler ){
38
+ Class <? extends Trigger > clazz = getTriggerClass (handler );
28
39
List <TriggerHandler > triggerList = this .triggers .get (clazz );
29
40
if (triggerList ==null ){
30
- triggerList = new ArrayList <>();
41
+ triggerList = new CopyOnWriteArrayList <>();
31
42
this .triggers .put (clazz ,triggerList );
32
43
}
33
- triggerList .add (trigger );
44
+ triggerList .add (handler );
34
45
}
35
46
36
47
37
- private Class <? extends Trigger > getTriggerClass (TriggerHandler trigger ){
38
- ParameterizedType parameterizedType = (ParameterizedType ) trigger .getClass ().getGenericInterfaces ()[0 ];
48
+ /**
49
+ * 获取触发器订阅的Trigger类型
50
+ * @param handler 触发订阅
51
+ * @return Trigger类型
52
+ */
53
+ private Class <? extends Trigger > getTriggerClass (TriggerHandler handler ){
54
+ ParameterizedType parameterizedType = (ParameterizedType ) handler .getClass ().getGenericInterfaces ()[0 ];
39
55
return (Class <? extends Trigger >) parameterizedType .getActualTypeArguments ()[0 ];
40
56
}
41
57
42
58
59
+ /**
60
+ * 执行触发
61
+ * @param trigger trigger触发
62
+ */
43
63
public void trigger (Trigger trigger ){
44
64
Class <? extends Trigger > clazz = trigger .getClass ();
45
65
Iterator <TriggerHandler > iterator = triggers .get (clazz ).iterator ();
46
66
while (iterator .hasNext ()){
47
67
TriggerHandler handler = iterator .next ();
48
68
Class <? extends Trigger > triggerClass = getTriggerClass (handler );
49
69
if (triggerClass .equals (clazz )) {
50
- if (handler .preTrigger (trigger )) {
51
- handler .trigger (trigger );
52
- if (handler .remove ()) {
53
- iterator .remove ();
70
+ try {
71
+ if (handler .preTrigger (trigger )) {
72
+ handler .trigger (trigger );
73
+ if (handler .remove ()) {
74
+ iterator .remove ();
75
+ }
54
76
}
55
- }
77
+ }catch ( Exception e ){}
56
78
}
57
79
}
58
80
}
59
81
82
+ /**
83
+ * 清空触发
84
+ * @param clazz 清空的trigger类型
85
+ */
60
86
public void clear (Class <? extends Trigger > clazz ){
61
87
triggers .get (clazz ).clear ();
62
88
}
63
89
64
90
91
+ /**
92
+ * 判断是否清空的对象
93
+ * @param clazz 清空的trigger类型
94
+ * @return true为空
95
+ */
65
96
public boolean isEmpty (Class <? extends Trigger > clazz ){
66
97
return triggers .get (clazz ).isEmpty ();
67
98
}
0 commit comments