Skip to content

add Trigger #17

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

<groupId>com.codingapi.springboot</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.4.10</version>
<version>1.4.11.dev</version>

<url>https://github.com/codingapi/springboot-framewrok</url>
<name>springboot-parent</name>
Expand Down
2 changes: 1 addition & 1 deletion springboot-starter-data-fast/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>springboot-parent</artifactId>
<groupId>com.codingapi.springboot</groupId>
<version>1.4.10</version>
<version>1.4.11.dev</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion springboot-starter-id-generator/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>springboot-parent</artifactId>
<groupId>com.codingapi.springboot</groupId>
<version>1.4.10</version>
<version>1.4.11.dev</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion springboot-starter-security-jwt/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<artifactId>springboot-parent</artifactId>
<groupId>com.codingapi.springboot</groupId>
<version>1.4.10</version>
<version>1.4.11.dev</version>
</parent>

<artifactId>springboot-starter-security-jwt</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion springboot-starter/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>com.codingapi.springboot</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.4.10</version>
<version>1.4.11.dev</version>
</parent>
<artifactId>springboot-starter</artifactId>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.codingapi.springboot.framework.trigger;

/**
* 触发的DTO对象
*/
public interface Trigger {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package com.codingapi.springboot.framework.trigger;

import java.lang.reflect.ParameterizedType;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;


/**
* Trigger与Event模式都提供了订阅的功能。
*
* Trigger模式可以控制触发的规则,例如是否进入触发器,触发器是否在触发以后删除。
* Trigger是单独的消息数据不占用Event的通道。由于Event利用了Spring的事件底层,因此在大规模的事件情况下会堵塞spring的事件通道。
*/
@SuppressWarnings("all")
public class TriggerContext{

public static TriggerContext getInstance() {
return instance;
}

private final static TriggerContext instance = new TriggerContext();


private final Map<Class<? extends Trigger>,List<TriggerHandler>> triggers;

private TriggerContext(){
this.triggers = new ConcurrentHashMap<>();
}

/**
* 添加触发器
* @param handler 触发订阅
*/
public void addTrigger(TriggerHandler handler){
Class<? extends Trigger> clazz = getTriggerClass(handler);
List<TriggerHandler> triggerList = this.triggers.get(clazz);
if(triggerList==null){
triggerList = new CopyOnWriteArrayList<>();
this.triggers.put(clazz,triggerList);
}
triggerList.add(handler);
}


/**
* 获取触发器订阅的Trigger类型
* @param handler 触发订阅
* @return Trigger类型
*/
private Class<? extends Trigger> getTriggerClass(TriggerHandler handler){
ParameterizedType parameterizedType = (ParameterizedType) handler.getClass().getGenericInterfaces()[0];
return (Class<? extends Trigger>) parameterizedType.getActualTypeArguments()[0];
}


/**
* 执行触发
* @param trigger trigger触发
*/
public void trigger(Trigger trigger){
Class<? extends Trigger> clazz = trigger.getClass();
Iterator<TriggerHandler> iterator = triggers.get(clazz).iterator();
while (iterator.hasNext()){
TriggerHandler handler = iterator.next();
Class<? extends Trigger> triggerClass = getTriggerClass(handler);
if(triggerClass.equals(clazz)) {
try {
if (handler.preTrigger(trigger)) {
handler.trigger(trigger);
if (handler.remove()) {
iterator.remove();
}
}
}catch (Exception e){}
}
}
}

/**
* 清空触发
* @param clazz 清空的trigger类型
*/
public void clear(Class<? extends Trigger> clazz){
triggers.get(clazz).clear();
}


/**
* 判断是否清空的对象
* @param clazz 清空的trigger类型
* @return true为空
*/
public boolean isEmpty(Class<? extends Trigger> clazz){
return triggers.get(clazz).isEmpty();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.codingapi.springboot.framework.trigger;


/**
* 触发逻辑
* @param <T> 触发DTO对象 {@link Trigger}
*/
public interface TriggerHandler<T extends Trigger> {

/**
* 是否进入触发器
* @param trigger 触发对象 {@link Trigger}
* @return true进入 false 不进入
*/
boolean preTrigger(T trigger);

/**
* 触发执行逻辑
* @param trigger 触发对象 {@link Trigger}
*/
void trigger(T trigger);

/**
* 执行完成以后是否删除触发器
* @return true删除
*/
boolean remove();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.codingapi.springboot.framework.trigger;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

class TriggerHandlerContextTest {

@Test
void addTrigger() {
TriggerContext.getInstance().addTrigger(new TriggerHandler<MyTrigger>() {
@Override
public boolean preTrigger(MyTrigger trigger) {
return false;
}

@Override
public void trigger(MyTrigger trigger) {

}

@Override
public boolean remove() {
return false;
}
});

TriggerContext.getInstance().addTrigger(new TriggerHandler<MyTrigger2>() {
@Override
public boolean preTrigger(MyTrigger2 trigger) {
return false;
}

@Override
public void trigger(MyTrigger2 trigger) {

}

@Override
public boolean remove() {
return false;
}
});

assertFalse(TriggerContext.getInstance().isEmpty(MyTrigger.class));
TriggerContext.getInstance().clear(MyTrigger.class);
assertTrue(TriggerContext.getInstance().isEmpty(MyTrigger.class));
}

@Test
void trigger() {
TriggerContext.getInstance().addTrigger(new TriggerHandler<MyTrigger>() {
@Override
public boolean preTrigger(MyTrigger trigger) {
return true;
}

@Override
public void trigger(MyTrigger trigger) {
System.out.println(trigger.getName());
}

@Override
public boolean remove() {
return true;
}
});

MyTrigger trigger = new MyTrigger("bob");

TriggerContext.getInstance().trigger(trigger);
assertTrue(TriggerContext.getInstance().isEmpty(MyTrigger.class));

}

@AllArgsConstructor
private static class MyTrigger implements Trigger{
@Getter
private final String name;
}

@AllArgsConstructor
private static class MyTrigger2 implements Trigger{
@Getter
private final String name;
}


}