11package com .codingapi .springboot .framework .trigger ;
22
33import java .lang .reflect .ParameterizedType ;
4- import java .util .ArrayList ;
54import java .util .Iterator ;
65import java .util .List ;
76import java .util .Map ;
87import java .util .concurrent .ConcurrentHashMap ;
8+ import java .util .concurrent .CopyOnWriteArrayList ;
99
10+
11+ /**
12+ * Trigger与Event模式都提供了订阅的功能。
13+ *
14+ * Trigger模式可以控制触发的规则,例如是否进入触发器,触发器是否在触发以后删除。
15+ * Trigger是单独的消息数据不占用Event的通道。由于Event利用了Spring的事件底层,因此在大规模的事件情况下会堵塞spring的事件通道。
16+ */
1017@ SuppressWarnings ("all" )
1118public class TriggerContext {
1219
@@ -23,45 +30,69 @@ private TriggerContext(){
2330 this .triggers = new ConcurrentHashMap <>();
2431 }
2532
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 );
2839 List <TriggerHandler > triggerList = this .triggers .get (clazz );
2940 if (triggerList ==null ){
30- triggerList = new ArrayList <>();
41+ triggerList = new CopyOnWriteArrayList <>();
3142 this .triggers .put (clazz ,triggerList );
3243 }
33- triggerList .add (trigger );
44+ triggerList .add (handler );
3445 }
3546
3647
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 ];
3955 return (Class <? extends Trigger >) parameterizedType .getActualTypeArguments ()[0 ];
4056 }
4157
4258
59+ /**
60+ * 执行触发
61+ * @param trigger trigger触发
62+ */
4363 public void trigger (Trigger trigger ){
4464 Class <? extends Trigger > clazz = trigger .getClass ();
4565 Iterator <TriggerHandler > iterator = triggers .get (clazz ).iterator ();
4666 while (iterator .hasNext ()){
4767 TriggerHandler handler = iterator .next ();
4868 Class <? extends Trigger > triggerClass = getTriggerClass (handler );
4969 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+ }
5476 }
55- }
77+ }catch ( Exception e ){}
5678 }
5779 }
5880 }
5981
82+ /**
83+ * 清空触发
84+ * @param clazz 清空的trigger类型
85+ */
6086 public void clear (Class <? extends Trigger > clazz ){
6187 triggers .get (clazz ).clear ();
6288 }
6389
6490
91+ /**
92+ * 判断是否清空的对象
93+ * @param clazz 清空的trigger类型
94+ * @return true为空
95+ */
6596 public boolean isEmpty (Class <? extends Trigger > clazz ){
6697 return triggers .get (clazz ).isEmpty ();
6798 }
0 commit comments