mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
disable feeds for a little bit when unable to refresh the feed several times in a row
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user