disable feeds for a little bit when unable to refresh the feed several times in a row

This commit is contained in:
Athou
2013-04-11 16:50:20 +02:00
parent 36a9a7a795
commit 70b6fd1fd3
4 changed files with 60 additions and 17 deletions

View File

@@ -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<Feed> 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<Feed> feeds = feedService.findNextUpdatable(updateCount);
for (Feed feed : feeds) {
updater.update(feed);
}
}
}
@Schedule(hour = "*", minute = "0", persistent = false)
private void refreshCount() {
count = feedService.getCount();
}
}

View File

@@ -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);

View File

@@ -36,6 +36,9 @@ public class Feed extends AbstractModel {
private int errorCount;
@Temporal(TemporalType.TIMESTAMP)
private Date disabledUntil;
@ManyToMany(mappedBy = "feeds")
private Set<FeedEntry> 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;
}
}