前言
【rabbitmq学习与搭建】前面讲了rabbitmq的基本概念与安装。接下来讲述一下实操。
在本篇中,介绍的是PHP发送消息,java接收消息并处理。话不多说上代码!!!
php发送消息
function push_rabbitmq_msg($exchange,$routing_key,$queue_name,$queue_msg){
try {
#host: RabbitMQ主机IP port: RabbitMQ端口 $user: 用户名 $password: 密码 $vhost: vhost
$connection = new AMQPStreamConnection($this->ip, $this->port, $this->username, $this->password);
#channel_id 信道id 不传则获取$channel[“”]信道,再无则循环$this->channle数组,下标从1到最大信道数找第一个不是AMQPChannel对象的下标,实例化并返回
$AMQPChannel = $connection->channel();
#exhcange_name 交换器名字 type 交换器类型 passive false 是否检测同名队列 durable false 交换机是否开启持久化 auto_detlete false 通道关闭后是否删除队列
$AMQPChannel->exchange_declare($exchange, 'topic', false, true, false);
#name 队列名称 passive 是否检测同名队列 durable 是否开启队列持久化 exclusive 队列是否可以被其他队列访问 auto_delete: true 通道关闭后是否删除队列
$AMQPChannel->queue_declare($queue_name, false, true, false, false);
$message = $queue_msg;
#data string类型 要发送的消息 properties array类型 设置的属性,比如设置该消息持久化[‘delivery_mode’=>2]
$AMQPMessage = new AMQPMessage($message,array('content_type' => 'text/plain'));
#msg AMQPMessage对象 exchange 交换机名字 routing_key 路由键
$AMQPChannel->basic_publish($AMQPMessage,$exchange,$routing_key);
$AMQPChannel->close();
$connection->close();
} catch(\Exception $e) {
//保存错误数据到数据库货文件
$this->mqError($queue_name,$queue_msg,strval($e));
}
}
注意
1. 队列与交换机设置非持久化,重启rabbitmq后,会被删除。
2. php发送消息时,交换机与队列的配置要与接收方设置一致,不然会匹配不上报错
3. 发送消息到交换机时,指定了路由,那么接收方的路由要一致,才能收到消息
4. 一个路由绑定了多个队列,那么消息发到该路由,绑定的所有队列都会处理,同理队列标定了多个路由,通过路由的消息,队列都会收到
JAVA接收处理
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置rabbitmq参数
在application.yml
加上自己rabbitmq的配置参数
spring:
rabbitmq:
host: 127.0.0.1
port: 38001
username: test
password: test123
设置listener
package com.xxx.listener;
import com.alibaba.fastjson.JSON;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
import java.util.List;
//设置id与自启动关闭,方便初始化后再启动rabbitmq
//设置启动时自动创建交换机,队列,路由,然后互相绑定
@Component
@RabbitListener(id="test",autoStartup = "false",bindings = @QueueBinding(
value = @Queue(value = "queue_test", durable = "true", autoDelete = "false"),
exchange = @Exchange(value = "queue_exchange", type = ExchangeTypes.TOPIC),
key = "queue_test"))
public class GoodsListener {
@RabbitHandler
public void handle(String m) {
//消息接收
String message = m;
//业务处理
}
}
设置初始化完再启动
package com.xxxx;
import org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
@Component
public class AppInit implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
//初始化
init();
}
private final RabbitListenerEndpointRegistry registry;
@Autowired
public AppInit(RabbitListenerEndpointRegistry registry) {
this.registry = registry;
}
private void init() {
try{
//初始化处理
//根据id启动rabbitmq
registry.getListenerContainer("test").start();
}catch (Exception ex){
ex.printStackTrace();
log.error("初始化报错,即将退出");
System.exit(0);
}
}
}
结束语
写的时候注意发送方与接收方的交换机,路由,队列之间的绑定与配置要一致就可以了。