Spring Cloud Stream-@StremListener条件

问题描述 投票:0回答:1

根据文档: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个处理程序,第一个有条件,第二个不带条件,则当第一个条件匹配时,两个处理程序都被调用。我如何避免这种情况?

spring-boot spring-cloud spring-cloud-stream spring-amqp
1个回答
0
投票

[我们可能需要修改您所指的部分,因为它已经过时。

而且,我们不能(不应该)基于有效负载类型进行任何类型的路由,因为数据是从有线以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”功能;如果将“小写”转换为“小写”,默认设置为“反向”。

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.