Android接收RabbitMQ消息。
参考:https://blog.csdn.net/qq_36576738/article/details/83754621
我这android这边就不实现发布消息功能。因为我是在服务端那边推送消息。
开发工具android studio。
1》建好项目后添加包(目前最新的是5.7.0):
dependencies { implementation 'com.rabbitmq:amqp-client:5.7.0' }
2》在主页面上加个TextView,用来显示服务端推送的消息。
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtrabbitmqt" android:text="rabbitmq" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
3》连接服务器上的RabbitMq:
/** * 连接设置 */ private void setupConnectionFactory() { factory = new ConnectionFactory(); factory.setHost("服务器ip"); factory.setPort(rabbitmq端口,默认5672); factory.setUsername("自己连接rabbitmq账号"); factory.setPassword("自己连接rabbitmq的密码"); }
4》编写订阅代码:
/** * 收消息(从发布者那边订阅消息) */ private void basicConsume(final Handler handler){ try { //连接 Connection connection = factory.newConnection() ; //通道 final Channel channel = connection.createChannel() ; //实现Consumer的最简单方法是将便捷类DefaultConsumer子类化。可以在basicConsume 调用上传递此子类的对象以设置订阅: channel.basicConsume("myqueue" , false , new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { super.handleDelivery(consumerTag, envelope, properties, body); String msg = new String(body) ; long deliveryTag = envelope.getDeliveryTag() ; channel.basicAck(deliveryTag , false); //从message池中获取msg对象更高效 Message uimsg = handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("msg", msg); uimsg.setData(bundle); handler.sendMessage(uimsg); } }); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } }
整个demo代码:
package com.ldb.longdb.rabbitmqapp; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; 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.DefaultConsumer; import com.rabbitmq.client.Envelope; import java.io.IOException; import java.util.concurrent.TimeoutException; public class MainActivity extends AppCompatActivity { ConnectionFactory factory; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //连接设置 setupConnectionFactory(); //用于从线程中获取数据,更新ui final Handler incomingMessageHandler = new Handler() { @Override public void handleMessage(Message msg) { String message = msg.getData().getString("msg"); TextView tv = (TextView) findViewById(R.id.txtrabbitmqt); tv.append(message + '\n'); Log.i("test", "msg:" + message); } }; //开启消费者线程 //subscribe(incomingMessageHandler); new Thread(new Runnable() { @Override public void run() { basicConsume(incomingMessageHandler); } }).start(); } /** * 连接设置 */ private void setupConnectionFactory() { factory = new ConnectionFactory(); factory.setHost(服务器ip); factory.setPort(5672); factory.setUsername("longdb"); factory.setPassword("***"); } /** * 收消息(从发布者那边订阅消息) */ private void basicConsume(final Handler handler){ try { //连接 Connection connection = factory.newConnection() ; //通道 final Channel channel = connection.createChannel() ; //实现Consumer的最简单方法是将便捷类DefaultConsumer子类化。可以在basicConsume 调用上传递此子类的对象以设置订阅: channel.basicConsume("myqueue" , false , new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { super.handleDelivery(consumerTag, envelope, properties, body); String msg = new String(body) ; long deliveryTag = envelope.getDeliveryTag() ; channel.basicAck(deliveryTag , false); //从message池中获取msg对象更高效 Message uimsg = handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("msg", msg); uimsg.setData(bundle); handler.sendMessage(uimsg); } }); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } }
我是直接打包,然后自己手机安装测试。
测试步骤:1》app打开
2》springcloud服务(springcloud怎样发布消息,请看上一篇)运行,发送请求。
测试截图: