Directorio artículo
- 1 entorno
- 2 Introducción
- 3 signos mostrados
- 1 Crear un proyecto para agregar flujo RabbitMQ web dependientes
- 2 Configuración RabbitMQ
- receptor de mensajes 3
- 4 envía un mensaje en el RabbitMQ
- 5 Ver Resultados
- Mensaje personalizado Canal 4
- 1 interfaz personalizada
- Receptor 2 personalizada
- pruebas 3 controlador
- 4 la entrada y mensaje de salida (canal acoplado)
- 5 inicio, la visita
- 5 paquete de mensajes
- 6 partición de noticias
- 1 de configuración de particiones noticias
- 2 controlador de configuración
- 3 Acceso
- 4 Si el acceso aleatorio se
- 7 temporizador
- 8 Resumen
1 entorno
- entorno del sistema: win10
- Editor: IDEA
- springcloud: H 版
- Instalación de referencia el artículo RabbitMQ
2 Introducción
Nube Primavera Stream es un marco para la creación de micro-servicios de aplicaciones por mensajes, que ofrece una serie de diferencias escudo abstractos utilizar diferentes tipos de middleware de mensajería, sino que también simplifica en gran medida el uso de primavera integración de middleware de mensajería compleja grado.
Nube Primavera Corriente ofrece aglutinante (responsable de la interacción con el middleware de mensajería)
3 signos mostrados
1 Crear un proyecto para agregar flujo RabbitMQ web dependientes
2 Configuración RabbitMQ
# 其他参数默认配置
spring.rabbitmq.host=你的host
receptor de mensajes 3
// 该注解表示绑定Sink消息通道
@EnableBinding(Sink.class)
public class MsgReceiver {
private static final Logger logger = LoggerFactory.getLogger(MsgReceiver.class);
// 自带 消费者
@StreamListener(Sink.INPUT)
public void receive(Object payload){
logger.info("received: " + payload);
}
}
4 envía un mensaje en el RabbitMQ
5 Ver Resultados
Mensaje personalizado Canal 4
1 interfaz personalizada
public interface MyChannel {
String INPUT = "test-input";
String OUTPUT = "test-output";
// 收
@Input(INPUT)
SubscribableChannel input();
// 发
@Output(OUTPUT)
MessageChannel output();
}
Receptor 2 personalizada
// 绑定自定义消息通道
@EnableBinding(MyChannel.class)
public class MsgReceiver1 {
private static final Logger logger = LoggerFactory.getLogger(MsgReceiver1.class);
// 收
@StreamListener(MyChannel.INPUT)
public void receive(Object payload){
logger.info("received1: " + payload + ":" + new Date());
}
}
pruebas 3 controlador
package com.sundown.stream.controller;
import com.sundown.stream.bean.ChatMessage;
import com.sundown.stream.msg.MyChannel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@RestController
public class HelloController {
@Autowired
MyChannel myChannel;
@GetMapping("/hello")
public void hello(){
String message = "welcome spring cloud stream";
myChannel.output().send(MessageBuilder.withPayload(message).build());
}
}
4 la entrada y mensaje de salida (canal acoplado)
spring.cloud.stream.bindings.test-input.destination=test-topic
spring.cloud.stream.bindings.test-output.destination=test-topic
5 inicio, la visita
5 paquete de mensajes
- paquete de mensajes (fertilizante no se queda extraños campos que quizá no sabe cual el flujo de campo, pero es realmente uno de nosotros)
1 acceso de paquete (paquete de mensaje no se utiliza)
- Inicio
java -jar stream-0.0.1-SNAPSHOT.jar
y
java -jar stream-0.0.1-SNAPSHOT.jar --server.port=8081
ejecución de Accesshttp://localhost:8080/hello
- Los resultados (consumo repetido)
- Ahora no quiero que un mensaje se repite el consumo (suponiendo que el consumidor es un grupo -> varias personas que hacen lo mismo digresión: Distributed -> Una cosa dada a más de una persona a hacer) ¿Hay alguna manera de hacer
un paquete de mensajes de ayuda podemos resolver (especificar la entrada y la salida tiene el sabor de balanceo de carga)
Mensaje de configuración de paquetes 2
spring.cloud.stream.bindings.test-input.destination=test-topic
spring.cloud.stream.bindings.test-output.destination=test-topic
spring.cloud.stream.bindings.test-input.group=gg
spring.cloud.stream.bindings.test-output.group=gg
- Con el fin de verificar si se puede correr y empaquetado de nuevo que el anterior interfaz de acceso con éxito
- Información vació dos consola nuevo interfaz de acceso
6 partición de noticias
- Es a consumir el mismo número de mensaje de ejemplo consumidor está provista de las mismas características de cada uno.
1 de configuración de particiones noticias
- propiedades de configuración
spring.cloud.stream.bindings.test-input.destination=test-topic
spring.cloud.stream.bindings.test-output.destination=test-topic
spring.cloud.stream.bindings.test-input.group=gg
spring.cloud.stream.bindings.test-output.group=gg
# 开启消费分区(消费者上配置)
spring.cloud.stream.bindings.test-input.consumer.partitioned=true
# 消费者实例个数(消费者上配置)
spring.cloud.stream.instance-count=2
# 当前实例下标(消费者上配置)
spring.cloud.stream.instance-index=0
2 controlador de configuración
@RestController
public class HelloController {
@Autowired
MyChannel myChannel;
@GetMapping("/hello")
public void hello(){
String message = "welcome spring cloud stream";
// 先写死
int whichPart = 1;
System.out.println("发送消息:" + message + ",发往分区:" + whichPart);
myChannel.output().send(MessageBuilder.withPayload(message).setHeader("whichPart", whichPart).build());
}
}
3 Acceso
- Embalaje de ejecución
java -jar stream-0.0.1-SNAPSHOT.jar --spring.cloud.stream.instance-index=0
yjava -jar stream-0.0.1-SNAPSHOT.jar --server.port=8081 --spring.cloud.stream.instance-index=0
(no se olvide de apagar la clase de arranque se quejará empaquetar de otro modo)
- visite http: // localhost: 8080 / hola
4 Si el acceso aleatorio se
@GetMapping("/hello")
public void hello(){
String message = "welcome spring cloud stream";
int whichPart = new Random().nextInt(2);
System.out.println("发送消息:" + message + ",发往分区:" + whichPart);
myChannel.output().send(MessageBuilder.withPayload(message).setHeader("whichPart", whichPart).build());
}
- Igual que el anterior paquete de visita
7 temporizador
Aunque las tareas programadas pueden pero para algunas tareas especiales de temporización pueden utilizar corriente + RabbitMQ expresión cron uso más apropiado, como la aplicación de un par de minutos más tarde
RabbitMQ plug-in instalado
1 de configuración
- propiedades
spring.rabbitmq.host=xxx
spring.cloud.stream.bindings.test-input.destination=topic
spring.cloud.stream.bindings.test-output.destination=topic
spring.cloud.stream.rabbit.bindings.test-input.consumer.delayed-exchange=true
spring.cloud.stream.rabbit.bindings.test-output.producer.delayed-exchange=true
#spring.cloud.stream.bindings.test-input.destination=test-topic
#spring.cloud.stream.bindings.test-output.destination=test-topic
#
#spring.cloud.stream.bindings.test-input.group=gg
#spring.cloud.stream.bindings.test-output.group=gg
#
## 开启消费分区(消费者上配置)
#spring.cloud.stream.bindings.test-input.consumer.partitioned=true
## 消费者实例个数(消费者上配置)
#spring.cloud.stream.instance-count=2
## 当前实例下标(消费者上配置)
#spring.cloud.stream.instance-index=0
#
## 生产者配置
#spring.cloud.stream.bindings.test-output.producer.partition-key-expression=headers['whichPart']
## 消费节点数量
#spring.cloud.stream.bindings.test-output.producer.partition-count=2
- canal personalizado
// 绑定自定义消息通道
@EnableBinding(MyChannel.class)
public class MsgReceiver1 {
private static final Logger logger = LoggerFactory.getLogger(MsgReceiver1.class);
// 收
@StreamListener(MyChannel.INPUT)
public void receive(Object payload){
// 添加日期 一会好对比
logger.info("received1: " + payload + ":" + new Date());
}
}
- controlador
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@Autowired
MyChannel myChannel;
@GetMapping("/delay")
public void delay(){
String message = "welcome spring cloud stream";
logger.info("send msg:" + new Date());
// x-delay --> 延迟3s
myChannel.output().send(MessageBuilder.withPayload(message).setHeader("x-delay", 3000).build());
}
}
2 Inicie Access
- Abrir Ver RabbitMQ
- Ver idea de consola
8 Resumen
viene con una corriente de encargo (destino añadido = xxx) y una distinción similar entre el
asentamiento (grupo) repetida de paquetes de consumo de
acceso de paquetes de mensaje a una sola instancia (Ejemplos consumo abierto productor partición número de índice de casos de nodos dispuestos consumo)
Timer RabbitMQ enchufe relevante montado implementos código que se ejecuta trasera (configuración de intercambio de retraso y de destino, y añadir setHeader ( "x-demora" cuando controlador de la transmisión, 3000) 3S retardo)