mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
update database asynchronously
This commit is contained in:
@@ -2,7 +2,11 @@ package com.commafeed.backend.feeds;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
@@ -12,6 +16,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import com.commafeed.backend.LockMap;
|
import com.commafeed.backend.LockMap;
|
||||||
import com.commafeed.backend.dao.FeedDAO;
|
import com.commafeed.backend.dao.FeedDAO;
|
||||||
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
import com.commafeed.backend.dao.FeedSubscriptionDAO;
|
||||||
|
import com.commafeed.backend.model.ApplicationSettings;
|
||||||
import com.commafeed.backend.model.Feed;
|
import com.commafeed.backend.model.Feed;
|
||||||
import com.commafeed.backend.model.FeedEntry;
|
import com.commafeed.backend.model.FeedEntry;
|
||||||
import com.commafeed.backend.model.FeedPushInfo;
|
import com.commafeed.backend.model.FeedPushInfo;
|
||||||
@@ -46,19 +51,53 @@ public class FeedRefreshUpdater {
|
|||||||
@Inject
|
@Inject
|
||||||
FeedSubscriptionDAO feedSubscriptionDAO;
|
FeedSubscriptionDAO feedSubscriptionDAO;
|
||||||
|
|
||||||
public void updateFeed(Feed feed, Collection<FeedEntry> entries) {
|
private ThreadPoolExecutor pool;
|
||||||
if (entries != null) {
|
|
||||||
List<FeedSubscription> subscriptions = feedSubscriptionDAO
|
@PostConstruct
|
||||||
.findByFeed(feed);
|
public void init() {
|
||||||
for (FeedEntry entry : entries) {
|
ApplicationSettings settings = applicationSettingsService.get();
|
||||||
updateEntry(feed, entry, subscriptions);
|
int threads = Math.max(settings.getBackgroundThreads(), 1);
|
||||||
|
pool = new ThreadPoolExecutor(threads, threads, 0,
|
||||||
|
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
|
||||||
|
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy() {
|
||||||
|
@Override
|
||||||
|
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
|
||||||
|
super.rejectedExecution(r, e);
|
||||||
|
log.info("Thread queue full, executing in own thread.");
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateFeed(Feed feed, Collection<FeedEntry> entries) {
|
||||||
|
pool.execute(new Task(feed, entries));
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Task implements Runnable {
|
||||||
|
|
||||||
|
private Feed feed;
|
||||||
|
private Collection<FeedEntry> entries;
|
||||||
|
|
||||||
|
public Task(Feed feed, Collection<FeedEntry> entries) {
|
||||||
|
this.feed = feed;
|
||||||
|
this.entries = entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (applicationSettingsService.get().isPubsubhubbub()) {
|
@Override
|
||||||
handlePubSub(feed);
|
public void run() {
|
||||||
|
if (entries != null) {
|
||||||
|
List<FeedSubscription> subscriptions = feedSubscriptionDAO
|
||||||
|
.findByFeed(feed);
|
||||||
|
for (FeedEntry entry : entries) {
|
||||||
|
updateEntry(feed, entry, subscriptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (applicationSettingsService.get().isPubsubhubbub()) {
|
||||||
|
handlePubSub(feed);
|
||||||
|
}
|
||||||
|
taskGiver.giveBack(feed);
|
||||||
}
|
}
|
||||||
taskGiver.giveBack(feed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateEntry(Feed feed, FeedEntry entry,
|
private void updateEntry(Feed feed, FeedEntry entry,
|
||||||
|
|||||||
Reference in New Issue
Block a user