I want to use spring cloud stream for my microservice to handle event from kafka.

I read from one topic that can hold several JSON payloads (I have one topic since its all messages arrived to it are from the same subject). I have different cloud function to handle according to the different payload.

How can I rout the incoming event to specific function based on property in its payload?

Say I have JSON message that can have the following properties:

{
  "type":"A"
  "content": xyz
}

So the input message can have a property A or B

Say I want to call some bean function when the type is A and another bean function when type is B


Solution 1:

It is not clear from the question whether you are using the message channel-based Kafka binder or Kafka Streams binder. The comments above imply some reference to KStream. Assuming that you are using the message channel-based Kafka binder, you have the option of using the message routing feature in Spring Cloud Stream. The basic usage is explained in this section of the docs: https://docs.spring.io/spring-cloud-stream/docs/3.2.1/reference/html/spring-cloud-stream.html#_event_routing

You can provide a routing-expression which is a SpEL expression to pass the right property values.

If you want advanced routing capabilities beyond what can be expressed through a SpEL expression, you can also implement a custom MessageRoutingCallback. See this sample application for more details: https://github.com/spring-cloud/spring-cloud-stream-samples/tree/main/routing-samples/message-routing-callback