一:功能简介
最近公司技术经理分布任务:安卓使用RabbitMQ实现发送与接收,于是写了下面的demo。如果电脑没有配置RabbitMQ,需要先去配置。【Windows安装RabbitMQ详细教程】_rabbitmq windows-CSDN博客
虚拟机中安装RabbitMQ及使用(超详细)_rabbitmq 虚拟主机-CSDN博客
二:RabbitMq简介
这里不再详细介绍,直接放链接大伙去了解。
RabbitMQ 详解-CSDN博客
三:代码的实现
效果图:
代码部分:
代码总体结构:
项目相关配置:
- 在AndroidManifest.xml配置网络权限
-
<uses-permission android:name="android.permission.INTERNET" />
配置MQ相关依赖
- 在build.gradle配置
-
implementation ("com.rabbitmq:amqp-client:5.13.0") implementation ("com.google.guava:guava:30.1.1-android")
到这里配置就结束了,下面是项目部分代码
MainActivity代码如下:
package com.jl.mq_demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用
Start();
}
//MQ调用
private void Start(){
// 发送
new SendMessageTask().execute("哈哈哈!真的不容易啊?");
// 接收
new ReceiveMessageTask().execute();
}
}
RabbitMQHelper代码如下:
package com.jl.mq_demo;
import com.rabbitmq.client.ConnectionFactory;
/**
* 功能: MQ配置类
* 作者:Jin
* 日期:2024年05月27日
*/
public class RabbitMQHelper {
//队列名称
public static String QUEUE_NAME = "***";
//MQ地址
public static final String HOST = "0.0.0.0";
//MQ端口号
public static final int PORT = 5672;
//MQ账号
public static final String USERNAME = "admin";
//MQ密码
public static final String PASSWORD = "*********";
public ConnectionFactory getConnectionFactory() {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(HOST);
factory.setPort(PORT);
factory.setUsername(USERNAME);
factory.setPassword(PASSWORD);
return factory;
}
}
ReceiveMessageTask代码如下:
package com.RabbitMQ;
import android.os.AsyncTask;
import android.util.Log;
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;
/**
* 功能:MQ接收消息工具类
* 作者:Jin
* 日期:2024年05月27日
*/
public class ReceiveMessageTask extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... voids) {
RabbitMQHelper helper = new RabbitMQHelper();
ConnectionFactory factory = helper.getConnectionFactory();
try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
String queueName = "hello";
// 声明队列
channel.queueDeclare(queueName, true, false, false, null);
// 定义消费者
channel.basicConsume(queueName, false, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
// 手动确认消息
channel.basicAck(envelope.getDeliveryTag(), false);
// 在这里,可以添加处理消息的代码
onProgressUpdate(message);
// Log.i("这是啥",message);
}
});
// 保持频道打开以侦听消息。
synchronized (this) {
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(String... messages) {
// 将您的UI与接收到的消息联合使用
System.out.println(" [x] Processed '" + messages[0] + "'");
Log.i("接收的消息为",messages[0]);
}
}
SendMessageTask代码如下:
package com.RabbitMQ;
import android.os.AsyncTask;
import android.util.Log;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 功能:MQ发送消息工具类
* 作者:Jin
* 日期:2024年05月27日
*/
public class SendMessageTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... messages) {
RabbitMQHelper helper = new RabbitMQHelper();
ConnectionFactory factory = helper.getConnectionFactory();
try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
String exchangeName = "my_exchange";
String routingKey = "my_routing_key";
String queueName = "hello";
// 声明交换和停止,并约束他们
channel.exchangeDeclare(exchangeName, "direct", true); // durable exchange
channel.queueDeclare(queueName, true, false, false, null); // durable queue
channel.queueBind(queueName, exchangeName, routingKey);
// 以持久模式发布消息
String message = messages[0];
channel.basicPublish(exchangeName, routingKey,
new com.rabbitmq.client.AMQP.BasicProperties.Builder()
.deliveryMode(2) // make message persistent
.build(),
message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
Log.i("发送的消息是",message);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}