|
如 清单 8 所示,上面定义了一共六个状态。通过标注 @State就声明了一个状态。需要注意的是状态之间是可以继承的。如果状态机接收到一个事件的时候,在当前状态中找不到对应的迁移,就会在其父状态上继续查找。状态的继承在某些情况下是很有用的,比如希望为所有的状态都增加同样的迁移逻辑,就可以直接把迁移条件添加在父状态上面。一个典型的场景就是错误处理,一般来说,所有的状态都需要错误处理,而错误处理的逻辑一般都是相同的。把发生错误时候的迁移放在父状态中,可以简洁的描述这一场景。
定义了状态之后,下面应该声明状态之间的迁移。如 清单 9 所示。
清单 9. 联机游戏示例应用中的状态迁移声明@IoHandlerTransition(on = MESSAGE_RECEIVED, in = NOT_CONNECTED, next = IDLE)
public void login(TetrisServerContext context, IoSession session, LoginCommand cmd) {
String nickName = cmd.getNickName();
context.nickName = nickName;
session.setAttribute("nickname", nickName);
session.setAttribute("status", UserStatus.IDLE);
sessions.add(session);
users.add(nickName);
RefreshPlayersListCommand command = createRefreshPlayersListCommand();
broadcast(command);
}
@IoHandlerTransition(on = EXCEPTION_CAUGHT, in = ROOT, weight = 10)
public void exceptionCaught(IoSession session, Exception e) {
LOGGER.warn("Unexpected error.", e);
session.close(true);
}
@IoHandlerTransition(in = ROOT, weight = 100)
public void unhandledEvent() {
LOGGER.warn("Unhandled event.");
} |
|