Android中使用Rabbitmq小记

最近项目中需要使用的小工具,牵扯到后台需要前后台做消息通信,和web端同事简单比较了下,决定使用MQ进行通讯,之前App项目中使用MQTT比较多,对于Rabbitmq只是简单的知道是一个后台经常用到的异步操作队列,当然既然要用,咱也不虚,简单了解了下,很快实现了功能,用起来挺方便的,这里简单作一下笔记。望后端大佬勿喷!~

MQ文档地址: https://www.rabbitmq.com/tutorials/tutorial-one-java.html

Android项目中引入Rabbitmq

引入项目还是比较简单的,直接在maven repository中搜索一下Rabbitmq,之后找到gradle依赖方式,copy过来即可。

implementation 'com.rabbitmq:amqp-client:5.12.0'

初始化Rabbitmq

//初始化ConnectionFactory对象
private val mConnectFactory by lazy { ConnectionFactory() }
//设置需要使用到的参数
mConnectFactory.apply {
    virtualHost = mqVhost
    //主机地址
    host = mqHostname
    //端口号
    port = mqPort
    //用户名
    username = mqUsername
    //密码
    password = mqPassword
    //设置连接恢复
    isAutomaticRecoveryEnabled = true
}

至此简单的初始化就完成了

接收消息

//订阅消息
fun subscribe() {
	//这里创建一个线程,MessageReceiverTask其实就是一个Runnable
    MessageReceiverTask(mConnectFactory).apply{
        Thread(this).start()
    }
}

接下来就是重头戏,关于MessageReceiverTask实现。

... 省略Runnable实现
override fun run() {
        val connection = connectFactory.newConnection()
        val channel = connection.createChannel()
        //设置处理完一个消息,再接口下一个消息
        channel.basicQos(1)
        //声明交换机类型
        channel.exchangeDeclare(mqChannelName, "fanout", true)
        //声明队列
        channel.queueDeclare(mqMessageQueueName, true, false, false, null)
        //根据路由键将队列绑定到交换机上
        channel.queueBind(mqMessageQueueName, mqChannelName, mqRoutingKey)
        //创建消费者
        val consumer = object : DefaultConsumer(channel) {
            override fun handleDelivery(
                consumerTag: String?,
                envelope: Envelope,
                properties: AMQP.BasicProperties?,
                body: ByteArray?
            ) {
                if (body == null) {
                    Log.e("info", "收到消息-body为空")
                    //如果接收到的消息体为空,则表示消息没有用,直接拒绝
                    //这里false表示只处理当前消息
                    channel.basicReject(envelope.deliveryTag, false)
                } else {
                   ...省略若干业务
                   //处理完业务逻辑之后,通知消息队列该消息已经被消费
                   channel.basicAck(envelope.deliveryTag, false) 
                }
            }
        }
        //启动一个消费者,该方法会返回消费者的标识符
        //这里设置false表示使用手动确认消费,如果设置为true,则会自动确认
        channel.basicConsume(mqMessageQueueName, false, consumer)
    }

至此就可以愉快的玩耍了。

对于发送其他本质上是一样的,由于我操作只关心接口,如果没有写代码。这里列一下发现的方法,可以自行查阅下文档了解更多。

MQ文档地址: https://www.rabbitmq.com/tutorials/tutorial-one-java.html

发送消息

...其他部分与接收相同
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android可以使用RabbitMQ来实现消息队列的功能。RabbitMQ是一种开源的消息代理,它可以在分布式系统进行消息的传递和处理。 要在Android使用RabbitMQ,需要进行以下步骤: 1. 添加RabbitMQ的依赖库:在项目的build.gradle文件添加以下代码: ``` dependencies { implementation 'com.rabbitmq:amqp-client:5.12.0' } ``` 2. 创建RabbitMQ连接:在Android应用通过AMQP协议与RabbitMQ服务进行通信,需要使用RabbitMQJava客户端。在连接前需要先创建一个ConnectionFactory对象: ``` ConnectionFactory factory = new ConnectionFactory(); factory.setHost("your-rabbitmq-hostname"); factory.setUsername("your-rabbitmq-username"); factory.setPassword("your-rabbitmq-password"); ``` 3. 创建通道和队列:通过连接创建一个通道,然后使用通道创建一个队列: ``` Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare("your-queue-name", false, false, false, null); ``` 4. 发送消息:通过通道将消息发送到队列: ``` String message = "Hello, RabbitMQ!"; channel.basicPublish("", "your-queue-name", null, message.getBytes("UTF-8")); ``` 5. 接收消息:通过监听队列获取消息: ``` Consumer consumer = 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"); Log.d(TAG, "Received message: " + message); } }; channel.basicConsume("your-queue-name", true, consumer); ``` 注意,在使用RabbitMQ时需要考虑到网络连接和消息传递的安全性。另外,在使用完连接和通道后,需要关闭它们以释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值