maven添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.yml配置
server:
port: 8080
spring:
application:
name: rabbitmq-demo
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#配置rabbitMq 服务器
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 开启发送确认
publisher-confirm-type: SIMPLE
# 开启发送失败退回
publisher-returns: true
virtual-host: '/'
listener:
simple:
acknowledge-mode: manual #开启手动Ack
代码实现:
package com.rabbitmq.demo.config;
import com.rabbitmq.demo.constant.RabbitMQConstant;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class TopicRabbitConfig {
public static final String TEST_ROUTING = "test.topic";
/**
* 队列名
* @return
*/
@Bean
@Qualifier(RabbitMQConstant.TEST_TOPIC_QUEUE)
public Queue testTopicQueue() {
return new Queue(RabbitMQConstant.TEST_TOPIC_QUEUE, true);
}
/**
* topic交换机
* @return
*/
@Bean
@Qualifier(RabbitMQConstant.TEST_TOPIC_EXCHANGE)
public TopicExchange testTopicExchange() {
return new TopicExchange(RabbitMQConstant.TEST_TOPIC_EXCHANGE);
}
/**
* 绑定
* @return
*/
@Bean
public Binding topicBinding(@Qualifier(RabbitMQConstant.TEST_TOPIC_EXCHANGE) TopicExchange exchange,
@Qualifier(RabbitMQConstant.TEST_TOPIC_QUEUE) Queue queue) {
return BindingBuilder.bind(queue)
.to(exchange)
.with(TEST_ROUTING);
}
}
package com.rabbitmq.demo.constant;
public class RabbitMQConstant {
public static final String TEST_DIRECT_QUEUE = "test.direct.queue";
public static final String TEST_TOPIC_QUEUE = "test.topic.queue";
}
package com.rabbitmq.demo.producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.Component;
import java.util.UUID;
@Component
public class TestSender {
protected static Logger logger = LoggerFactory.getLogger(TestSender.class);
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 发送消息
*
* @param exchange
* @param routing
* @param msg
*/
public void sendMessage(String exchange, String routing, Object msg) {
logger.info("发送的消息:{}", msg);
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend(exchange, routing, msg, correlationId);
}
}
package com.rabbitmq.demo.consumer;
import com.rabbitmq.demo.constant.RabbitMQConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
import com.rabbitmq.client.Channel;
import java.io.IOException;
@Component
@RabbitListener(queues = RabbitMQConstant.TEST_TOPIC_QUEUE)
public class TestTopicReceiver {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RabbitHandler
public void onMessage(String content, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
try {
logger.info("topic类型接收处理的消息:{},{}", content,tag);
channel.basicAck(tag,false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
其他工作模式实现类似。地址:https://github.com/DWeiWei/rabbitmq-demo