Skip to content

Commit 7739417

Browse files
authored
Merge pull request #17 from codingapi/dev
add Trigger
2 parents 06b341a + 70be0d3 commit 7739417

File tree

9 files changed

+233
-5
lines changed

9 files changed

+233
-5
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<groupId>com.codingapi.springboot</groupId>
1414
<artifactId>springboot-parent</artifactId>
15-
<version>1.4.10</version>
15+
<version>1.4.11.dev</version>
1616

1717
<url>https://github.com/codingapi/springboot-framewrok</url>
1818
<name>springboot-parent</name>

springboot-starter-data-fast/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-parent</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>1.4.10</version>
8+
<version>1.4.11.dev</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

springboot-starter-id-generator/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-parent</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>1.4.10</version>
8+
<version>1.4.11.dev</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

springboot-starter-security-jwt/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<artifactId>springboot-parent</artifactId>
88
<groupId>com.codingapi.springboot</groupId>
9-
<version>1.4.10</version>
9+
<version>1.4.11.dev</version>
1010
</parent>
1111

1212
<artifactId>springboot-starter-security-jwt</artifactId>

springboot-starter/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.codingapi.springboot</groupId>
77
<artifactId>springboot-parent</artifactId>
8-
<version>1.4.10</version>
8+
<version>1.4.11.dev</version>
99
</parent>
1010
<artifactId>springboot-starter</artifactId>
1111

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

0 commit comments

Comments
 (0)