RabbitMQ的Android端接收

https://www.cloudamqp.com/blog/2015-07-29-rabbitmq-on-android.html

本次做的项目,有一部分是通过RabbitMQ来传输的实时数据。然后我这Android端就需要研究怎么接收。以前用的volley什么的,都是用http通讯的,这个稍微不太一样,采用的消息队列的方式,生产者与消费者的设计模式,观察者模式。有次面试就挂这了TT。看了下RabbitMQ,可以服务端上可以设置为工作队列(Work queues)这种模式下,只有一个消息队列,但是有多个消费者,这样每个任务只会被一个消费者处理订阅发布模式(Publish/Subscribe)这种模式下,会有多个队列,每个队列都有一个消费者我们项目中服务端应该用的就是Publish/Subscribe这种。
RabbitMQ的Android端接收
从官网盗图除了生产者、消费者、消息队列这些东西外,还多了一个X,这个X指的是Exchanges(可以翻译成交换机)。在这种模式下,生产者不直接把信息发送给消息队列,而是只发送给Exchanges,由Exchanges转发给每个消息队列。Exchanges收到信息后会进行一些处理,比如这个消息我都应该发送给哪些队列,还是只发送给一个队列,还是应该丢弃这个消息。这样每个消息队列从Exchanges收到的东西可能都不一样,收到的消息都是根据每个消息队列的需求定制的。比如我们项目分为了油车和电车两种,可以有两个消息队列,一个消息队列只收油车数据,一个只收电车数据。这样根据需要,我在客户端这可以指定我只接受电车的数据了,我就可以从只收电车数据的这个消息队列里取了。然后开始实现:
https://www.cloudamqp.com/blog/2015-07-29-rabbitmq-on-android.html
在这发现了一篇好教程,直接教我怎么在Android上实现。代码不多,很容易就可以实现。
我把代码精简了下,因为我这只需要从服务器接收数据就可以了,所以把publish的代码删了主要流程如下:设置连接参数setupConnectionFactory 创建一个用于从线程中接收数据来更新UI的handler 启动一个订阅者线程,创建一个队列,将其bind到参数中指定的Exchanges上,并根据传入的routingKey路由关键字来从Exchanges中接收指定类型的消息数据。 之后创建消费者consumer从消息队列中循环请求数据。

View Code

