1

i want to create a common project (using spring cloud stream) to route messages to different (consumer) projects dynamically according to message content. (rabbitmq as the message broker)

does spring cloud stream support it? if not, any proposed way to accomplish that? thx

JasonS
  • 445
  • 1
  • 5
  • 17

2 Answers2

2

You can achieve that by setting spring.cloud.stream.dynamicDestinations property to a list of destination names (if you know the name beforehand) or keeping it as empty. The BinderAwareChannelResolver takes care of dynamically creating/binding the outbound channel for these dynamic destinations.

There is an out of the box router application available which does the similar thing.

Ilayaperumal Gopinathan
  • 4,099
  • 1
  • 13
  • 12
  • Thanks for your response. rabbitmq has routing key to do the dynamical routing, does spring cloud stream support this? – JasonS Nov 08 '16 at 14:14
  • When setting the `dynamicDestinations`, in case of `rabbit` these destination names are set as routing keys (if partitioning is involved then routing keys are calculated dynamically based on the partiton key expression and the destination names) for the outbound message producer. – Ilayaperumal Gopinathan Nov 08 '16 at 14:30
  • @IlayaperumalGopinathan Sorry I did not understand this completely. Where exactly in code do I specify the dynamic topic name? Does the topic name go into the reply channel name? – Ajay Feb 08 '17 at 17:05
0

You can use StreamBridge with topicname and spring-cloud will bind it with destination automatically in runtime.

@Autowired
private final StreamBridge streamBridge;
  
public void sendDynamically(Message message, String topicName) {
    streamBridge.send(route, topicName);
}

https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#_streambridge_and_dynamic_destinations