Как реализовать интеграцию маршрутизатора в Java - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь преобразовать приведенный ниже фрагмент XML в версию Java, оцените любую помощь здесь

<int:router input-channel="channel_in" default-output-channel="channel_default" 
  expression="payload.name" ignore-channel-name-resolution-failures="true">
    <int:mapping value="foo" channel="channel_one" />
    <int:mapping value="bar" channel="channel_two" />
</int:router>

Вот что я сделал для моего конкретного примера

@Router(inputChannel = "routerChannel")
    public String route(Account message) {
        if (message.getType().equals("check")) {
            return "checkChannel";
        } else if (message.getType().equals("credit")) {
            return "creditChannel";
        } 
        return "errorChannel";
}

@Bean
public DirectChannel checkChannel() {
    return new DirectChannel();
}

когда я делаю выше, я вижу ошибку ниже

org.springframework.messaging.MessageDeliveryException: у диспетчера нет подписчиков для приложения канала: 8090.checkChannel '.;

1 Ответ

0 голосов
/ 27 августа 2018

Все пользовательские теги Spring Integration имеют следующее описание:

<xsd:element name="router" type="routerType">
    <xsd:annotation>
        <xsd:documentation>
            Defines a Consumer Endpoint for the
            'org.springframework.integration.router.AbstractMessageProcessingRouter' implementation
            that serves as an adapter for invoking a method on any
            Spring-managed object as specified by the "ref" and "method" attributes.
        </xsd:documentation>
    </xsd:annotation>
</xsd:element>

Итак, становится совершенно ясно, что нам нужна некоторая AbstractMessageProcessingRouter реализация для присутствия в конфигурации Java.

Также в Справочном руководстве есть параграф, такой как this :

Благодаря конфигурации XML и поддержке пространства имен Spring Integration анализаторы XML скрывают, как целевые компоненты объявляются и соединяются вместе. Для конфигурации Java и аннотации важно понимать API-интерфейс Framework для целевых приложений конечного пользователя.

В соответствии с вашим expression="payload.name" нам нужно найти ExpressionEvaluatingRouter, а затем прочитать главу о @Bean конфигурации :

    @Bean
    @Router(inputChannel = "channel_in")
    public ExpressionEvaluatingRouter expressionRouter() {
        ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter("payload.name");
        router.setDefaultOutputChannelName("channel_default");
        router.setChannelMapping("foo", "channel_one");
        router.setChannelMapping("bar", "channel_two");
        return router;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...