Создать источник сообщений для Redis в Spring Integration - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу настроить InboundChannelAdapter таким образом, чтобы он извлекал сообщение из очереди переадресации и передавал его ServiceActivator в аннотациях на основе Java (только предпочитая избегать XML).Я нашел код из документации Spring:

@Bean("someAdapter.source")
@EndpointId("someAdapter")
@InboundChannelAdapter(channel = "channel3", poller = @Poller(fixedDelay = "5000"))
public MessageSource<?> source() {
    return () -> {
        ...
    };
}

Но что я не понимаю, так это то, как я могу вернуть MessageSource путем извлечения данных из очереди redis с помощью redisConnectionFactory?

Другими словамиКак я могу сделать это в аннотациях на основе Java?

  <int-redis:queue-inbound-channel-adapter id="postPublicationInboundAdapter"
                                             connection-factory="redisConnectionFactory"
                                             channel="postPublicationChannel"
                                             error-channel="postPublicationLoggingChannel"
                                             receive-timeout="5000"
                                             queue="archive.post.publication.queue"
                                             serializer="postPublicationJsonRedisSerializer"/>

1 Ответ

0 голосов
/ 21 ноября 2018

Давайте начнем отсюда: https://docs.spring.io/spring-integration/docs/5.0.9.RELEASE/reference/html/overview.html#programming-tips

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

Затем мы открываем XSD для этого <int-redis:queue-inbound-channel-adapter>:

 <xsd:element name="queue-inbound-channel-adapter">
    <xsd:annotation>
        <xsd:documentation>
            Defines a Message Producing Endpoint for the
            'org.springframework.integration.redis.inbound.RedisQueueMessageDrivenEndpoint' for listening a Redis
            queue.
        </xsd:documentation>
    </xsd:annotation>

Так что, похоже, что int-redis:queue-inbound-channel-adapter не MessageSource.Поэтому @InboundChannelAdapter это тупик.Я согласен, что имя элемента XML неверно, но уже слишком поздно его переименовывать.

Отсюда мы также выяснили, что нам нужно иметь дело с RedisQueueMessageDrivenEndpoint.И так как это управляемый сообщениями , с самоуправлением нам не нужны никакие специальные аннотации для этого.Достаточно просто объявить его как боб:

@Bean
RedisQueueMessageDrivenEndpoint redisQueueMessageDrivenEndpoint(RedisConnectionFactory redisConnectionFactory, RedisSerializer<?> serializer) {
    RedisQueueMessageDrivenEndpoint endpoint =
                new RedisQueueMessageDrivenEndpoint("archive.post.publication.queue", redisConnectionFactory);
    endpoint.setOutputChannelName("postPublicationChannel");
    endpoint.setErrorChannelName("postPublicationLoggingChannel");
    endpoint.setReceiveTimeout(5000);
    endpoint.setSerializer(serializer);
    return endpoint;
}
...