From 70b6fd1fd3b704355b9528c03ac43d181ee8ae98 Mon Sep 17 00:00:00 2001 From: Athou Date: Thu, 11 Apr 2013 16:50:20 +0200 Subject: [PATCH] disable feeds for a little bit when unable to refresh the feed several times in a row --- pom.xml | 2 +- .../commafeed/backend/feeds/FeedTimer.java | 22 +++++++--- .../commafeed/backend/feeds/FeedUpdater.java | 42 ++++++++++++++----- .../com/commafeed/backend/model/Feed.java | 11 +++++ 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index ea2b1dfd..4db521a4 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ UTF-8 java:openejb/Resource/My DataSource - true + false diff --git a/src/main/java/com/commafeed/backend/feeds/FeedTimer.java b/src/main/java/com/commafeed/backend/feeds/FeedTimer.java index efe26135..0dbb9908 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedTimer.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedTimer.java @@ -20,14 +20,26 @@ public class FeedTimer { @Inject FeedUpdater updater; - // every five seconds + private long count = -1; + + // every seconds @Schedule(hour = "*", minute = "*", second = "*/5", persistent = false) @Lock(LockType.READ) private void timeout() { - double count = feedService.getCount() * 5d / 60d; - List feeds = feedService.findNextUpdatable((int) count); - for (Feed feed : feeds) { - updater.update(feed); + if (count == -1) { + refreshCount(); + } + if (count > 0) { + int updateCount = (int) Math.ceil(count * 5d / 60d); + List feeds = feedService.findNextUpdatable(updateCount); + for (Feed feed : feeds) { + updater.update(feed); + } } } + + @Schedule(hour = "*", minute = "0", persistent = false) + private void refreshCount() { + count = feedService.getCount(); + } } diff --git a/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java b/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java index 21cfbe18..ea673e79 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java @@ -1,6 +1,7 @@ package com.commafeed.backend.feeds; import java.util.Calendar; +import java.util.Date; import java.util.concurrent.TimeUnit; import javax.ejb.AccessTimeout; @@ -10,6 +11,7 @@ import javax.ejb.LockType; import javax.ejb.Stateless; import javax.inject.Inject; +import org.apache.commons.lang.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,23 +37,41 @@ public class FeedUpdater { @Lock(LockType.READ) @AccessTimeout(value = 4, unit = TimeUnit.SECONDS) public void update(Feed feed) { - try { - Feed fetchedFeed = fetcher.fetch(feed.getUrl()); - if (feed.getLink() == null) { - feed.setLink(fetchedFeed.getLink()); - feedService.update(feed); - } - feedEntryService.updateEntries(feed.getUrl(), - fetchedFeed.getEntries()); - feed.setMessage(null); - feed.setErrorCount(0); + try { + + Date now = Calendar.getInstance().getTime(); + Date disabledUntil = feed.getDisabledUntil(); + + if (disabledUntil == null || disabledUntil.before(now)) { + Feed fetchedFeed = fetcher.fetch(feed.getUrl()); + if (feed.getLink() == null) { + feed.setLink(fetchedFeed.getLink()); + feedService.update(feed); + } + feedEntryService.updateEntries(feed.getUrl(), + fetchedFeed.getEntries()); + + feed.setMessage(null); + feed.setErrorCount(0); + feed.setDisabledUntil(null); + } } catch (Exception e) { String message = "Unable to refresh feed " + feed.getUrl() + " : " + e.getMessage(); - log.info(e.getClass() + " " + message); + log.info(e.getClass().getName() + " " + message); feed.setMessage(message); feed.setErrorCount(feed.getErrorCount() + 1); + + int retriesBeforeDisable = 3; + + if (feed.getErrorCount() >= retriesBeforeDisable) { + int disabledMinutes = 10 * (feed.getErrorCount() + - retriesBeforeDisable + 1); + disabledMinutes = Math.min(60, disabledMinutes); + feed.setDisabledUntil(DateUtils.addMinutes(Calendar + .getInstance().getTime(), disabledMinutes)); + } } finally { feed.setLastUpdated(Calendar.getInstance().getTime()); feedService.update(feed); diff --git a/src/main/java/com/commafeed/backend/model/Feed.java b/src/main/java/com/commafeed/backend/model/Feed.java index 92f3c824..4f5f9b2a 100644 --- a/src/main/java/com/commafeed/backend/model/Feed.java +++ b/src/main/java/com/commafeed/backend/model/Feed.java @@ -36,6 +36,9 @@ public class Feed extends AbstractModel { private int errorCount; + @Temporal(TemporalType.TIMESTAMP) + private Date disabledUntil; + @ManyToMany(mappedBy = "feeds") private Set entries = Sets.newHashSet(); @@ -114,4 +117,12 @@ public class Feed extends AbstractModel { this.errorCount = errorCount; } + public Date getDisabledUntil() { + return disabledUntil; + } + + public void setDisabledUntil(Date disabledUntil) { + this.disabledUntil = disabledUntil; + } + }