根据文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.3.RELEASE/reference/html/spring-cloud-stream.html#_using_streamlistener_for_content_based_routing我可以根据以下条件将传入消息路由到处理程序:
@EnableBinding(MySink.class)
@EnableAutoConfiguration
public static class TestPojoWithAnnotatedArguments {
@StreamListener(target = MySink.INPUT, condition = "headers['type']=='bogey'")
public void receiveBogey(@Payload BogeyPojo bogeyPojo) {
// handle the message
}
@StreamListener(target = MySink.INPUT, condition = "headers['type']=='bacall'")
public void receiveBacall(@Payload BacallPojo bacallPojo) {
// handle the message
}
@StreamListener(target = MySink.ANOTHER_INPUT, condition = "headers['type']=='bacall'")
public void receiveBacall(@Payload BacallPojo bacallPojo) {
// handle the message
}
}
我如何提供没有条件匹配时调用的处理程序?
如果我有2个处理程序,第一个有条件,第二个不带条件,则当第一个条件匹配时,两个处理程序都被调用。我如何避免这种情况?
[我们可能需要修改您所指的部分,因为它已经过时。
而且,我们不能(不应该)基于有效负载类型进行任何类型的路由,因为数据是从有线以byte[]
之类的串行形式传入的。我将在this old post中详细讨论。但是您绝对可以将传入消息的其他部分用作路由条件。建议的最佳实践是依赖消息头。
所以让我们看一下示例:
@Bean
public Function<String, String> uppercase() {
return v -> v.toUpperCase();
}
@Bean
public Function<String, String> lowercase() {
return v -> v.toLowerCase();
}
@Bean
public Function<String, String> reverse() {
return v -> new StringBuilder(v).reverse().toString();
}
。 。实际上是单个routing-expression
属性。您只需要一个表达式,因为无论您的条件多么复杂或简单,都可以使用标准Spring SpEL对其进行编码--spring.cloud.function.routing-expression=headers['type'] == 'upper' ? 'uppercase' : (headers['type'] == 'lower' ? 'lowercase' : ''reverse)
将会发生,将评估名称为type
的传入消息的标头。如果它的值是“ upper”,它将进入“ uppercase”功能;如果将“小写”转换为“小写”,默认设置为“反向”。
希望有所帮助。