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();
}
}