diff --git a/pom.xml b/pom.xml index 51a6d554..3e9168bc 100644 --- a/pom.xml +++ b/pom.xml @@ -31,16 +31,6 @@ true - - jklm.releases - http://mvn.jkeylockmanager.de - - true - - - false - - @@ -244,11 +234,6 @@ joda-time 2.2 - - de.jkeylockmanager - jkeylockmanager - 1.0.0 - net.java.dev.rome diff --git a/src/main/java/com/commafeed/backend/HttpGetter.java b/src/main/java/com/commafeed/backend/HttpGetter.java index 4a264adc..51515e66 100644 --- a/src/main/java/com/commafeed/backend/HttpGetter.java +++ b/src/main/java/com/commafeed/backend/HttpGetter.java @@ -33,6 +33,7 @@ import org.apache.http.conn.ssl.X509HostnameVerifier; import org.apache.http.impl.client.DecompressingHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; +import org.apache.http.impl.client.SystemDefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; @@ -182,7 +183,7 @@ public class HttpGetter { } public static HttpClient newClient() { - DefaultHttpClient client = new DefaultHttpClient(); + DefaultHttpClient client = new SystemDefaultHttpClient(); SSLSocketFactory ssf = new SSLSocketFactory(SSL_CONTEXT, VERIFIER); ClientConnectionManager ccm = client.getConnectionManager(); diff --git a/src/main/java/com/commafeed/backend/feeds/FeedParser.java b/src/main/java/com/commafeed/backend/feeds/FeedParser.java index 6cce1fa8..0f2a413d 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedParser.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedParser.java @@ -76,9 +76,9 @@ public class FeedParser { entry.setGuid(FeedUtils.truncate(item.getUri(), 2048)); entry.setGuidHash(DigestUtils.sha1Hex(item.getUri())); - entry.setUrl(FeedUtils.toAbsoluteUrl( - FeedUtils.truncate(item.getLink(), 2048), - feed.getLink())); + entry.setUrl(FeedUtils.truncate( + FeedUtils.toAbsoluteUrl(item.getLink(), feed.getLink()), + 2048)); entry.setUpdated(validateDate(getUpdateDate(item))); entry.setAuthor(FeedUtils.truncate(item.getAuthor(), 128)); diff --git a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java index c47ec935..28a075fd 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedRefreshUpdater.java @@ -3,9 +3,11 @@ package com.commafeed.backend.feeds; import java.util.Collection; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @@ -26,10 +28,7 @@ import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.pubsubhubbub.SubscriptionHandler; import com.commafeed.backend.services.ApplicationSettingsService; import com.commafeed.backend.services.FeedUpdateService; - -import de.jkeylockmanager.manager.KeyLockManager; -import de.jkeylockmanager.manager.KeyLockManagers; -import de.jkeylockmanager.manager.LockCallback; +import com.google.common.util.concurrent.Striped; @Singleton public class FeedRefreshUpdater { @@ -37,8 +36,6 @@ public class FeedRefreshUpdater { protected static Logger log = LoggerFactory .getLogger(FeedRefreshUpdater.class); - private static final KeyLockManager lockManager = KeyLockManagers.newLock(); - @Inject FeedUpdateService feedUpdateService; @@ -53,7 +50,7 @@ public class FeedRefreshUpdater { @Inject ApplicationSettingsService applicationSettingsService; - + @Inject MetricsBean metricsBean; @@ -61,15 +58,18 @@ public class FeedRefreshUpdater { FeedSubscriptionDAO feedSubscriptionDAO; private ThreadPoolExecutor pool; + private BlockingQueue queue; + private Striped locks; @PostConstruct public void init() { ApplicationSettings settings = applicationSettingsService.get(); int threads = Math.max(settings.getDatabaseUpdateThreads(), 1); log.info("Creating database pool with {} threads", threads); + locks = Striped.lazyWeakLock(threads); pool = new ThreadPoolExecutor(threads, threads, 0, - TimeUnit.MILLISECONDS, new ArrayBlockingQueue( - 100 * threads)); + TimeUnit.MILLISECONDS, + queue = new ArrayBlockingQueue(100 * threads)); pool.setRejectedExecutionHandler(new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { @@ -130,12 +130,16 @@ public class FeedRefreshUpdater { private void updateEntry(final Feed feed, final FeedEntry entry, final List subscriptions) { - lockManager.executeLocked(entry.getGuid(), new LockCallback() { - @Override - public void doInLock() throws Exception { - feedUpdateService.updateEntry(feed, entry, subscriptions); - } - }); + Lock lock = locks.get(entry.getGuid()); + try { + lock.tryLock(1, TimeUnit.MINUTES); + feedUpdateService.updateEntry(feed, entry, subscriptions); + } catch (InterruptedException e) { + log.error("interrupted while waiting for lock for " + feed.getUrl() + + " : " + e.getMessage(), e); + } finally { + lock.unlock(); + } } private void handlePubSub(final Feed feed) { @@ -150,4 +154,8 @@ public class FeedRefreshUpdater { } } + public int getQueueSize() { + return queue.size(); + } + } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java index b2599379..7d975cda 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java @@ -36,6 +36,7 @@ import com.commafeed.backend.dao.UserRoleDAO; import com.commafeed.backend.dao.UserSettingsDAO; import com.commafeed.backend.feeds.FeedFetcher; import com.commafeed.backend.feeds.FeedRefreshTaskGiver; +import com.commafeed.backend.feeds.FeedRefreshUpdater; import com.commafeed.backend.feeds.OPMLExporter; import com.commafeed.backend.feeds.OPMLImporter; import com.commafeed.backend.model.User; @@ -116,6 +117,9 @@ public abstract class AbstractREST { @Inject FeedRefreshTaskGiver taskGiver; + @Inject + FeedRefreshUpdater feedRefreshUpdater; + @PostConstruct public void init() { CommaFeedApplication app = CommaFeedApplication.get(); diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java index 4f6f402f..1673ebe3 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/AdminREST.java @@ -179,7 +179,8 @@ public class AdminREST extends AbstractResourceREST { Map map = ImmutableMap.of("lastMinute", metricsBean.getLastMinute(), "lastHour", metricsBean.getLastHour(), "backlog", - feedDAO.getUpdatableCount()); + feedDAO.getUpdatableCount(), "queue", + feedRefreshUpdater.getQueueSize()); return Response.ok(map).build(); } }