Directorio de artículos
Construir el entorno inicial
Introducir dependencias
<!--引入与rabbitmq集成依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
También podemos verificar este lugar directamente al construir rápidamente;
perfil de configuración
spring:
application:
name: springboot_rabbitmq
rabbitmq:
host: 10.15.0.9
port: 5672
username: ems
password: 123
virtual-host: /ems
Este nombre no tiene significado práctico, pero es muy importante en proyectos de microservicios.La
configuración en rabbitmq es para conectarse con nuestro servicio RabbitMQ.
RabbitTemplate
Se usa para simplificar la operación y se puede usar directamente inyectándolo en el proyecto
El modelo HelloWorld utiliza
productor de desarrollo
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testHello(){
rabbitTemplate.convertAndSend("hello","hello world");
}
método convertAndSend: convertir y enviar. Se utiliza para convertir el mensaje en byte y luego enviarlo
- Primer parámetro: el nombre de la cola
- El segundo parámetro: el contenido del mensaje.
Después de ejecutar el productor, encontramos que no hay cola:
porque la creación de esta cola no se crea en el lado del productor sino en el lado del consumidor.
No tiene sentido crear una cola si no hay consumidores
Desarrollar consumidores
@Component
@RabbitListener(queuesToDeclare = @Queue("hello"))
public class HelloCustomer {
@RabbitHandler
public void receive1(String message){
System.out.println("message = " + message);
}
}
El consumidor debe tener una anotación @RabbitListener para escuchar en nombre del consumidor. En este punto, queremos que reciba los mensajes en la cola de saludo, pero esta cola aún no existe, por lo que usamos queuesToDeclare para declarar una cola aquí.
Entonces, ¿cómo obtenemos los mensajes en la cola? Podemos crear un método arbitrariamente y usar la anotación @RabbitHandler en él para representar el método de devolución de llamada para tomar mensajes de la cola.Podemos obtener el mensaje a través de los parámetros de este método de devolución de llamada.
Luego ejecutamos y descubrimos:
la cola creada en este modo es persistente de forma predeterminada, entonces, ¿cómo establecemos si es exclusiva o se elimina automáticamente?
Podemos usar la anotación @Queue:
La cola creada de forma predeterminada es persistente, no exclusiva y no se elimina automáticamente.
Uso del modelo de trabajo
productor de desarrollo
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testWork(){
for (int i = 0; i < 10; i++) {
rabbitTemplate.convertAndSend("work","hello work!");
}
}
Desarrollar consumidores
@Component
public class WorkCustomer {
@RabbitListener(queuesToDeclare = @Queue("work"))
public void receive1(String message){
System.out.println("work message1 = " + message);
}
@RabbitListener(queuesToDeclare = @Queue("work"))
public void receive2(String message){
System.out.println("work message2 = " + message);
}
}
Aquí estamos construyendo múltiples consumidores en una clase. @RabbitListener se usa en clases, y @RabbitListener también se puede usar en métodos
说明:默认在Spring AMQP实现中Work这种方式就是公平调度,如果需要实现能者多劳需要额外配置
Modelo de transmisión fanout
productor de desarrollo
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testFanout() throws InterruptedException {
rabbitTemplate.convertAndSend("logs","","这是日志广播");
}
convertir y enviar:
- Primer parámetro: el nombre del interruptor
- El segundo parámetro: clave de enrutamiento
- El tercer parámetro: el mensaje generado
Del mismo modo, el cambio no está definido en el productor sino en el consumidor. Solo ejecutar el código anterior no creará un cambio de registro
Desarrollar consumidores
@Component
public class FanoutCustomer {
@RabbitListener(bindings = @QueueBinding(
value = @Queue, //创建临时队列
exchange = @Exchange(name="logs",type = "fanout") //绑定的交换机
))
public void receive1(String message){
System.out.println("message1 = " + message);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue, //创建临时队列
exchange = @Exchange(name="logs",type = "fanout") //绑定交换机类型
))
public void receive2(String message){
System.out.println("message2 = " + message);
}
}
Modelo de enrutamiento de ruta
productor de desarrollo
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testDirect(){
rabbitTemplate.convertAndSend("directs","error","error 的日志信息");
}
Desarrollar consumidores
@Component
public class DirectCustomer {
@RabbitListener(bindings ={
@QueueBinding(
value = @Queue(),
key={
"info","error"},
exchange = @Exchange(type = "direct",name="directs")
)})
public void receive1(String message){
System.out.println("message1 = " + message);
}
@RabbitListener(bindings ={
@QueueBinding(
value = @Queue(),
key={
"error"},
exchange = @Exchange(type = "direct",name="directs")
)})
public void receive2(String message){
System.out.println("message2 = " + message);
}
}
Modelo de suscripción de temas (modelo de enrutamiento dinámico)
productor de desarrollo
@Autowired
private RabbitTemplate rabbitTemplate;
//topic
@Test
public void testTopic(){
rabbitTemplate.convertAndSend("topics","user.save.findAll","user.save.findAll 的消息");
}
Desarrollar consumidores
@Component
public class TopCustomer {
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue,
key = {
"user.*"},
exchange = @Exchange(type = "topic",name = "topics")
)
})
public void receive1(String message){
System.out.println("message1 = " + message);
}
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue,
key = {
"user.#"},
exchange = @Exchange(type = "topic",name = "topics")
)
})
public void receive2(String message){
System.out.println("message2 = " + message);
}
}