【问题标题】:Handling messages received by Rabbitmq Client in Android Service在 Android Service 中处理 Rabbitmq Client 收到的消息
【发布时间】:2025-12-12 23:10:01
【问题描述】:

我有一个运行 Rabbitmq 客户端并使用队列中的消息的 android 服务。客户端可以随时接收消息,所以我通过 startService 启动服务(不是绑定方法)。所以问题是我使用什么样的通信机制从服务与不同的活动进行通信:绑定还是通知?绑定不会那么有用,因为收到的 msg 可能与与可见活动不同的活动相关.. 创建模型层来处理在服务队列中收到的如此多不同的 msg 也成为一个挑战......有什么想法和建议吗?

【问题讨论】:

    标签: android service architecture rabbitmq


    【解决方案1】:

    使用消息队列的非常标准的方法如下:您应该在消息中添加某种元数据。然后在处理消息时按摩处理程序在此类元数据的帮助下确定应该处理您的消息的确切类。在这种情况下使用策略模式非常有用。使用这种技术,您也可以轻松地使用多个处理程序处理您的消息。

    元数据可能非常不同:从某个字段值开始(例如标签),或者您可以从特定的类或接口等扩展您的消息...

    回答您问题的第二部分。是的,当然,如果您使用队列,它应该有一个消费者。消费者应该像消息管理器一样玩。为每条消息分配新线程是个坏主意,如果您想在应用程序中使用多个线程,我认为您最好使用线程池。但无论如何,线程的数量不应该很高,因为它会严重影响你的性能。谈论消费者应该确定消息处理逻辑的方式,或者这个逻辑可以放在线程中,这将是处理具体消息 - 我认为这两种变体都是可能的。每个都有自己的优点和缺点。但我认为这个逻辑更好地交给消费者,因为消费者管理来自队列的消息,而且这个任务更接近于消息管理,然后是消息处理本身。

    【讨论】:

    • 感谢您的指导,我更倾向于一种涉及线程的解决方案,为从队列中消耗的每条消息分配一个线程,并在线程内部解析收到的 msg .. 所以我应该有一个 messageHandler/基于元数据的控制器类将消息传递给新线程中的匹配类......你说什么?我在正确的方向...像这样我将需要有 1 个控制器类,多个处理程序类(对于每种消息类型)我在哪里不合作线程??
    【解决方案2】:

    就我而言,我使用了 EventBus:https://github.com/greenrobot/EventBus

    我所有的活动都延伸到具有 subscribe 方法的 abstractOne :

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onAlert(MyObject object) {
    ...
    }
    

    在我的服务中,我只是发布消息:

    EventBus.getDefault().post(<MyObject>);
    

    【讨论】:

      最近更新 更多