Skip to content

Commit 992fa8c

Browse files
committed
flow:新增@ListenFlowStart、@ListenExecutingNode、@ListenFlowEnd
1 parent c1d4ea2 commit 992fa8c

13 files changed

Lines changed: 293 additions & 11 deletions
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* 作者:钟勋 (e-mail:zhongxunking@163.com)
3+
*/
4+
5+
/*
6+
* 修订记录:
7+
* @author 钟勋 2016-12-17 17:06 创建
8+
*/
9+
package org.bekit.flow.annotation.listener;
10+
11+
import org.bekit.event.annotation.listener.Listen;
12+
import org.bekit.event.listener.PriorityType;
13+
import org.bekit.flow.listener.ListenExecutingNodeResolver;
14+
import org.springframework.core.annotation.AliasFor;
15+
16+
import java.lang.annotation.*;
17+
18+
/**
19+
* 监听正在执行的节点
20+
* <p>
21+
* 配合@TheFlowListener一起使用;当每次节点即将被执行时,都会调用本注解标注的方法。
22+
* 对应的方法入参类型必须为(String, FlowContext)。
23+
*/
24+
@Target(ElementType.METHOD)
25+
@Retention(RetentionPolicy.RUNTIME)
26+
@Documented
27+
@Listen(resolver = ListenExecutingNodeResolver.class, priorityType = PriorityType.ASC)
28+
public @interface ListenExecutingNode {
29+
/**
30+
* 优先级类型(默认为升序)
31+
*/
32+
@AliasFor(annotation = Listen.class, attribute = "priorityType")
33+
PriorityType priorityType() default PriorityType.ASC;
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* 作者:钟勋 (e-mail:zhongxunking@163.com)
3+
*/
4+
5+
/*
6+
* 修订记录:
7+
* @author 钟勋 2017-04-04 18:41 创建
8+
*/
9+
package org.bekit.flow.annotation.listener;
10+
11+
import org.bekit.event.annotation.listener.Listen;
12+
import org.bekit.event.listener.PriorityType;
13+
import org.bekit.flow.listener.ListenFlowEndResolver;
14+
import org.springframework.core.annotation.AliasFor;
15+
16+
import java.lang.annotation.*;
17+
18+
/**
19+
* 监听流程结束事件
20+
* <p>
21+
* 配合@TheFlowListener一起使用;当流程执行结束时,都会调用本注解标注的方法。
22+
* 对应的方法入参类型必须为(FlowContext)。
23+
*/
24+
@Target(ElementType.METHOD)
25+
@Retention(RetentionPolicy.RUNTIME)
26+
@Documented
27+
@Listen(resolver = ListenFlowEndResolver.class, priorityType = PriorityType.ASC)
28+
public @interface ListenFlowEnd {
29+
/**
30+
* 优先级类型(默认为升序)
31+
*/
32+
@AliasFor(annotation = Listen.class, attribute = "priorityType")
33+
PriorityType priorityType() default PriorityType.ASC;
34+
}

flow/src/main/java/org/bekit/flow/annotation/listener/ListenFlowException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.lang.annotation.*;
1717

1818
/**
19-
* 监听流程异常
19+
* 监听流程异常事件
2020
* <p>
2121
* 配合@TheFlowListener一起使用;当流程发生异常时,都会调用本注解标注的方法。
2222
* 对应的方法入参类型必须为(Throwable, FlowContext)。
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* 作者:钟勋 (e-mail:zhongxunking@163.com)
3+
*/
4+
5+
/*
6+
* 修订记录:
7+
* @author 钟勋 2017-04-04 18:41 创建
8+
*/
9+
package org.bekit.flow.annotation.listener;
10+
11+
import org.bekit.event.annotation.listener.Listen;
12+
import org.bekit.event.listener.PriorityType;
13+
import org.bekit.flow.listener.ListenFlowStartResolver;
14+
import org.springframework.core.annotation.AliasFor;
15+
16+
import java.lang.annotation.*;
17+
18+
/**
19+
* 监听流程开始事件
20+
* <p>
21+
* 配合@TheFlowListener一起使用;当流程开始执行时,都会调用本注解标注的方法。
22+
* 对应的方法入参类型必须为(FlowContext)。
23+
*/
24+
@Target(ElementType.METHOD)
25+
@Retention(RetentionPolicy.RUNTIME)
26+
@Documented
27+
@Listen(resolver = ListenFlowStartResolver.class, priorityType = PriorityType.ASC)
28+
public @interface ListenFlowStart {
29+
/**
30+
* 优先级类型(默认为升序)
31+
*/
32+
@AliasFor(annotation = Listen.class, attribute = "priorityType")
33+
PriorityType priorityType() default PriorityType.ASC;
34+
}

flow/src/main/java/org/bekit/flow/event/DecidedStateNodeEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class DecidedStateNodeEvent {
2222
private final String flow;
2323
// 被选择的状态节点
2424
@Getter
25-
private final String stateNode;
25+
private final String node;
2626
// 流程上下文
2727
private final FlowContext<?> context;
2828

flow/src/main/java/org/bekit/flow/event/ExecutingNodeEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class ExecutingNodeEvent {
2020
// 流程名称
2121
@Getter
2222
private final String flow;
23-
// 被选择的节点
23+
// 正在执行的节点
2424
@Getter
2525
private final String node;
2626
// 流程上下文

flow/src/main/java/org/bekit/flow/listener/DefaultFlowListener.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@
1313
import org.bekit.event.bus.EventBusHub;
1414
import org.bekit.event.publisher.DefaultEventPublisher;
1515
import org.bekit.flow.annotation.listener.FlowListener;
16-
import org.bekit.flow.event.DecidedNodeEvent;
17-
import org.bekit.flow.event.DecidedStateNodeEvent;
18-
import org.bekit.flow.event.FlowExceptionEvent;
16+
import org.bekit.flow.event.*;
1917

2018
/**
2119
* 默认的流程监听器
@@ -31,9 +29,21 @@ public DefaultFlowListener(EventBusHub eventBusHub) {
3129
eventPublisher = new DefaultEventPublisher(eventBusHub.getEventBus(TheFlowListenerType.class));
3230
}
3331

32+
// 监听流程开始事件
33+
@Listen
34+
public void listenFlowStartEvent(FlowStartEvent event) {
35+
eventPublisher.publish(event);
36+
}
37+
38+
// 监听正在执行的节点事件
39+
@Listen
40+
public void listenExecutingNodeEvent(ExecutingNodeEvent event) {
41+
eventPublisher.publish(event);
42+
}
43+
3444
// 监听节点选择事件
3545
@Listen
36-
public void listenNodeDecidedEvent(DecidedNodeEvent event) {
46+
public void listenDecidedNodeEvent(DecidedNodeEvent event) {
3747
eventPublisher.publish(event);
3848
}
3949

@@ -48,4 +58,10 @@ public void listenStateNodeDecidedEvent(DecidedStateNodeEvent event) {
4858
public void listenFlowExceptionEvent(FlowExceptionEvent event) {
4959
eventPublisher.publish(event);
5060
}
61+
62+
// 监听流程结束事件
63+
@Listen
64+
public void listenFlowEndEvent(FlowEndEvent event) {
65+
eventPublisher.publish(event);
66+
}
5167
}

flow/src/main/java/org/bekit/flow/listener/ListenDecidedStateNodeResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,6 @@ public Object getEventType() {
4747
@Override
4848
public Object[] resolveParams(Object event) {
4949
DecidedStateNodeEvent decidedStateNodeEvent = (DecidedStateNodeEvent) event;
50-
return new Object[]{decidedStateNodeEvent.getStateNode(), decidedStateNodeEvent.getContext()};
50+
return new Object[]{decidedStateNodeEvent.getNode(), decidedStateNodeEvent.getContext()};
5151
}
5252
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* 作者:钟勋 (e-mail:zhongxunking@163.com)
3+
*/
4+
5+
/*
6+
* 修订记录:
7+
* @author 钟勋 2017-09-29 20:29 创建
8+
*/
9+
package org.bekit.flow.listener;
10+
11+
import org.bekit.event.extension.ListenResolver;
12+
import org.bekit.flow.annotation.listener.TheFlowListener;
13+
import org.bekit.flow.engine.FlowContext;
14+
import org.bekit.flow.event.ExecutingNodeEvent;
15+
import org.springframework.core.annotation.AnnotatedElementUtils;
16+
import org.springframework.util.Assert;
17+
18+
import java.lang.reflect.Method;
19+
20+
/**
21+
* 监听注解@ListenExecutingNode的解决器
22+
*/
23+
public class ListenExecutingNodeResolver implements ListenResolver {
24+
// 监听的事件类型
25+
private TheFlowEventType eventType;
26+
27+
@Override
28+
public void init(Method listenMethod) {
29+
TheFlowListener theFlowListenerAnnotation = AnnotatedElementUtils.findMergedAnnotation(listenMethod.getDeclaringClass(), TheFlowListener.class);
30+
if (theFlowListenerAnnotation == null) {
31+
throw new IllegalArgumentException("@ListenExecutingNode只能标注在特定流程监听器(@TheFlowListener)的方法上");
32+
}
33+
// 校验入参类型
34+
Class[] parameterTypes = listenMethod.getParameterTypes();
35+
Assert.isTrue(parameterTypes.length == 2
36+
&& parameterTypes[0] == String.class
37+
&& parameterTypes[1] == FlowContext.class, String.format("@ListenExecutingNode方法[%s]的入参类型必须是(String, FlowContext<T>)", listenMethod));
38+
39+
eventType = new TheFlowEventType(theFlowListenerAnnotation.flow(), ExecutingNodeEvent.class);
40+
}
41+
42+
@Override
43+
public Object getEventType() {
44+
return eventType;
45+
}
46+
47+
@Override
48+
public Object[] resolveParams(Object event) {
49+
ExecutingNodeEvent executingNodeEvent = (ExecutingNodeEvent) event;
50+
return new Object[]{executingNodeEvent.getNode(), executingNodeEvent.getContext()};
51+
}
52+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* 作者:钟勋 (e-mail:zhongxunking@163.com)
3+
*/
4+
5+
/*
6+
* 修订记录:
7+
* @author 钟勋 2017-09-29 20:57 创建
8+
*/
9+
package org.bekit.flow.listener;
10+
11+
import org.bekit.event.extension.ListenResolver;
12+
import org.bekit.flow.annotation.listener.TheFlowListener;
13+
import org.bekit.flow.engine.FlowContext;
14+
import org.bekit.flow.event.FlowEndEvent;
15+
import org.springframework.core.annotation.AnnotatedElementUtils;
16+
import org.springframework.util.Assert;
17+
18+
import java.lang.reflect.Method;
19+
20+
/**
21+
* 监听注解@ListenFlowEnd的解决器
22+
*/
23+
public class ListenFlowEndResolver implements ListenResolver {
24+
// 监听的事件类型
25+
private TheFlowEventType eventType;
26+
27+
@Override
28+
public void init(Method listenMethod) {
29+
TheFlowListener theFlowListenerAnnotation = AnnotatedElementUtils.findMergedAnnotation(listenMethod.getDeclaringClass(), TheFlowListener.class);
30+
if (theFlowListenerAnnotation == null) {
31+
throw new IllegalArgumentException("@ListenFlowEnd只能标注在特定流程监听器(@TheFlowListener)的方法上");
32+
}
33+
// 校验入参类型
34+
Class[] parameterTypes = listenMethod.getParameterTypes();
35+
Assert.isTrue(parameterTypes.length == 1 && parameterTypes[0] == FlowContext.class, String.format("@ListenFlowEnd方法[%s]的入参类型必须是(FlowContext<T>)", listenMethod));
36+
37+
eventType = new TheFlowEventType(theFlowListenerAnnotation.flow(), FlowEndEvent.class);
38+
}
39+
40+
@Override
41+
public Object getEventType() {
42+
return eventType;
43+
}
44+
45+
@Override
46+
public Object[] resolveParams(Object event) {
47+
FlowEndEvent flowEndEvent = (FlowEndEvent) event;
48+
return new Object[]{flowEndEvent.getContext()};
49+
}
50+
}

0 commit comments

Comments
 (0)