rabbitmq的实操


前言

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);
        }
    }
}

结束语

写的时候注意发送方与接收方的交换机,路由,队列之间的绑定与配置要一致就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值