Primavera nube Transmitir notas del estudio

1 entorno

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

Aquí Insertar imagen Descripción

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

Aquí Insertar imagen Descripción

5 Ver Resultados

Aquí Insertar imagen Descripción

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

Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

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)

Aquí Insertar imagen Descripción

  • Inicio java -jar stream-0.0.1-SNAPSHOT.jary
    java -jar stream-0.0.1-SNAPSHOT.jar --server.port=8081ejecución de Accesshttp://localhost:8080/hello
  • Los resultados (consumo repetido)
    Aquí Insertar imagen DescripciónAquí Insertar imagen Descripción
  • 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
    Aquí Insertar imagen Descripción
    Aquí Insertar imagen Descripción
  • Información vació dos consola nuevo interfaz de acceso
    Aquí Insertar imagen Descripción
    Aquí Insertar imagen Descripción

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
    y java -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
    Aquí Insertar imagen Descripción

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
    Aquí Insertar imagen Descripción

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

Aquí Insertar imagen Descripción

  • Abrir Ver RabbitMQ
    Aquí Insertar imagen Descripción
  • Ver idea de consola
    Aquí Insertar imagen Descripción

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)

Publicado 76 artículos originales · ganado elogios 41 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/edtwar/article/details/105155181
Recomendado
Clasificación