消息队列简单入门:springboot

1.明白流程

exchange通过routingKey(一个规则)绑定着queue
。。。。。。。。。。。。。。。。。。。。。。。。。。。
用户指定:交换机,routingKey,消息。然后就可以把消息传给queue了。

开始:1.创建交换机

在这里插入图片描述
在这里插入图片描述

2。创建队列

在这里插入图片描述
在这里插入图片描述

3.通过routingKey绑定exchange和queue

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里routingKey注意一下:#是值:类似于order.abc.123的都可以绑定到(可以有多个“.”)。
还有一种是:*是值:类似于order.abc才能访问到(只能有一个“.”)

代码部分:

0.先写配置文件:

#rabbitMQ
spring.rabbitmq.addresses=127.0.0.1:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=2000//超时时间为2s

1.创建一个entity:

@Data
public class TOrder implements Serializable {
    @TableId
    private String id;
    private String name;
    private String messageId;
}

这里注意,一定要继承Serializable接口,因为它要传输到网络上的。
2.写个把message发送出去的类和方法:

package com.van.mall.rabbitMQ.producer;

import com.van.mall.entity.TOrder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author Van
 * @date 2020/3/30 - 23:01
 */
@Component
public class OrderSender {
    @Resource
    private RabbitTemplate rabbitTemplate;
    public void sent(TOrder tOrder){
        CorrelationData correlationData=new CorrelationData();
        correlationData.setId(tOrder.getId());
        rabbitTemplate.convertAndSend(
                "order-exchange",//exchange
                "order.abcd",//routingKey
                tOrder,                 //message content
                correlationData         //correlationData message id
        );

    }
}

开始测试:

@Test
    public void test(){
    TOrder tOrder=new TOrder();
    tOrder.setId("20200320");
    tOrder.setMessageId(UUID.randomUUID().toString());
    tOrder.setName("test order NO.1");
    orderSender.sent(tOrder);
}

能看到有一条消息产生L在这里插入图片描述
点击队列后:
在这里插入图片描述
可看到消息.

消费者开始:

  1. properties文件:
#customer properties
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10
spring.rabbitmq.listener.simple.acknowledge-mode=manual//手动签收
spring.rabbitmq.listener.simple.prefetch=1

消费者:

package com.van.mall.rabbitMQ.customer;

import com.rabbitmq.client.Channel;
import com.van.mall.entity.TOrder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @author Van
 * @date 2020/3/30 - 23:54
 */
@Slf4j
@Component
public class OrderReceiver {
    //监听queue:
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value ="order-queue",durable = "true"),
            exchange = @Exchange(value = "order-exchange",durable = "true",type = "topic"),
            key = "order.*"
    )
    )
    //如果监听到了,那么执行这个方法
    @RabbitHandler
    public void onOrderMessage (@Payload  TOrder tOrder, @Headers Map<String ,Object>headers, Channel channel)throws Exception{
        log.info("-----------receive message-------------");
        log.info("orderID:{}",tOrder.getId());
        Long deliveryTag =(Long) headers.get(AmqpHeaders.DELIVERY_TAG);
        //ACK
        channel.basicAck(deliveryTag,false);

    }
}

其实搞了这个注解,不用在上述的网站上创建exchange和queue了,这个注解全部搞定

在这里插入图片描述
启动后会看到:
在这里插入图片描述
我发出一个message然后自己又接受到这个message

发布了56 篇原创文章 · 获赞 1 · 访问量 1509

猜你喜欢

转载自blog.csdn.net/weixin_44841849/article/details/105212068