自动装配未打印值时的KStream对象

时间:2018-09-18 04:16:56

标签: apache-kafka apache-kafka-streams spring-kafka

我正在尝试创建kstreams bean并将其自动连接到我的服务中。但是,即使我得到相同的对象,stream.print()也不给出任何值,但是在同一个bean内进行打印仍然有效。我想我没有通过配置获得相同的StreamBuilder。

配置文件

@Configuration
@EnableKafka
@EnableKafkaStreams
public class KafkaStreamsConfiguration {

    @Autowired private KafkaProperties kafkaProperties;

    @Bean(name = KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_CONFIG_BEAN_NAME)
    public StreamsConfig kStreamsConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-streams2");
        props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaProperties.getBootstrapServers());
        props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
        props.put(JsonDeserializer.DEFAULT_KEY_TYPE, String.class);
        props.put(JsonDeserializer.DEFAULT_VALUE_TYPE, String.class);
        return new StreamsConfig(props);
    }

    @Bean
    public KStream<String, String> kStreamJson(StreamsBuilder builder) {
        KStream<String, String> stream = builder.stream("topictest", Consumed.with(Serdes.String(), Serdes.String()));
        //stream.print();
        return stream;
    }

}

服务

这里的打印功能不会引发任何错误,也不会打印任何值

@Service
public class KStreamsService {

    @Autowired
    KStream<String, String> kStream;

    void process() {
        System.out.println("Hai");
        kStream.print();
    }
}

主要

@SpringBootApplication
public class KStreamsApplication {

    @Autowired
    KStreamsService kStreamsService;

    public static void main(String[] args) {
        SpringApplication.run(KStreamsApplication.class, args);
    }

    private void run() {

        kStreamsService.process();

    }
}

我在这里做错什么了吗?

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您在应用程序中在何处调用该run()方法。

但是,在服务中调用stream.print()为时已晚,因为到那时流已经启动了。

这对我有用...

@SpringBootApplication
public class KStreamsApplication {

    @Autowired
    KStreamsService kStreamsService;

    public static void main(String[] args) {
        SpringApplication.run(KStreamsApplication.class, args);
    }

    @Bean
    public ApplicationRunner runner(StreamsBuilderFactoryBean fb) {
        fb.setAutoStartup(false);
        return args -> {
            run();
            fb.start();
        };
    }

    private void run() {

        kStreamsService.process();

    }

}

[KSTREAM-SOURCE-0000000000]: null, foo