Весенняя интеграция Redis RPOPLPUSH - PullRequest
0 голосов
/ 05 апреля 2019

Я новичок в Spring Integration & Redis, поэтому приношу свои извинения, если я совершаю наивную ошибку.

Мое требование следующее:

  1. Требуется реализовать очередь сообщений.Для отправки денег пользователю на основе некоторых событий.
  2. Очередь не должна быть изменчивой и обеспечивать атомарность.Если я перезапустил сервер или он вышел из строя, он не должен потерять сообщение о событии.Сюда также входят сообщения, которые в данный момент выполняются.
  3. Очередь должна доставлять сообщение, предоставленное один раз и только один раз.Это будет многопоточная (рабочая) и многосерверная среда.

Мой прогресс до сих пор заключается в настройке Spring Integration и Spring Integration Redis в моем весеннем проекте.Моя конфигурация Spring Integration, как показано ниже -

    <int-redis:queue-outbound-channel-adapter
           id="event-outbound-channel-adapter"
           channel="eventChannelJson"
           serializer="serializer"
           auto-startup="true" connection-factory="redisConnectionFactory"
           queue="my-event-queue" />

    <int:gateway id="eventChannelGateway"
                service-interface="com.test.RedisChannelGateway"
                error-channel="errorChannel" default-request-channel="eventChannel">
       <int:default-header name="topic" value="queue"/>
    </int:gateway>

    <int:channel id="eventChannelJson"/>
    <int:channel id="eventChannel">
       <int:queue/>
    </int:channel>


    <bean id="serializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

    <int:object-to-json-transformer input-channel="eventChannel"
                                   output-channel="eventChannelJson"/>


    <int-redis:queue-inbound-channel-adapter id="event-inbound-channel-adapter"
                                            channel="eventChannelJson" queue="my-event-queue"
                                            serializer="serializer" auto-startup="true"
                                            connection-factory="redisConnectionFactory"/>

    <bean id="serializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

    <int:json-to-object-transformer input-channel="eventChannelJson"
                                   output-channel="eventChannel"
                                   type="com.test.PostPublishedEvent"/>

    <int:service-activator input-channel="eventChannel" ref="RedisEventProcessingService"
                          method="process">
       <int:poller fixed-delay="10" time-unit="SECONDS" max-messages-per-poll="500"/>
    </int:service-activator> 

Я читал статью на аналогичную тему, где они использовали redis RPOPLPUSH для этой цели.Но я не могу понять, как это сделать в Spring Integration.Ссылка на статью - https://redis.io/commands/RPOPLPUSH

Пожалуйста, посоветуйте мне почитать это.Я очень ценю вашу помощь.

1 Ответ

0 голосов
/ 05 апреля 2019

Интеграция Spring не имеет компонента, который использует эту операцию.

Чтобы использовать его, вы должны обернуть RedisTemplate в <int:service-activator/> и вызвать один из его rightPopAndLeftPush() методов.

...