Java 为什么在这个卡夫卡的例子中我只能看到所有其他的信息?

Java 为什么在这个卡夫卡的例子中我只能看到所有其他的信息?,java,spring,spring-boot,apache-kafka,spring-kafka,Java,Spring,Spring Boot,Apache Kafka,Spring Kafka,我试图修改其中一个,但得到的结果令人困惑——尽管我只为我的频道注册了一个流侦听器,但我只收到每一秒的消息。我怀疑这是由单个kafka分区的默认负载平衡引起的,但我不知道如何确认这一点 docker ps仅显示kafka broker启动的单个实例 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS

我试图修改其中一个,但得到的结果令人困惑——尽管我只为我的频道注册了一个流侦听器,但我只收到每一秒的消息。我怀疑这是由单个kafka分区的默认负载平衡引起的,但我不知道如何确认这一点

docker ps仅显示kafka broker启动的单个实例

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                NAMES
e058697a3bb2        wurstmeister/kafka       "start-kafka.sh"         5 minutes ago       Up 5 minutes        0.0.0.0:9092->9092/tcp                               kafka-uppercase-tx
d001389ddfa4        wurstmeister/zookeeper   "/bin/sh -c '/usr/sb…"   5 minutes ago       Up 5 minutes        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   uppercasetransformer_zookeeper_1
检查kafka console使用者也会生成单一类型的响应,但这一次是BAR-only:

/opt/kafka_2.12-2.1.0/bin # ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic output
BAR
BAR
BAR
BAR
BAR
但是,检查消费者组描述和成员不会显示任何其他消费者,因此我的负载平衡理论在这里失败了:

/opt/kafka_2.12-2.1.0/bin # ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group anonymous.0559a5b9-7876-4523-8e6c-74eb03d305a3

TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                     HOST            CLIENT-ID
input           0          0               0               0               consumer-2-955118a4-3597-48a3-8fdd-3823fc366068 /172.22.0.1     consumer-2
/opt/kafka_2.12-2.1.0/bin # ./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group anonymous.0559a5b9-7876-4523-8e6c-74eb03d305a3 --members

CONSUMER-ID                                     HOST            CLIENT-ID       #PARTITIONS
consumer-2-955118a4-3597-48a3-8fdd-3823fc366068 /172.22.0.1     consumer-2      1
我也看不出主题描述有任何错误:

/opt/kafka_2.12-2.1.0/bin # ./kafka-topics.sh --zookeeper zookeeper:2181 --describe --topic output
Topic:output    PartitionCount:1        ReplicationFactor:1     Configs:
        Topic: output   Partition: 0    Leader: 1001    Replicas: 1001  Isr: 1001
为什么只有每一秒的消息被传送到我的输出通道,我怎么能自己检查呢

kafka-demo.java:

包装演示; 导入java.util.concurrent.AtomicLong; 导入org.slf4j.Logger; 导入org.slf4j.LoggerFactory; 导入org.springframework.cloud.stream.annotation.EnableBinding; 导入org.springframework.cloud.stream.annotation.StreamListener; 导入org.springframework.cloud.stream.messaging.Processor; 导入org.springframework.context.annotation.Bean; 导入org.springframework.integration.annotation.InboundChannelAdapter; 导入org.springframework.integration.annotation.Poller; 导入org.springframework.integration.annotation.ServiceActivator; 导入org.springframework.integration.core.MessageSource; 导入org.springframework.messaging.support.GenericMessage; @EnableBindingProcessor.class 公共类大写转换程序{ 专用静态记录器Logger=LoggerFactory.getLoggerUppercaseTransformer.class; @ServiceActivatorinputChannel=Processor.INPUT,outputChannel=Processor.OUTPUT 公共字符串转换字符串有效负载{ logger.infotransforming有效载荷{},有效载荷; 返回有效载荷.toUpperCase; } 静态类TestSource{ 专用AtomicLongSemaphore=新AtomicLong0L; @豆子 @InboundChannelAdapterchannel=input,轮询器=@PollerfixedDelay=1000 公共消息源sendTestData{ 返回-> { 最终长信号量值=longesmaphore.getAndIncrement; 最终布尔条件=信号量值%2==0; 最终字符串foobar=条件?foo:bar; logger.infosemapherevalue:{},条件:{},foobar:{},信号量值,条件,foobar; 返回新的GenericMessagefoobar; }; } @StreamListenerProcessor.OUTPUT 公共无效接收字符串有效负载{ 接收的logger.infoData:{},有效载荷; } } } 日志:

application-local.yml:

spring:
  cloud:
    stream:
#      bindings:
#        output:
#          destination: xformed
#        test-sink:
#          destination: xformed
#        input:
#          destination: testtock
#        test-source:
#          destination: testtock
      default-binder: kafka

输出通道上有两个使用者—主题绑定和接收服务激活器


默认循环处理交替向服务激活器和主题发送消息。

您的代码片段显示@StreamListener和./kafka-console-consumer.sh脚本的使用。它们是否可能在使用消息时相互干扰?当只有一个侦听器处于活动状态时,也会出现相同的情况。另外,另一个列表显示只有一个组成员,因此即使有多个侦听器,也应该对它们进行处理。作为多个侦听器组,我看不出这两个消费者来自哪里。您能详细说明一下吗?这两个消费者是您的接收方法,活页夹创建了一个消费者,该消费者通过绑定将记录发送给卡夫卡。消息将交替发送到每个服务器。如果要在同一应用程序中使用,则需要一个到输出主题的输入绑定。如果删除receive方法,您将在控制台使用者中看到所有消息。为什么首先自动创建输出通道的使用者?我看不出为什么绑定器应该创建出站频道的自动竞价。然后,我如何在应用程序的不同模块中使用消息?这就是我以@StreamListener的形式提供入站消息通道的原因,这就是重点;将消息发送到频道,框架将其发送到卡夫卡主题。通过在那里添加入站通道适配器,您正在滥用该框架-您正在绕过绑定器发送到该通道。通常,绑定从代理接收消息并将其发送到通道,您在该通道上有一个流侦听器。
spring:
  cloud:
    stream:
#      bindings:
#        output:
#          destination: xformed
#        test-sink:
#          destination: xformed
#        input:
#          destination: testtock
#        test-source:
#          destination: testtock
      default-binder: kafka