Current state"Accepted"

Discussion thread: here


Release: 2.1

Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).


The original intention of TopologyDescription was to allow users to perform runtime checking. However, large number of users have opted to print or parse the textual representation of the Topology for convenience instead. The problem is the current TopologyDescription relies too heavily on String to represent the Source and Sink Nodes. By returning the underlying object and overriding toString(), users can still leverage TopologyDescription for runtime checks while also preserving the human readable representations of the Topology.

Public Interface

The underlying object for a Source node in TopologyDescription is set of topics or a pattern to match source topics on. Similarly, the underlying object of a Sink node is either the final topic if it is statically determined or the TopicNameExtractor used to the determine the topic. 

public interface TopologyDescription {
	// Other interfaces and variables within TopologyDescription are not shown here.

	interface Source extends Node {
		Set<String> topicSet()

   		Pattern topicPattern();

	interface Sink extends Node {
	    String topic();

		// Add abstract method to return the TopicNameExtractor class in situations where dynamic routing is used.
		// Otherwise, return null.
    	TopicNameExtractor topicNameExtractor();

Proposed Changes

Add the above interface change and add the following to

public final static class Source extends AbstractNode implements TopologyDescription.Source {
	// Other methods and variables are not shown here

	public Set<String> topicSet() {
    	return topics;

	public Pattern topicPattern() {
    	return topicPattern;

public final static class Sink extends AbstractNode implements TopologyDescription.Sink {
	// Other methods and variables are not shown here

	// Output the topic name if dynamic routing is not used. Otherwise, output the toString value of the TopicNameExtractor.
	public TopicNameExtractor topicNameExtractor() {
    	if (topicNameExtractor instanceof StaticTopicNameExtractor) {
        	return null;
 		} else {
        	return topicNameExtractor;

Compatibility, Deprecation, and Migration Plan

Deprecating topics() because it is no longer needed with the addition of topicSet(). In order to get the same functionality, a user can just call topicSet().toString().

Rejected Alternatives

  • No labels