gpt4 book ai didi

android - 服务间异步通信的最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:22 24 4
gpt4 key购买 nike

在以下场景中什么是最好的/良好的服务绑定(bind)/通信实践(我希望标题有点意义):

业务层 (BL) 包含多个服务方法,这些方法共享(作为公共(public)通信端点)一个异步套接字服务 (SS),该异步套接字服务 (SS) 可以由这些方法绑定(bind)并用于套接字 IO。

例如BL 获取 SL 并调用 send(message) 然后等待响应。

我一开始使用回调和 Binder 模式。由于我在使用 Binder 模式进行清晰设计时遇到了一些问题(缺少消息队列并且所有事情都在主线程中完成),所以我现在正在尝试消息模式。

基本上,BL 服务和 SL 服务现在有一个 Messenger 和一个相应的处理程序:

private final IncomingHandler incomingHandler = new IncomingHandler();
private final Messenger messengerReceiver = new Messenger(incomingHandler);
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
...
}
}

其中一个 BL 是一个 AbstractAccountAuthenticator 子类实现

addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options){
...
if(socketConnectionState != null){
Bundle authBundle = new Bundle();
authBundle.putString("password", password);
authBundle.putString("username", account.name);
Message message = Message.obtain(null, SocketConnectionHandler.SEND_REQUEST, authBundle);
message.replyTo = messengerReceiver;
socketConnectionState.getMessenger().send(message);
...}

它也使用 SL 来获取 authToken。addAccount() 方法要么要求在 Bundle 中立即返回结果(authToken),要么调用响应回调方法。现在,如果我通过 SL 请求 addAccount 中的身份验证 token ,我将如何处理传回结果?

这里的主要问题是结果没有返回给调用方法 (addAccount()),而是返回给 messengerReceiver 处理程序。

我能想到的唯一方法是 BlockingQueue,它由消息处理程序提供响应,然后在 addAccount() 方法中获取,但这确实让人感觉很不对劲。其他想法?完全正确的方法?

最佳答案

只有在声明前提时才会出现问题,即响应是消息处理程序的关注点。

我最近在工作中遇到了同样的问题。我们通过扩展消息处理程序的参数列表来解决它

public interface MessageHandler {
public void receivedMessage(Message message, ResponseChannel channel);
}

interface ResponseChannel {
public void respond(Message response);
}

interface Message {}

当然可以在 MessageHandler 的每个实例中引入一个成员变量,但这会消除无状态性 - 最后,两种方法背后的原理是相同的。

不过,还有另一种可能性。

关注点分离

正如我之前所说,将回答响应的额外责任分配给消息处理程序会留下不好的味道。消息处理程序已经负责接收传入的消息。

他处理传入的消息,这应该是提取相关参数并将消息转发给感兴趣的各方或调用模型或 Controller 上的适当方法的简短过程。

这应该是一个简短且不详尽的过程,因为消息处理程序在逻辑上不是发送/接收组件的一部分,而是在那里注册并与所有其他消息处理程序及其调用共享一个线程或线程池。

那么应该如何处理响应呢?因此,如果这不是处理者的责任,则处理者通知的各方应采取行动。

public interface MessageHandler {
public void receivedMessage(Message message, ApplicationContext context);
}

interface ApplicationContext {
public void notifyUserJoined(String name);
}

interface Message {
public String getUser();
}

关于android - 服务间异步通信的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9918131/

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