springboot 整合 rabbitmq
来源:互联网 发布:tp框架隐藏index.php 编辑:程序博客网 时间:2024/05/21 14:56
pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.version>4.3.13.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency> <!-- mysql驱动 mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <!-- 数据库连接池 druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.26</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
我刚开始启动项目时报错,最后发现是由于缺少了jar包以及jar包版本不一致,我使用的是springboot 1.5.6,如果和我一样可以参考上面的,我本机测试是没问题的。不一样的话,可以自己去百度查看你使用的springboot版本对应的jar包版本号。
application.yml
server: context-path: /spring-boot port: 8082spring: rabbitmq: host: 部署了rabbitmq的主机ip port: 5672 username: qinwei password: 123456 virtual-host: / publisherConfirms: true listener: simple: acknowledge-mode: manual concurrency: 5 max-concurrency: 10 cache: channel: size: 50mq: topicExchange: spring-exchange queue: spring_queue routeKey: spring_key myQueue: rabbit_queue myRouteKey: rabbit_key
MQProperties.java
@Component@ConfigurationProperties(prefix = "mq")public class MQProperties { private String topicExchange; private String routeKey; private String queue; private String myQueue; private String myRouteKey; public String getMyQueue() { return myQueue; } public void setMyQueue(String myQueue) { this.myQueue = myQueue; } public String getMyRouteKey() { return myRouteKey; } public void setMyRouteKey(String myRouteKey) { this.myRouteKey = myRouteKey; } public String getTopicExchange() { return topicExchange; } public void setTopicExchange(String topicExchange) { this.topicExchange = topicExchange; } public String getRouteKey() { return routeKey; } public void setRouteKey(String routeKey) { this.routeKey = routeKey; } public String getQueue() { return queue; } public void setQueue(String queue) { this.queue = queue; }}
RabbitMQConfig.java
@Component@EnableRabbitpublic class RabbitMQConfig { @Autowired private MQProperties mqProperties; @Autowired private CachingConnectionFactory connectionFactory; /*这里的connectionFactory不需要手动创建,因为org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.RabbitConnectionFactoryCreator已经创建好了,只要你在application.yml中添加了相应的配置就可以了*/ @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public RabbitTemplate rabbitTemplate() { return new RabbitTemplate(connectionFactory); } @Bean public Queue queue1() { return new Queue(mqProperties.getQueue()); } @Bean public Queue queue2() { return new Queue(mqProperties.getMyQueue()); } @Bean public TopicExchange topicExchange() { return new TopicExchange(mqProperties.getTopicExchange(), true, false); } @Bean public Binding binding1() { // *表示一个单词,#表示零个或多个单词 return BindingBuilder.bind(queue1()).to(topicExchange()).with(mqProperties.getRouteKey() + ".*"); } @Bean public Binding binding2() { return BindingBuilder.bind(queue2()).to(topicExchange()).with(mqProperties.getMyRouteKey() + ".*"); }}
生产者 Sender.java
@Componentpublic class Sender implements RabbitTemplate.ConfirmCallback { private RabbitTemplate rabbitTemplate; @Autowired private MQProperties mqProperties; public Sender(RabbitTemplate rabbitTemplate) { this.rabbitTemplate = rabbitTemplate; rabbitTemplate.setConfirmCallback(this); } public void send1(String message) { System.out.println("Sender1 : " + message); rabbitTemplate.convertAndSend(mqProperties.getTopicExchange(), mqProperties.getRouteKey() + ".springboot", message, new CorrelationData(UUID.randomUUID().toString())); } public void send2(String message) { System.out.println("Sender2 : " + message); rabbitTemplate.convertAndSend(mqProperties.getTopicExchange(), mqProperties.getMyRouteKey() + ".qinwei", message, new CorrelationData(UUID.randomUUID().toString())); } @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { System.out.println(" 回调id:" + correlationData); if (ack) { System.out.println("消息成功消费"); } else { System.out.println("消息消费失败:" + cause); } }}
消费者 Receiver.java
@Componentpublic class Receiver { @RabbitListener(queues = "${mq.queue}") public void receive1(Message message, Channel channel, String msg) { System.out.println("消费内容为1: " + new String(message.getBody())); try { channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } catch (Exception e) { e.printStackTrace(); } } @RabbitListener(queues = "${mq.myQueue}") public void receive2(Message message, Channel channel, String msg) { System.out.println("消费内容为2: " + msg); try { channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } catch (Exception e) { e.printStackTrace(); } }}
测试类 RabbitMqTest .java
@RestControllerpublic class RabbitMqTest { @Autowired private Sender sender; @RequestMapping(value = "/rabbitmq/{message}", method = RequestMethod.GET) public String hello(@PathVariable("message") String message) { SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss.SSS"); String context = message + " " + sdf.format(new Date()); /*如果message为qinwei1则只发送到queue1;qinwei2只发送到queue2;qinwei12则同时发送到2个queue*/ if (message.contains("1")) { sender.send1(context); } if (message.contains("2")) { sender.send2(context); } return context; }}
阅读全文