[Mulgara-svn] r1344 - trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed
ronald at mulgara.org
ronald at mulgara.org
Thu Oct 23 13:11:17 UTC 2008
Author: ronald
Date: 2008-10-23 06:11:16 -0700 (Thu, 23 Oct 2008)
New Revision: 1344
Modified:
trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/Delegator.java
trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolver.java
trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolverFactory.java
trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java
Log:
Fix closing of sessions and plug memory leak. The remote sessions and their
factories are now closed at the end of every transaction, instead of at the
time the resolver-factory is closed (which usually isn't until mulgara is
shut down).
Modified: trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/Delegator.java
===================================================================
--- trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/Delegator.java 2008-10-23 13:11:09 UTC (rev 1343)
+++ trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/Delegator.java 2008-10-23 13:11:16 UTC (rev 1344)
@@ -59,4 +59,9 @@
* @throws QueryException There was an error removing data at the remote end.
*/
public void remove(long model, Statements statements) throws ResolverException, QueryException;
+
+ /**
+ * Close the delegator.
+ */
+ public void close();
}
Modified: trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolver.java
===================================================================
--- trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolver.java 2008-10-23 13:11:09 UTC (rev 1343)
+++ trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolver.java 2008-10-23 13:11:16 UTC (rev 1344)
@@ -15,7 +15,9 @@
// Java 2 standard packages
import java.net.*;
import java.util.*;
+import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
// Third party packages
import org.apache.log4j.Logger;
@@ -51,14 +53,10 @@
/** The delegator that resolves the constraint on another server. */
private final Delegator delegator;
- /** A map of servers to sessions. This acts as a cache, and also so we may close the sessions. */
- private Map<URI,Session> serverToSession = new HashMap<URI,Session>();
+ /** our xa-resource */
+ private final XAResource xares;
- /** A collections of session factories. This is so we may close these factories. */
- private Collection<SessionFactory> sessionFactories = new HashSet<SessionFactory>();
-
-
/**
* Construct a Distributed Resolver.
* @param resolverSession the session this resolver is associated with.
@@ -73,6 +71,16 @@
if (resolverSession == null) throw new IllegalArgumentException( "Null \"resolverSession\" parameter");
delegator = new NetworkDelegator(resolverSession);
+
+ xares = new DummyXAResource() {
+ public void commit(Xid xid, boolean onePhase) throws XAException {
+ delegator.close();
+ }
+
+ public void rollback(Xid xid) throws XAException {
+ delegator.close();
+ }
+ };
}
@@ -87,18 +95,13 @@
/**
* Expose a callback object for enlistment by a transaction manager.
- * Uses a dumy xa resource for the moment, but may need to create a fully
- * functional xa resource which is mapped to a session.
*
* @return an {@link XAResource} that can be used by a transaction manager to
* coordinate this resolver's participation in a distributed transaction.
- * For now this is a {@link DummyXAResource} with a 10 second transaction timeout
* @see javax.resource.spi.ManagedConnection#getXAResource
*/
public XAResource getXAResource() {
- return new DummyXAResource(
- 10 // seconds before transaction timeout
- );
+ return xares;
}
@@ -147,7 +150,7 @@
if (constraint == null) throw new IllegalArgumentException();
ConstraintElement modelElement = constraint.getElement(3);
if (!(modelElement instanceof LocalNode)) throw new QueryException("Constraint not set to a distributed model.");
-
+
try {
return delegator.resolve(constraint, (LocalNode)modelElement);
} catch (ResolverException re) {
@@ -156,28 +159,7 @@
}
- /**
- * Close all sessions and factories used by this resolver.
- */
- public void close() {
- for (Session s: serverToSession.values()) {
- try {
- s.close();
- } catch (QueryException qe) {
- logger.error("Exception while closing session", qe);
- }
- }
- for (SessionFactory sf: sessionFactories) {
- try {
- sf.close();
- } catch (QueryException qe) {
- logger.error("Exception while closing session", qe);
- }
- }
- }
-
-
public void abort() {
- // no-op
+ delegator.close();
}
}
Modified: trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolverFactory.java
===================================================================
--- trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolverFactory.java 2008-10-23 13:11:09 UTC (rev 1343)
+++ trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/DistributedResolverFactory.java 2008-10-23 13:11:16 UTC (rev 1344)
@@ -44,9 +44,6 @@
/** Logger. */
private static Logger logger = Logger.getLogger(DistributedResolverFactory.class);
- /** Collection of constructed resolvers. */
- private Collection<DistributedResolver> openResolvers = new HashSet<DistributedResolver>();
-
/** Protocols which are handled by the served resolver. */
private static final Set<String> protocols = new HashSet<String>(Arrays.asList("rmi"));
@@ -71,8 +68,6 @@
* {@inheritDoc ResolverFactory}
*/
public void close() {
- logger.debug("Closing distributed resolvers");
- for (DistributedResolver r: openResolvers) r.close();
}
/**
@@ -125,11 +120,11 @@
) throws ResolverFactoryException {
if (resolverSession == null) throw new IllegalArgumentException("No session provided for the resolver!");
- logger.debug("Creating new distributed resolver");
- if (canWrite) logger.debug("Expecting to write to distributed resolver.");
- DistributedResolver r = new DistributedResolver(resolverSession);
- openResolvers.add(r);
- return r;
+ if (logger.isDebugEnabled()) {
+ logger.debug("Creating new distributed resolver");
+ if (canWrite) logger.debug("Expecting to write to distributed resolver.");
+ }
+ return new DistributedResolver(resolverSession);
}
Modified: trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java
===================================================================
--- trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java 2008-10-23 13:11:09 UTC (rev 1343)
+++ trunk/src/jar/resolver-distributed/java/org/mulgara/resolver/distributed/NetworkDelegator.java 2008-10-23 13:11:16 UTC (rev 1344)
@@ -327,4 +327,23 @@
}
}
+ /**
+ * Close all sessions and factories used by this delegator.
+ */
+ public void close() {
+ for (Session s: sessionCache.values()) {
+ try {
+ s.close();
+ } catch (QueryException qe) {
+ logger.error("Exception while closing session", qe);
+ }
+ }
+ for (SessionFactory sf: factoryCache) {
+ try {
+ sf.close();
+ } catch (QueryException qe) {
+ logger.error("Exception while closing session", qe);
+ }
+ }
+ }
}
More information about the Mulgara-svn
mailing list