Spring Cloud Stream - условие @StremListener - PullRequest
0 голосов
/ 13 апреля 2020

Согласно документации: 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 обработчика, первый с условием, а второй без каких-либо условий, оба обработчика вызываются при совпадении условия первого. Как мне избежать этого?

1 Ответ

0 голосов
/ 13 апреля 2020

Нам, вероятно, нужно изменить раздел, на который вы ссылаетесь, так как он несколько устарел.

Кроме того, мы не можем (не должны) выполнять какие-либо виды маршрутизации на основе типа полезной нагрузки, поскольку данные приходит от провода в сериализованной форме, такой как byte[]. Я подробно обсуждаю это в этом старом посте . Но вы определенно можете использовать другие части входящего сообщения в качестве условия маршрутизации. Рекомендуется использовать заголовки сообщений.

Итак, давайте рассмотрим пример:

@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', оно будет go преобразовано в функцию "uppercase"; если функция «нижний» до «строчной» и значение по умолчанию «обратный».

Надеюсь, это поможет.

...