gpt4 book ai didi

java - 在处理当前消息时阻止其他参与者在 akka 中排队请求

转载 作者:行者123 更新时间:2023-11-30 10:01:52 27 4
gpt4 key购买 nike

我有一个 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;
}

最佳答案

所以你想要的是在你还没有收到由 MySqlMessage 触发的 Action 的响应时避免处理 RedisMessage,对吧?

您是否希望能够在同一个 actor 中处理多个 MySqlMessage?我怀疑你没有。

我建议使用 become 和“stashing”。处理 MySqlMessage 时,使用 become 将 actor 移动到“等待 MySql 结果”的状态。在那种状态下,当您收到额外的 MySqlMessageRedisMessage 时,您将stash(msg) 它们。当您从 MySQL 调用中收到 OKNOK 时,您 unstashAll() 并使用 become 返回到“正常”状态,您可以再次开始处理任何(隐藏的或新的)命令。

这有意义吗?

关于java - 在处理当前消息时阻止其他参与者在 akka 中排队请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57252840/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com