繁体   English   中英

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

[英]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结果”的状态。 在这种状态下,当您收到其他MySqlMessageRedisMessageRedisMessage它们RedisMessage stash(msg) 当您收到OKNOK从MySQL调用,你unstashAll()和使用become回到“正常”状态,在那里你可以开始处理任何(藏或新的)再命令。

那有意义吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM