RabbitMQ项目测试

1、首先添加一个用户,设置角色,添加权限

保证新建用户和原先用户的权限是一致的

2、添加配置文件

spring.rabbitmq.username=fenghao
spring.rabbitmq.password=123456
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/
#
spring.rabbitmq.listener.simple.acknowledge-mode=manual

3、添加RabbitMQ的配置类

package com.voole.demo.config;

import java.util.HashMap;
import java.util.Map;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
    
    public final static String DEFAULT_BOOK_QUEUE = "dev.book.register.queue";
    
    public final static String MANUAL_BOOL_QUEUE = "dev.book.register.queue";
    
    private static final String REGISTER_DELAY_QUEUE = "dev.book.register.delay.queue";
    
    public static final String REGISTER_DELAY_EXCHANGE = "dev.book.register.delay.exchange";
    
    public static final String DELAY_ROUTING_KEY = "";
    
    public static final String REGISTER_QUEUE_NAME = "dev.book.register.queue";
    
    public static final String REGISTER_EXCHANGE_NAME = "dev.book.register.exchange";
    
    public static final String ROUTING_KEY = "all";
    
    
    
    @Bean
    public Queue defaultQueue() {
        return new Queue(DEFAULT_BOOK_QUEUE,true);
    }
    
    @Bean
    public Queue manualQueue() {
        return new Queue(MANUAL_BOOL_QUEUE,true);
    }
    
    @Bean
    public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {
        connectionFactory.setPublisherConfirms(true);
        connectionFactory.setPublisherReturns(true);
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setConfirmCallback((correlationData,ack,cause) ->System.out.println(String.format("消息发送成功:correlationData(%s),ack(%s),cause(%s)", correlationData,ack,cause)));
        rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey) ->System.out.println(String.format("\"消息丢失:exchange(%s),route(%s),replyCode(%s),replyText(%s),message:%s\"", exchange, routingKey, replyCode, replyText, message)));
        return rabbitTemplate;
    }
    
    @Bean
    public Queue delayProcessQueue() {
        Map<String,Object> params = new HashMap<>();
        params.put("x-dead-letter-exchange", REGISTER_EXCHANGE_NAME);
        params.put("x-dead-letter-routing-key", ROUTING_KEY);
        return new Queue(REGISTER_DELAY_QUEUE,true,false,false,params);
    }
    
    @Bean
    public DirectExchange delayExchange() {
        return new DirectExchange(REGISTER_DELAY_EXCHANGE);
    }
    
    @Bean
    public Binding dlxBinding() {
        return BindingBuilder.bind(delayProcessQueue()).to(delayExchange()).with(DELAY_ROUTING_KEY);
    }
    
    @Bean
    public Queue registerBookQueue() {
        return new Queue(REGISTER_QUEUE_NAME,true);
    }
    
    @Bean
    public TopicExchange registerBookTopicExchange() {
        return new TopicExchange(REGISTER_EXCHANGE_NAME);
    }
    
    @Bean
    public Binding registerBookBinding() {
        return BindingBuilder.bind(registerBookQueue()).to(registerBookTopicExchange()).with(ROUTING_KEY);
    }

}

 

4、消息发送类

package com.voole.demo.controller;

import java.time.LocalDateTime;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.AbstractJavaTypeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.voole.demo.config.RabbitConfig;
import com.voole.demo.vo.Book;

@RestController
public class BookController {
    
    private final RabbitTemplate rabbitTemplate;
    
    @Autowired
    public BookController(RabbitTemplate rabbit) {
        this.rabbitTemplate = rabbit;
    }
    
    @GetMapping("send")
    public String defaultMessage() {
        Book book = new Book();
        book.setId("1");
        book.setName("fengho");
        this.rabbitTemplate.convertAndSend(RabbitConfig.DEFAULT_BOOK_QUEUE,book);
        this.rabbitTemplate.convertAndSend(RabbitConfig.MANUAL_BOOL_QUEUE,book);
        return "success";
    }
    
    @GetMapping("delay")
    public String delay() {
        Book book = new Book();
        book.setId("1");
        book.setName("fengho");
        this.rabbitTemplate.convertAndSend(RabbitConfig.REGISTER_DELAY_EXCHANGE,RabbitConfig.DELAY_ROUTING_KEY,book,message ->{
            message.getMessageProperties().setHeader(AbstractJavaTypeMapper.DEFAULT_CONTENT_CLASSID_FIELD_NAME, Book.class.getName());
            message.getMessageProperties().setExpiration(5 * 1000 +"");
            return message;
        });
        System.out.println("发送时间:"+LocalDateTime.now());
        return "Success";
    }

}

5、消息处理类

package com.voole.demo.handle;

import java.io.IOException;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.rabbitmq.client.Channel;
import com.voole.demo.config.RabbitConfig;
import com.voole.demo.vo.Book;

@Component
public class BookHandler {
    
    @RabbitListener(queues= {RabbitConfig.DEFAULT_BOOK_QUEUE})
    public void listenerAutoAck(Book book,Message message,Channel channel) {
        final long deliverTag = message.getMessageProperties().getDeliveryTag();
        try {
            System.out.println(book.toString());
            channel.basicAck(deliverTag, false);
        }catch (Exception e) {
            try {
                channel.basicRecover();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
    
    @RabbitListener(queues= {RabbitConfig.MANUAL_BOOL_QUEUE})
    public void listenerManualAck(Book book,Message message,Channel channel) {
        try {
            System.out.println(book.toString());
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e) {
            //容错处理
        }
    }
    
    @RabbitListener(queues= {RabbitConfig.REGISTER_QUEUE_NAME})
    public void delayQueue(Book book,Message message,Channel channel) {
        System.out.println(book.toString());
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    

}

6、实体类

package com.voole.demo.vo;

import java.io.Serializable;

public class Book implements Serializable{
    
    /**
     * @Fields serialVersionUID : TODO
     */
    private static final long serialVersionUID = 1L;
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return id+":"+name;
    }
    
    
    
    
    

}

完!

posted @ 2019-03-10 13:42  默默行走  阅读(323)  评论(0编辑  收藏  举报