[英]block other actors with queuing requests in akka while processing current message
我有一个具有两种消息类型的actor,一种用于插入mysql,另一种用于插入redis。 我想知道如何在mysql actor正在处理的同时,通过排队该actor中与插入redis有关的消息来阻止该redis actor。
@Override
public Receive createReceive() {
return receiveBuilder()
.match(RedisMessage.class, message -> {
try {
accountService.saveBusinessAccountRedis(message.redisBusinessAccount);
getSender().tell(OK, getSelf());
} catch (Exception e) {
//getSender().tell(new Status.Failure(e), getSelf());
e.printStackTrace();
//createRedisUser(idMessage.uid);
getSender().tell(NOK, getSelf());
}
}).match(MySqlMessage.class, message -> {
try {
accountService.saveBusinessAccount();
//ToDo: test for queuing another actor! remove!! :)
Thread.sleep(300);
getSender().tell(OK, getSelf());
} catch (Exception e) {
e.printStackTrace();
getSender().tell(NOK, getSelf());
}
}).build();
}
@Getter
@Setter
@AllArgsConstructor
public static class RedisMessage {
private final RedisBusinessAccount redisBusinessAccount;
}
@Getter
@Setter
@AllArgsConstructor
public static class MySqlMessage {
private final BusinessAccount businessAccount;
}
所以,你要的是要避免处理RedisMessage
s,而你还没有收到触发的动作的响应MySqlMessage
,对不对?
您是否希望能够在同一个actor中处理多个MySqlMessage
? 我怀疑你没有。
我建议使用“ become
和“存储”。 在处理MySqlMessage
,可以使用become
将actor移到“正在等待MySql
结果”的状态。 在这种状态下,当您收到其他MySqlMessage
或RedisMessage
, RedisMessage
它们RedisMessage
stash(msg)
。 当您收到OK
或NOK
从MySQL调用,你unstashAll()
和使用become
回到“正常”状态,在那里你可以开始处理任何(藏或新的)再命令。
那有意义吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.