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 ofTopology
to print a human readable description. - Allow the framework to call
ConfiguredStreamBuilder::build
for a second time later, and use the second instance of the returned topology to build the application.