You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/17 12:29:50 UTC
[46/50] [abbrv] incubator-taverna-server git commit: Refactoring the
persistence manager so it doesn't use thread-local storage as a cache in a
way that I can't clear.
Refactoring the persistence manager so it doesn't use thread-local
storage as a cache in a way that I can't clear.
Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/commit/d13e9a5d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/tree/d13e9a5d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/diff/d13e9a5d
Branch: refs/heads/master
Commit: d13e9a5db14faf71094dc33fbc29e1cfc3d99a03
Parents: 3465ccf
Author: Donal Fellows <do...@manchester.ac.uk>
Authored: Thu Aug 21 11:08:37 2014 +0100
Committer: Donal Fellows <do...@manchester.ac.uk>
Committed: Thu Aug 21 11:08:37 2014 +0100
----------------------------------------------------------------------
.../master/usage/UsageRecordRecorder.java | 2 -
.../taverna/server/master/utils/JDOSupport.java | 76 +++++++++++++++-----
server-webapp/src/main/webapp/WEB-INF/beans.xml | 15 ++--
3 files changed, 68 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/d13e9a5d/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
----------------------------------------------------------------------
diff --git a/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java b/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
index 52fe73c..12de304 100644
--- a/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
+++ b/server-webapp/src/main/java/org/taverna/server/master/usage/UsageRecordRecorder.java
@@ -155,10 +155,8 @@ public class UsageRecordRecorder extends JDOSupport<UsageRecord> {
return result;
}
- @Override
@PreDestroy
public void close() {
- super.close();
if (writer != null)
writer.close();
}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/d13e9a5d/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
----------------------------------------------------------------------
diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java b/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
index 9bfe8b4..b9cf1e6 100644
--- a/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
+++ b/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java
@@ -9,8 +9,10 @@ import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static org.apache.commons.logging.LogFactory.getLog;
+import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
+import java.util.WeakHashMap;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -37,7 +39,7 @@ import org.springframework.beans.factory.annotation.Required;
*/
public abstract class JDOSupport<T> {
private Class<T> contextClass;
- PersistenceManager pm;
+ private PersistenceManagerBuilder pmb;
/**
* Instantiate this class, supplying it a handle to the class that will be
@@ -51,18 +53,19 @@ public abstract class JDOSupport<T> {
}
/**
- * @param persistenceManagerFactory
+ * @param persistenceManagerBuilder
* The JDO engine to use for managing persistence.
*/
@Required
- public void setPersistenceManagerFactory(
- PersistenceManagerFactory persistenceManagerFactory) {
- pm = persistenceManagerFactory.getPersistenceManagerProxy();
+ public void setPersistenceManagerBuilder(
+ PersistenceManagerBuilder persistenceManagerBuilder) {
+ pmb = persistenceManagerBuilder;
}
- @PreDestroy
- public void close() {
- pm.close();
+ private PersistenceManager pm() {
+ if (isPersistent())
+ return pmb.getPersistenceManager();
+ return null;
}
/**
@@ -72,7 +75,7 @@ public abstract class JDOSupport<T> {
* @return Whether there is a persistence manager installed.
*/
protected boolean isPersistent() {
- return pm != null;
+ return pmb != null;
}
/**
@@ -84,7 +87,7 @@ public abstract class JDOSupport<T> {
*/
@Nonnull
protected Query query(@Nonnull String filter) {
- return pm.newQuery(contextClass, filter);
+ return pm().newQuery(contextClass, filter);
}
/**
@@ -98,7 +101,7 @@ public abstract class JDOSupport<T> {
*/
@Nonnull
protected Query namedQuery(@Nonnull String name) {
- return pm.newNamedQuery(contextClass, name);
+ return pm().newNamedQuery(contextClass, name);
}
/**
@@ -113,7 +116,7 @@ public abstract class JDOSupport<T> {
protected T persist(@Nullable T value) {
if (value == null)
return null;
- return pm.makePersistent(value);
+ return pm().makePersistent(value);
}
/**
@@ -128,7 +131,7 @@ public abstract class JDOSupport<T> {
protected T detach(@Nullable T value) {
if (value == null)
return null;
- return pm.detachCopy(value);
+ return pm().detachCopy(value);
}
/**
@@ -141,7 +144,7 @@ public abstract class JDOSupport<T> {
@Nullable
protected T getById(Object id) {
try {
- return pm.getObjectById(contextClass, id);
+ return pm().getObjectById(contextClass, id);
} catch (Exception e) {
return null;
}
@@ -155,7 +158,7 @@ public abstract class JDOSupport<T> {
*/
protected void delete(@Nullable T value) {
if (value != null)
- pm.deletePersistent(value);
+ pm().deletePersistent(value);
}
/**
@@ -173,9 +176,9 @@ public abstract class JDOSupport<T> {
Object applyTransaction(ProceedingJoinPoint pjp, JDOSupport<?> support)
throws Throwable {
synchronized (lock) {
+ PersistenceManager pm = support.pm();
int id = ++txid;
- Transaction tx = support.pm == null ? null : support.pm
- .currentTransaction();
+ Transaction tx = (pm == null) ? null : pm.currentTransaction();
if (tx != null && tx.isActive())
tx = null;
if (tx != null) {
@@ -217,6 +220,45 @@ public abstract class JDOSupport<T> {
*/
@Target(METHOD)
@Retention(RUNTIME)
+ @Documented
public @interface WithinSingleTransaction {
}
+
+ public static class PersistenceManagerBuilder {
+ private PersistenceManagerFactory pmf;
+ private WeakHashMap<Thread, PersistenceManager> cache = new WeakHashMap<>();
+
+ /**
+ * @param persistenceManagerFactory
+ * The JDO engine to use for managing persistence.
+ */
+ @Required
+ public void setPersistenceManagerFactory(
+ PersistenceManagerFactory persistenceManagerFactory) {
+ pmf = persistenceManagerFactory;
+ }
+
+ @Nonnull
+ public PersistenceManager getPersistenceManager() {
+ if (cache == null)
+ return pmf.getPersistenceManager();
+ Thread t = Thread.currentThread();
+ PersistenceManager pm = cache.get(t);
+ if (pm == null && pmf != null) {
+ pm = pmf.getPersistenceManager();
+ cache.put(t, pm);
+ }
+ return pm;
+ }
+
+ @PreDestroy
+ void clearThreadCache() {
+ WeakHashMap<Thread, PersistenceManager> cache = this.cache;
+ this.cache = null;
+ for (PersistenceManager pm : cache.values())
+ if (pm != null)
+ pm.close();
+ cache.clear();
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/d13e9a5d/server-webapp/src/main/webapp/WEB-INF/beans.xml
----------------------------------------------------------------------
diff --git a/server-webapp/src/main/webapp/WEB-INF/beans.xml b/server-webapp/src/main/webapp/WEB-INF/beans.xml
index af0d8cf..693557a 100644
--- a/server-webapp/src/main/webapp/WEB-INF/beans.xml
+++ b/server-webapp/src/main/webapp/WEB-INF/beans.xml
@@ -62,7 +62,7 @@
<property name="logIncomingWorkflows" value="${default.logworkflows}" />
<property name="allowNewWorkflowRuns" value="${default.permitsubmit}" />
<property name="logOutgoingExceptions" value="${default.logexceptions}" />
- <property name="persistenceManagerFactory" ref="pmf" />
+ <property name="persistenceManagerBuilder" ref="pmb" />
<property name="self" ref="webapp.state" />
</bean>
@@ -179,7 +179,7 @@
<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
<bean class="org.taverna.server.master.identity.UserStore" id="userStore">
- <property name="persistenceManagerFactory" ref="pmf" />
+ <property name="persistenceManagerBuilder" ref="pmb" />
<property name="baselineUserProperties">
<util:properties location="/WEB-INF/security/users.properties" />
</property>
@@ -212,6 +212,9 @@
</props>
</property>
</bean>
+ <bean id="pmb" class="org.taverna.server.master.utils.JDOSupport.PersistenceManagerBuilder">
+ <property name="persistenceManagerFactory" ref="pmf" />
+ </bean>
<bean id="transactionAspect"
class="org.taverna.server.master.utils.JDOSupport.TransactionAspect" />
@@ -245,7 +248,7 @@
<bean id="usageRecordSink" class="org.taverna.server.master.usage.UsageRecordRecorder">
<property name="state" ref="webapp.state" />
<property name="contextualizer" ref="contextualizer" />
- <property name="persistenceManagerFactory" ref="pmf" />
+ <property name="persistenceManagerBuilder" ref="pmb" />
<property name="self" ref="usageRecordSink" />
<property name="disableDB" value="${usage.disableDB}" />
<property name="logFile" value="${usage.logFile}" />
@@ -326,7 +329,7 @@
the subprocess to complete its registration.
</description>
</property>
- <property name="persistenceManagerFactory" ref="pmf" />
+ <property name="persistenceManagerBuilder" ref="pmb" />
<!-- <property name="javaBinary"> <description>The name of the java executable
used to run the server worker. Defaults to the executable used to run the
hosting environment.</description> </property> -->
@@ -388,7 +391,7 @@
The implementation of the catalog of workflow runs
supported by the localworker run engine.
</description>
- <property name="persistenceManagerFactory" ref="pmf" />
+ <property name="persistenceManagerBuilder" ref="pmb" />
<property name="facade" ref="worker.rundb" />
</bean>
<task:scheduled-tasks scheduler="taskScheduler">
@@ -451,7 +454,7 @@
<bean id="dispatch.atom" class="org.taverna.server.master.notification.atom.EventDAO">
<property name="expiryAgeDays" value="${atom.lifespan}" />
- <property name="persistenceManagerFactory" ref="pmf" />
+ <property name="persistenceManagerBuilder" ref="pmb" />
<property name="uriBuilderFactory" ref="feed" />
<property name="self" ref="dispatch.atom" />
</bean>