配置基础rabbitMQ

This commit is contained in:
APLS
2020-03-16 01:22:59 +08:00
parent 760e26d192
commit d85709c4a2
7 changed files with 180 additions and 123 deletions

View File

@@ -0,0 +1,92 @@
package io.qyi.e5.config.rabbitMQ;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* @program: msgpush
* @description:
* @author: 落叶随风
* @create: 2020-01-12 22:00
**/
@Configuration
public class RabbitMQConfig {
@Value("")
private String DirectQueueName;
/**
* 处理死信队列的消费队列
* */
@Bean
public Queue fanoutQueue1() {
Map<String, Object> arguments = new HashMap<>(2);
arguments.put("x-dead-letter-exchange", "delay");
arguments.put("x-dead-letter-routing-key", "delay_key");
return new Queue("delay_queue1", true, false, false, arguments);
}
/**
*
*创建消息处理队列
*/
@Bean
public Queue fanoutQueue2() {
return new Queue("delay_queue2", true); // 队列持久
}
/**
* 配置消息交换机
* 针对消费者配置
* FanoutExchange: 将消息分发到所有的绑定队列无routingkey的概念
* HeadersExchange 通过添加属性key-value匹配
* DirectExchange:按照routingkey分发到指定队列
* TopicExchange:多关键字匹配
* @return
*/
@Bean
public DirectExchange fanoutExchangeDelay() {
return new DirectExchange("delay",true, false);
}
/*@Bean
public FanoutExchange fanoutExchangeTencentMsg() {
return new FanoutExchange(EXCHANGE);
}*/
//绑定 将队列和交换机绑定,
@Bean
public Binding bindingFanoutQueue1() {
return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchangeDelay()).with("delay");
}
@Bean
public Binding bindingFanoutQueue2() {
return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchangeDelay()).with("delay_key");
}
// 无限循环问题
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(new Jackson2JsonMessageConverter());
return template;
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
}

View File

@@ -0,0 +1,36 @@
package io.qyi.e5.controller;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @program: e5
* @description:
* @author: 落叶随风
* @create: 2020-03-16 01:01
**/
@Controller
@RestController
public class TestController {
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("/send")
public void aaa(){
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend("delay", "delay", "ttt", message -> {
MessageProperties messageProperties = message.getMessageProperties();
// 设置这条消息的过期时间
messageProperties.setExpiration("10000");
return message;
}, correlationData);
}
}

View File

@@ -0,0 +1,11 @@
package io.qyi.e5.service.rabbitMQ;
/**
* @program: msgpush
* @description:
* @author: 落叶随风
* @create: 2020-01-13 23:34
**/
public interface Listener {
public void listen(String msg);
}

View File

@@ -0,0 +1,41 @@
package io.qyi.e5.service.rabbitMQ.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
* @program: msgpush
* @description:
* @author: 落叶随风
* @create: 2020-01-13 23:35
**/
@Service
public class ListenerImpl {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RabbitHandler
@RabbitListener(queues = "delay_queue2", containerFactory = "rabbitListenerContainerFactory")
public void listen(Message message, Channel channel) throws IOException {
try {
logger.info("消费者开始处理消息: {}" ,new String(message.getBody()));
// JSONObject data = JSON.parseObject(new String(message.getBody()));
// String token = data.getString("token");
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
logger.info("处理完成!");
} catch (IOException e) {
channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
e.printStackTrace();
}
}
}