繁体   English   中英

如何使用 Spring Cloud Stream 只生成一条消息而没有弃用 @Output,或者关闭轮询?

[英]How do I produce just one message using Spring Cloud Stream w/o deprecated @Output, or turn off polling?

我正在尝试使用 Spring Cloud向 Kafka 发布一条消息,而没有任何弃用的类/方法或注释。 我还希望能够轻松更改有效负载。

因此,为了清楚起见,我试图不使用已弃用的@Output注释,也不使用任何KafkaTemplate

我的配置:

spring:
  cloud:
    stream:
      bindings:
        message-out-0:
          destination: ${spring.application.name}
          producer:
            key:
              serializer:
                type: string
                format: utf-8
                charset: utf-8
            value:
              serializer:
                type: string
                format: utf-8
                charset: utf-8

我的代码 - 到目前为止我尝试过的:

@Component
@RequiredArgsConstructor
public class ApplicationAnnouncer implements CommandLineRunner {
    
    private final MessageService messageService;
    
    @Override
    public void run(String... args) throws Exception {
        messageService.value = "Application started...";
        messageService.message();
    }
}

一种尝试:

@Configuration
public class MessageService {
     public Object value;
     
     @Bean
     public Supplier<Message<?>> message () {
          return () -> MessageBuilder.withPayload(value).build();
     }
}

另一种尝试:

@Configuration
public class MessageService {
     public Object value;
     
     @Bean
     public Supplier<Flux<?>> message () {
          return () -> Flux.fromStream(Stream.generate(() -> {
               try {
                    Thread.sleep(1000);
                    return value;
               } catch (Exception e) {
                    // ignore
               }
               return null;
          })).subscribeOn(Schedulers.elastic()).share();
     }
}

两次尝试在控制台使用者中的输出:

Hello World!
Hello World!
Hello World!
Hello World! // ... Repeated every second

文件指出:

该框架提供了一个默认的轮询机制(回答“谁?”的问题),它将触发供应商的调用,并且默认情况下它会每秒执行一次(回答“多久?”的问题)。

但是如果我不希望它每秒轮询一次呢?

我向 MessageService 提供消息的方式很奇怪......它是配置吗? 或者它是一种服务?

我还没有找到将ONE CUSTOMIZABLE MESSAGE推送到 Kafka 的最基本示例。

您可以使用StreamBridge访问云流绑定:

@Component
@RequiredArgsConstructor
public class ApplicationAnnouncer implements CommandLineRunner {

    private final StreamBridge streamBridge;
    
    @Override
    public void run(String... args) throws Exception {
        streamBridge.send("message-out-0", "Application started...");
    }
}

第一个字符串是从提供函数的 bean 派生的应用程序设置中提供的绑定名称。

您甚至不需要从中派生绑定名称的实际 bean。 在这种情况下,任何名称都可以。


您可以在此处找到一些示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM