springboot整合rabbitmq

1、生產者

1.1 依賴

pom.xml

<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.mine</groupId>
	<artifactId>rabbitmq-producer</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
	</parent>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<!-- SpringBoot整合Web組件 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- Rabbitmq依賴 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
	</dependencies>
</project>

1.2 配置

application.properties

server.port=8000

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/test
spring.rabbitmq.username=test
spring.rabbitmq.password=test

1.3 代碼

RabbitConfig

package com.mine.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
	// direct交換機
	public static final String EXCHANGE_DIRECT = "mine.direct";
	// 隊列
	public static final String QUEUE_EMAIL = "queue_email";
	public static final String QUEUE_SMS = "queue_sms";
	// routingKey
	public static final String ROUTING_KEY_ALL = "all";
	public static final String ROUTING_KEY_EMAIL = "email";
	public static final String ROUTING_KEY_SMS = "sms";

	// fanout交換機
	public static final String EXCHANGE_FANOUT = "mine.fanout";
	// 隊列
	public static final String QUEUE_FANOUT_1 = "queue_fanout_1";
	public static final String QUEUE_FANOUT_2 = "queue_fanout_2";

	// 新建direct交換機
	@Bean
	public DirectExchange directExchange() {
		return new DirectExchange(EXCHANGE_DIRECT);
	}

	// 新建郵件隊列
	@Bean
	public Queue queueEmail() {
		return new Queue(QUEUE_EMAIL, true);
	}

	// 新建短信隊列
	@Bean
	public Queue queueSms() {
		return new Queue(QUEUE_SMS, true);
	}

	// 綁定郵件隊列
	@Bean
	public Binding bindingEmail(DirectExchange directExchange, Queue queueEmail) {
		return BindingBuilder.bind(queueEmail).to(directExchange).with(ROUTING_KEY_EMAIL);
	}

	// 綁定短信隊列
	@Bean
	public Binding bindingSms(DirectExchange directExchange, Queue queueSms) {
		return BindingBuilder.bind(queueSms).to(directExchange).with(ROUTING_KEY_SMS);
	}

	// 綁定短信隊列ALL
	@Bean
	public Binding bindingSmsAll(DirectExchange directExchange, Queue queueSms) {
		return BindingBuilder.bind(queueSms).to(directExchange).with(ROUTING_KEY_ALL);
	}

	// 綁定郵件隊列ALL
	@Bean
	public Binding bindingEmailAll(DirectExchange directExchange, Queue queueEmail) {
		return BindingBuilder.bind(queueEmail).to(directExchange).with(ROUTING_KEY_ALL);
	}

	// 新建fanout交換機
	@Bean
	public FanoutExchange fanoutExchange() {
		return new FanoutExchange(EXCHANGE_FANOUT);
	}

	// 新建fanout隊列1
	@Bean
	public Queue queueFanout1() {
		return new Queue(QUEUE_FANOUT_1, true);
	}

	// 新建fanout隊列2
	@Bean
	public Queue queueFanout2() {
		return new Queue(QUEUE_FANOUT_2, true);
	}

	// 綁定fanout隊列1
	@Bean
	public Binding bindingFanout1(FanoutExchange fanoutExchange, Queue queueFanout1) {
		return BindingBuilder.bind(queueFanout1).to(fanoutExchange);
	}

	// 綁定fanout隊列2
	@Bean
	public Binding bindingFanout2(FanoutExchange fanoutExchange, Queue queueFanout2) {
		return BindingBuilder.bind(queueFanout2).to(fanoutExchange);
	}

}

MsgProducer

package com.mine.producer;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.mine.config.RabbitConfig;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class MsgProducer {
	@Autowired
	private AmqpTemplate amqpTemplate;

	public void sendSms(String content) {
		amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_DIRECT, RabbitConfig.ROUTING_KEY_SMS, content);
		log.info("sendSms success, message content is [" + content + "]");
	}

	public void sendEmail(String content) {
		amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_DIRECT, RabbitConfig.ROUTING_KEY_EMAIL, content);
		log.info("sendEmail success, message content is [" + content + "]");
	}

	public void sendAll(String content) {
		amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_DIRECT, RabbitConfig.ROUTING_KEY_ALL, content);
		log.info("sendAll success, message content is [" + content + "]");
	}

	public void sendFanout(String content) {
		amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_FANOUT, "", content);
		log.info("sendFanout success, message content is [" + content + "]");
	}

}

MessageSendController

package com.mine.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.mine.producer.MsgProducer;

@RestController
public class MessageSendController {
	@Autowired
	private MsgProducer msgProducer;

	@RequestMapping("/sendSms")
	public String sendSms(String msg) {
		msgProducer.sendSms(msg);
		return "send ok!";
	}

	@RequestMapping("/sendEmail")
	public String sendEmail(String msg) {
		msgProducer.sendEmail(msg);
		return "send ok!";
	}

	@RequestMapping("/sendAll")
	public String sendAll(String msg) {
		msgProducer.sendAll(msg);
		return "send ok!";
	}

	@RequestMapping("/sendFanout")
	public String sendFanout(String msg) {
		msgProducer.sendFanout(msg);
		return "send ok!";
	}
}

AppProducer

package com.mine;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppProducer {
	public static void main(String[] args) {
		SpringApplication.run(AppProducer.class, args);
	}
}

2、消費者

2.1 依賴

pom.xml

<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.mine</groupId>
  	<artifactId>rabbitmq-consumer</artifactId>
  	<version>0.0.1-SNAPSHOT</version>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
	</parent>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<!-- SpringBoot整合Web組件 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- Rabbitmq依賴 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
	</dependencies>
</project>

2.2 配置

application.properties

server.port=8002

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/test
spring.rabbitmq.username=test
spring.rabbitmq.password=test

2.3 代碼

EmailConsumer

package com.mine.consumer;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@RabbitListener(queues = "queue_email")
@Slf4j
public class EmailConsumer {
	@RabbitHandler
	public void process(String content) {
		log.info("接收到郵件隊列消息:" + content);
    }
}

SmsConsumer

package com.mine.consumer;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@RabbitListener(queues = "queue_sms")
@Slf4j
public class SmsConsumer {
	@RabbitHandler
	public void process(String content) {
		log.info("接收到短信隊列消息:" + content);
    }
}

Fanout1Consumer

package com.mine.consumer;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@RabbitListener(queues = "queue_fanout_1")
@Slf4j
public class Fanout1Consumer {
	@RabbitHandler
	public void process(String content) {
		log.info("接收到fanout1隊列消息:" + content);
    }
}

Fanout2Consumer

package com.mine.consumer;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@RabbitListener(queues = "queue_fanout_2")
@Slf4j
public class Fanout2Consumer {
	@RabbitHandler
	public void process(String content) {
		log.info("接收到fanout2隊列消息:" + content);
    }
}

AppConsumer

package com.mine;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppConsumer {
	public static void main(String[] args) {
		SpringApplication.run(AppConsumer.class, args);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章