-
Notifications
You must be signed in to change notification settings - Fork 0
/
FSM.java
123 lines (93 loc) · 3.33 KB
/
FSM.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import akka.actor.AbstractFSMWithStash;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FSM {
private static final Logger LOGGER = LoggerFactory.getLogger(FSM.class);
//FSM State
enum DbState {
CONNECTED, DISCONNECTED
}
//FSM data
interface Data {
}
static class EmptyData implements Data {
}
enum DBoperation {
CREATE, UPDATE, READ, DELETE
}
static class Connect {
}
static class Disconnect {
}
static class Operation {
private final DBoperation operation;
private final User user;
Operation(DBoperation operation, User user) {
this.operation = operation;
this.user = user;
}
}
static class User {
private final String email;
private final String username;
User(String username, String email) {
this.username = username;
this.email = email;
}
}
static class UserStorageFSM extends AbstractFSMWithStash<DbState, Data> {
{
// 1. define start with
startWith(DbState.DISCONNECTED, new EmptyData());
// 2. define states
when(
DbState.DISCONNECTED,
matchEvent(
Connect.class,
Data.class,
(connect, anyData) -> {
LOGGER.info("UserStorage connected to DB");
unstashAll();
return goTo(DbState.CONNECTED);
}
).anyEvent(
(disconnect, anyData) -> {
stash();
return stay();
}
)
);
when(
DbState.CONNECTED,
matchEvent(
Disconnect.class,
Data.class,
(disconnect, anyData) -> {
LOGGER.info("UserStorage disconnected to DB");
return goTo(DbState.DISCONNECTED);
}
).event(
Operation.class,
Data.class,
(operation, anyData) -> {
LOGGER.info("UserStorage receive {} operation to do in user: {}", operation.operation, operation.user);
return stay();
}
)
);
initialize();
}
}
public static void main(String[] args) throws InterruptedException {
ActorSystem system = ActorSystem.create("Hotswap-FSM");
ActorRef userStorage = system.actorOf(Props.create(UserStorageFSM.class), "userStorage-fsm");
userStorage.tell(new Connect(), ActorRef.noSender());
userStorage.tell(new Operation(DBoperation.CREATE, new User("Admin", "admin@domain.com")), ActorRef.noSender());
userStorage.tell(new Disconnect(), ActorRef.noSender());
Thread.sleep(100);
system.terminate();
}
}