2015-11-18 3 views
1

Я сделал своего рода пользовательский Rss-Reader, используя Spring Boot Integration. Он читает мой RSS-канал каждые 5 секунд, и если есть новый элемент, он проходит через некоторые фильтры. Если он остается после фильтрации, на мой смартфон отправляется push-уведомление.Spring Boot Integration feed sleeps из-за неактивности

Это отлично работает, но если на моем канале нет новых элементов RSS в течение нескольких часов (не уверен, сколько именно времени), оно больше не срабатывает, когда через это время появляется новая запись RSS.

Я предполагаю, что мой InboundChannelAdapter переходит в какой-то режим sleep. Кто-нибудь знает, какая именно проблема может быть?

У меня есть InboundChannelAdapter, который читает мой RSS-канал:

@Bean 
@InboundChannelAdapter(value = "feedChannel", 
     poller = @Poller(maxMessagesPerPoll = "100", fixedRate = "5000")) 
public FeedEntryMessageSource feedAdapter() throws MalformedURLException { 
    Authenticator.setDefault(new Authenticator() { 
    return new FeedEntryMessageSource(new URL("an url"), "feedChannel"); 
} 

У меня есть эти MessageChannel и PollerMetaData бобы:

@Bean 
public MessageChannel feedChannel() { 
    return new QueueChannel(500); 
} 

@Bean(name = PollerMetadata.DEFAULT_POLLER) 
public PollerMetadata poller() { 
    PeriodicTrigger trigger = new PeriodicTrigger(10); 
    trigger.setFixedRate(true); 
    PollerMetadata pollerMetadata = new PollerMetadata(); 
    pollerMetadata.setTrigger(trigger); 
    return pollerMetadata; 
} 

И в MessageEndpoint, который принимает RSS уведомления:

@MessageEndpoint 
public static class Endpoint { 

    private RestTemplate restTemplate = new RestTemplate(); 
    private PushbulletConfig pushbulletConfig = new PushbulletConfig(); 

    @ServiceActivator(inputChannel = "feedChannel") 
    public void log(Message<SyndEntry> message) throws Exception { 
     SyndEntry payload = message.getPayload(); 
     //Do something with payload 
    } 
} 

Не уверен, что это r лифтинг, но .jar развернут в контейнере docker, используя плагин se.transmode.gradle:gradle-docker:1.2gradle.

ответ

1
  1. Использование @Poller на @InboundChannelAdapter вам не нужно PollerMetadata.DEFAULT_POLLER. Если у вас нет других пользователей опроса, конечно, без их собственной конфигурации Poller.

  2. Попробуйте использовать fixedDelay вместо fixedRate. Последнее делает эту логику:

    else if (this.fixedRate) { 
        return new Date(triggerContext.lastScheduledExecutionTime().getTime() + this.period); 
    } 
    return new Date(triggerContext.lastCompletionTime().getTime() + this.period); 
    

    Поэтому несколько потоков могут быть заняты. Особенно, когда feed = this.feedFetcher.retrieveFeed(this.feedUrl); реагирует достаточно медленно.

  3. Настройте DEBUG уровень журнала для категории org.springframework.integration и вернитесь к нам с некоторыми журналами по этому вопросу!

+0

Спасибо! Я попробую это и проверю, исправлена ​​ли проблема. Если нет, я обновляю сообщение с помощью журналов. – Kaj

+0

«PollerMetadata.DEFAULT_POLLER» был использован конечной точкой '@ServiceActivator, кстати, но я удалил его и дал ему Poller с помощью' @ Poller' с теми же настройками, что и я, предоставленный '@ InboundChannelAdapter'. Не уверен, было бы лучше определить один и поделиться им между ними. – Kaj

+0

Да, извините. Теперь я вижу, что ваш 'feedChannel' является' QueueChannel'. Это не имеет большого смысла в случае опроса адаптера в качестве начала. С другой стороны ваш 'fixedRate' с' 10ms' очень опасен только для 10 потоков в 'TaskScheduler' по умолчанию. –

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