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;
+ }
+
}