package edu.hrbeu.ice.rabbitmqclient;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;public class MainActivity extends AppCompatActivity {ConnectionFactory factory = new ConnectionFactory();Thread subscribeThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//连接设置
        setupConnectionFactory();//用于从线程中获取数据,更新uifinal Handler incomingMessageHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {String message = msg.getData().getString("msg");TextView tv = (TextView) findViewById(R.id.textView);Date now = new Date();SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");tv.append(ft.format(now) + ' ' + message + '\n');Log.i("test", "msg:" + message);}};//开启消费者线程
        subscribe(incomingMessageHandler);}/*** 连接设置*/private void setupConnectionFactory() {factory.setHost("server url");factory.setPort(5671);factory.setUsername("guest");factory.setPassword("guest");}/*** 消费者线程*/void subscribe(final Handler handler) {subscribeThread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {//使用之前的设置,建立连接Connection connection = factory.newConnection();//创建一个通道Channel channel = connection.createChannel();//一次只发送一个,处理完成一个再获取下一个channel.basicQos(1);AMQP.Queue.DeclareOk q = channel.queueDeclare();//将队列绑定到消息交换机exchange上//                  queue         exchange              routingKey路由关键字,exchange根据这个关键字进行消息投递。channel.queueBind(q.getQueue(), "amq.fanout", "chat");//创建消费者QueueingConsumer consumer = new QueueingConsumer(channel);channel.basicConsume(q.getQueue(), true, consumer);while (true) {//wait for the next message delivery and return it.QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());Log.d("", "[r] " + message);//从message池中获取msg对象更高效Message msg = handler.obtainMessage();Bundle bundle = new Bundle();bundle.putString("msg", message);msg.setData(bundle);handler.sendMessage(msg);}} catch (InterruptedException e) {break;} catch (Exception e1) {Log.d("", "Connection broken: " + e1.getClass().getName());try {Thread.sleep(5000); //sleep and then try again} catch (InterruptedException e) {break;}}}}});subscribeThread.start();}@Overrideprotected void onDestroy() {super.onDestroy();subscribeThread.interrupt();}}

View Code

posted on 2017-03-11 13:18 木子炜培先生 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/liadmin/p/6534673.html

RabbitMQ的Android端接收相关推荐

  1. 【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )

    文章目录 前言 一.Android 端可执行程序的 main 函数操作 二.Android 端 TCP 协议服务器建立 三.Android 端接收 PC 端传来的数据 四.博客资源 前言 本篇博客重点 ...

  2. 服务器下传Android端,本地Tomcat服务器接收android端上传的数据

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 大体描述 android端提交账号和密码,Tomcat服务器端会接收到,eclipse的控制台输出得到的账号和密码. T ...

  3. 第五节 RabbitMQ在C#端的应用-消息收发

    原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...

  4. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  5. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 MethodChannel 通信 )

    文章目录 前言 一.Android 端 MethodChannel 构造函数 二.Android 端 setMethodCallHandler 方法 三.Android 端实现 MethodChann ...

  6. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 EventChannel 通信 )

    文章目录 前言 一.Android 端 EventChannel 构造函数 二.Android 端 setStreamHandler 方法 三.Android 端实现 EventChannel 通信步 ...

  7. 【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )

    文章目录 一. 报错信息 二. Android 端与 Flutter 端 EventChannel 注册与监听流程 三. 解决方案 一. 报错信息 在 Android 端初始化 EventChanne ...

  8. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 BasicMessageChannel 通信 )

    文章目录 前言 一.Android 端 BasicMessageChannel 构造函数 二.Android 端 MessageCodec 子类实现 三.Android 端 setMessageHan ...

  9. java 对外提供接口_Java服务器对外提供接口以及Android端向服务器请求数据

    讲解下java服务器是如何对移动终端提供接口的,以什么数据格式提供出去,移动端又是怎么请求服务器,接收以及解析返回数据的. 服务端:还是在原先S2SH框架的项目上(搭建SSH详细步骤及其相关说明),加 ...

最新文章

  1. 基于python的手写数字识别knn_KNN分类算法实现手写数字识别
  2. 曾大战LeCun的谷歌女性科学家,刚刚被Jeff Dean开除了!
  3. POJ 1177 Picture [离散化+扫描线+线段树]
  4. mysql+数据库连接标识_新人必看!连接到MySQL数据库的两种方法
  5. springapplication.run运行多个应用_编程的十二要素应用宣言
  6. 25 To Life
  7. 超全汇总,常见的芯片封装大全-道合顺大数据infinigo
  8. windows server 部署java Web项目
  9. 撰写商业计划书的一些误区和建议
  10. 笔记本无法启用免费wifi
  11. 修改Git提交历史中的author,email和name等信息
  12. linux终端ppt,[转]TPP:linux终端下的ppt
  13. Python最详细的 机器学习算法:逻辑回归的推导及实战 你值得拥有!
  14. 锐捷服务器虚拟化技术_交换机虚拟化技术.ppt
  15. 重新安装windows10的应用商店
  16. 【硬件FPGA 】xilinx_A7调试问题总结(FPGA异常发烫)
  17. STM32---c语言指针1
  18. A Verifiable Secret Shuffle of Homomorphic Encryptions学习笔记
  19. python中random模块
  20. 记一次在nuxt中使用generate批量生成静态站点页面

热门文章

  1. php初学遇到的问题。
  2. 印度软件水平和中国的程序员
  3. 细节问题:ZEROFILL的用法范围。
  4. java数组查找文本_基于数组的二叉查找树 Binary Search Tree (Java实现)
  5. access 文本转换数字_ACCESS的短文本和长文本分类
  6. apply_async进程不执行_[粉丝问答6]子进程进程的父进程关系
  7. 蓝桥杯 ALGO-78 算法训练 确定元音字母位置
  8. L2-012. 关于堆的判断-PAT甲级真题(堆的建立,向上调整)
  9. 全国计算机二级C 错题/知识点整理
  10. 1017. A除以B (20)-PAT乙级真题