We're using micronaut/kafka-streams. Using this framework in order to create a streams application you build something like this:
@Factory
public class FooTopologyConfig {
@Singleton
@Named
public KStream<String, FooPojo> configureTopology {
return builder.stream("foo-topic-in")
.peek((k,v) -> System.out.println(String.format("key %s, value: %s", k,v))
.to("foo-topic-out");
}
}
This:
- Receives a
ConfiguredStreamBuilder(a very light wrapper aroundStreamsBuilder) - Build and return the stream (we're not actually sure how important returning the stream is, but that's a different question).
ConfiguredStreamBuilder::build() (which invokes the same on StreamsBuilder) is called later by the framework and the returned Topology is not made available for injection by Micronaut.
We want the Topology bean in order to log a description of the topology (via Topology::describe).
Is it safe to do the following?
- Call
ConfiguredStreamBuilder::build(and thereforeStreamsBuilder::build) and use the returned instance ofTopologyto print a human readable description. - Allow the framework to call
ConfiguredStreamBuilder::buildfor a second time later, and use the second instance of the returned topology to build the application.