java
  • spring
  • spring-integration
  • 2015-01-06 4 views 1 likes 
    1

    У меня есть конфигурация для чтения данных из БД с использованием jdbc:inbound-channel-adapter. Конфигурация:Весна Интеграция: Poller действует weird

    <int-jdbc:inbound-channel-adapter query="SELECT * FROM requests WHERE processed_status = '' OR processed_status IS NULL LIMIT 5" channel="requestsJdbcChannel" 
        data-source="dataSource" update="UPDATE requests SET processed_status = 'INPROGRESS', date_processed = NOW() WHERE id IN (:id)" > 
          <int:poller fixed-rate="30000" /> 
        </int-jdbc:inbound-channel-adapter> 
    
        <int:splitter input-channel="requestsJdbcChannel" output-channel="requestsQueueChannel"/> 
    
        <int:channel id="requestsQueueChannel"> 
          <int:queue capacity="1000"/> 
        </int:channel> 
    
        <int:chain id="requestsChain" input-channel="requestsQueueChannel" output-channel="requestsApiChannel"> 
          <int:poller max-messages-per-poll="1" fixed-rate="1000" /> 
        . 
        . 
        </int:chain> 
    

    В описанной выше конфигурации, я определил Poller с JDBC fixed-rate в 30 секунд. Когда есть прямой канал вместо requestsQueueChannel, запрос выбора получает только 5 строк (так как я использую ограничение строк в select query) и ждет еще 30 секунд для следующего опроса.

    Но после того, как я представил requestsQueueChannel с очередью и добавил poller внутри requestsChain, jdbc-inbound не работает должным образом. Он не ждет еще 30 секунд для следующего опроса. Иногда он дважды проверяет БД в строке (в течение секунды), как если бы выполнялось 2 потока и получалось два набора строк из БД. Однако нет асинхронной передачи обслуживания, кроме указанных выше.

    Мое понимание состоит в том, что даже если есть requestsQueueChannel, то после выполнения запроса выбора он должен подождать еще 30 секунд для опроса БД. Есть что-то, чего я не вижу? Я просто хочу понять поведение этой конфигурации.

    +0

    Учитывая, что это происходит дважды, это звучит так: http://stackoverflow.com/questions/25184355/how-to-prevent-duplicate-spring-integration-service-activations-when-polling-dir – Steve

    +0

    Я думаю, что это не проблема здесь, поскольку прямой канал не имеет этой проблемы.Более того, он не читает дубликатов. Полллер работает в последовательности, а не 30 секунд. – nebula

    +0

    Именно так себя ведут участники, если вы случайно загрузили свою конфигурацию в 2 контекста (web и root). Он не будет загружать дубликаты, потому что он обновляет 'обработанный_status' в базе данных, чтобы предотвратить это. Вы абсолютно уверены, что у вас нет двух контекстов? – Steve

    ответ

    0

    Вопрос о Весенних интеграции пуллеров активации два раза, как если бы они 2 нитки, это в основном та же проблема, я наткнулся здесь, с файловой системой пуллеров:

    How to prevent duplicate Spring Integration service activations when polling directory

    Видимо это относительно общая неправильная конфигурация, где контексты Spring и сервлета загружают конфигурацию Spring Integration. В результате этого действительно есть две нити, и, как видно, активисты активируются дважды в течение периода опроса. Обычно в течение нескольких секунд друг от друга, поскольку каждый из них запускается, когда загружается его контекст.

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

    Сначала определите веб-конфигурацию, которая только подбирает классы под «веб-пакетом».

    @Configuration 
    @ComponentScan(basePackages = { "com.myapp.web" }) 
    @EnableWebMvc 
    public class WebConfig extends WebMvcConfigurerAdapter { 
        @Override 
        public void configureDefaultServletHandling(
          DefaultServletHandlerConfigurer configurer) { 
         configurer.enable(); 
        } 
    } 
    

    Создание отдельных классов конфигурации корневой для загрузки зерна, таких как услуги и хранилища, которые не принадлежат в контексте сервлета. Один из них должен загрузить конфигурацию Spring Integration. т.е .:

    @Configuration 
    @ComponentScan(basePackages = { "com.myapp.eip" }) 
    @ImportResource(value = { "classpath:META-INF/spring/integration-context.xml"  }) 
    public class EipConfig { 
    } 
    

    Дополнительный фактор в конфигурации, которые имели некоторое время, чтобы работать, что мои сервлет фильтры и конфигурация веб-безопасность необходимы, чтобы быть в корневом контексте, а не в контексте сервлета.

    0

    При использовании DirectChannel следующий опрос не считается до конца текущего.

    При использовании QueueChannel (или исполнителя задачи), полеллер может снова запустить его снова.

    Входящие адаптеры имеют значение max-messages-per-poll по умолчанию, поэтому ваш конфигуратор должен работать должным образом. Можете ли вы разместить журнал DEBUG где-нибудь?

    +0

    Что такое 'fixed-rate =" 30000 "? Я думал, что промежуток времени между двумя последовательными опросами составляет 30 секунд. – nebula

    +0

    По умолчанию используется константа «max-messages-per-poll» с фиксированной процентной ставкой, а poller продолжает вызывать источник до тех пор, пока не будет больше данных, а затем ждет следующего триггера. –

    +0

    Моя ошибка; 'max-messages-per-poll' устанавливается по умолчанию для входящих адаптеров канала. Поэтому вам не нужно устанавливать его. Можете ли вы опубликовать журнал DEBUG где-нибудь? –

    Смежные вопросы