forked from Archives/Athou_commafeed
disable feeds for a little bit when unable to refresh the feed several times in a row
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -15,7 +15,7 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<jpa.datasource.name>java:openejb/Resource/My DataSource</jpa.datasource.name>
|
<jpa.datasource.name>java:openejb/Resource/My DataSource</jpa.datasource.name>
|
||||||
<jpa.show_sql>true</jpa.show_sql>
|
<jpa.show_sql>false</jpa.show_sql>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -20,14 +20,26 @@ public class FeedTimer {
|
|||||||
@Inject
|
@Inject
|
||||||
FeedUpdater updater;
|
FeedUpdater updater;
|
||||||
|
|
||||||
// every five seconds
|
private long count = -1;
|
||||||
|
|
||||||
|
// every seconds
|
||||||
@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false)
|
@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false)
|
||||||
@Lock(LockType.READ)
|
@Lock(LockType.READ)
|
||||||
private void timeout() {
|
private void timeout() {
|
||||||
double count = feedService.getCount() * 5d / 60d;
|
if (count == -1) {
|
||||||
List<Feed> feeds = feedService.findNextUpdatable((int) count);
|
refreshCount();
|
||||||
for (Feed feed : feeds) {
|
}
|
||||||
updater.update(feed);
|
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;
|
package com.commafeed.backend.feeds;
|
||||||
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.ejb.AccessTimeout;
|
import javax.ejb.AccessTimeout;
|
||||||
@@ -10,6 +11,7 @@ import javax.ejb.LockType;
|
|||||||
import javax.ejb.Stateless;
|
import javax.ejb.Stateless;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.time.DateUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -35,23 +37,41 @@ public class FeedUpdater {
|
|||||||
@Lock(LockType.READ)
|
@Lock(LockType.READ)
|
||||||
@AccessTimeout(value = 4, unit = TimeUnit.SECONDS)
|
@AccessTimeout(value = 4, unit = TimeUnit.SECONDS)
|
||||||
public void update(Feed feed) {
|
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);
|
try {
|
||||||
feed.setErrorCount(0);
|
|
||||||
|
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) {
|
} catch (Exception e) {
|
||||||
String message = "Unable to refresh feed " + feed.getUrl() + " : "
|
String message = "Unable to refresh feed " + feed.getUrl() + " : "
|
||||||
+ e.getMessage();
|
+ e.getMessage();
|
||||||
log.info(e.getClass() + " " + message);
|
log.info(e.getClass().getName() + " " + message);
|
||||||
feed.setMessage(message);
|
feed.setMessage(message);
|
||||||
feed.setErrorCount(feed.getErrorCount() + 1);
|
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 {
|
} finally {
|
||||||
feed.setLastUpdated(Calendar.getInstance().getTime());
|
feed.setLastUpdated(Calendar.getInstance().getTime());
|
||||||
feedService.update(feed);
|
feedService.update(feed);
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ public class Feed extends AbstractModel {
|
|||||||
|
|
||||||
private int errorCount;
|
private int errorCount;
|
||||||
|
|
||||||
|
@Temporal(TemporalType.TIMESTAMP)
|
||||||
|
private Date disabledUntil;
|
||||||
|
|
||||||
@ManyToMany(mappedBy = "feeds")
|
@ManyToMany(mappedBy = "feeds")
|
||||||
private Set<FeedEntry> entries = Sets.newHashSet();
|
private Set<FeedEntry> entries = Sets.newHashSet();
|
||||||
|
|
||||||
@@ -114,4 +117,12 @@ public class Feed extends AbstractModel {
|
|||||||
this.errorCount = errorCount;
|
this.errorCount = errorCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Date getDisabledUntil() {
|
||||||
|
return disabledUntil;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDisabledUntil(Date disabledUntil) {
|
||||||
|
this.disabledUntil = disabledUntil;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user