You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2009/03/04 00:19:23 UTC
svn commit: r749834 - in /ode/branches/APACHE_ODE_1.X:
axis2/src/main/java/org/apache/ode/axis2/
bpel-obj/src/main/java/org/apache/ode/bpel/o/
bpel-runtime/src/main/java/org/apache/ode/bpel/engine/
Author: karthick
Date: Tue Mar 3 23:19:23 2009
New Revision: 749834
URL: http://svn.apache.org/viewvc?rev=749834&view=rev
Log:
ODE-538 Letting Go Of Retired Processes
Modified:
ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
Modified: ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java (original)
+++ ode/branches/APACHE_ODE_1.X/axis2/src/main/java/org/apache/ode/axis2/ODEServer.java Tue Mar 3 23:19:23 2009
@@ -22,7 +22,9 @@
import org.apache.axis2.AxisFault;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.collections.map.MultiKeyMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -36,6 +38,7 @@
import org.apache.ode.axis2.httpbinding.HttpExternalService;
import org.apache.ode.bpel.connector.BpelServerConnector;
import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
+import org.apache.ode.bpel.engine.BpelEngineImpl;
import org.apache.ode.bpel.engine.BpelServerImpl;
import org.apache.ode.bpel.engine.CountLRUDehydrationPolicy;
import org.apache.ode.bpel.extvar.jdbc.JdbcExternalVariableModule;
@@ -75,6 +78,7 @@
import javax.xml.namespace.QName;
import java.io.File;
import java.io.FileNotFoundException;
+import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
@@ -406,8 +410,24 @@
__log.debug("Destroying service " + serviceName + " port " + portName);
ODEService service = (ODEService) _services.remove(serviceName, portName);
if (service != null) {
+ // try to clean up the service after itself
try {
- _axisConfig.removeService(service.getAxisService().getName());
+ String axisServiceName = service.getAxisService().getName();
+ AxisService axisService = _axisConfig.getService(axisServiceName);
+ // first, de-allocate its schemas
+ axisService.releaseSchemaList();
+ // then, de-allocate its parameters
+ // the service's wsdl object model is stored as one of its parameters!
+ // can't stress strongly enough how important it is to clean this up.
+ ArrayList<Parameter> parameters = (ArrayList<Parameter>) axisService.getParameters();
+ for (Parameter parameter : parameters) {
+ axisService.removeParameter(parameter);
+ }
+ // now, stop the service
+ _axisConfig.stopService(axisServiceName);
+ // if only this method did a good job of cleaning up after itself
+ _axisConfig.removeService(axisServiceName);
+ _axisConfig.cleanup();
} catch (AxisFault axisFault) {
__log.error("Couldn't destroy service " + serviceName);
}
@@ -632,14 +652,37 @@
private void handleEvent(ProcessStoreEvent pse) {
__log.debug("Process store event: " + pse);
+ ProcessConf pconf;
switch (pse.type) {
case ACTVIATED:
- case RETIRED:
// bounce the process
_server.unregister(pse.pid);
- ProcessConf pconf = _store.getProcessConfiguration(pse.pid);
- if (pconf != null) _server.register(pconf);
- else __log.debug("slighly odd: recevied event " + pse + " for process not in store!");
+ pconf = _store.getProcessConfiguration(pse.pid);
+ if (pconf != null) {
+ _server.register(pconf);
+ } else {
+ __log.debug("slighly odd: recevied event " +
+ pse + " for process not in store!");
+ }
+ break;
+ case RETIRED:
+ // are there are instances of this process running?
+ boolean instantiated = _server.hasActiveInstances(pse.pid);
+ // remove the process
+ _server.unregister(pse.pid);
+ // bounce the process if necessary
+ if (instantiated) {
+ pconf = _store.getProcessConfiguration(pse.pid);
+ if (pconf != null) {
+ _server.register(pconf);
+ } else {
+ __log.debug("slighly odd: recevied event " +
+ pse + " for process not in store!");
+ }
+ } else {
+ // we may have potentially created a lot of garbage, so,
+ // let's hope the garbage collector is configured properly.
+ }
break;
case DISABLED:
case UNDEPLOYED:
@@ -651,6 +694,7 @@
}
}
+
// Transactional debugging stuff, to track down all these little annoying bugs.
private class DebugTxMgr implements TransactionManager {
private TransactionManager _tm;
Modified: ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OAssign.java Tue Mar 3 23:19:23 2009
@@ -62,6 +62,13 @@
public String toString() {
return "{OCopy " + to + "=" + from + "}";
}
+
+ @Override
+ public void dehydrate() {
+ super.dehydrate();
+ to = null;
+ from = null;
+ }
}
public interface LValue {
@@ -253,4 +260,12 @@
return "{PLinkRef " + partnerLink + "!" + isMyEndpointReference + "}";
}
}
+
+ @Override
+ public void dehydrate() {
+ super.dehydrate();
+ for (Copy copy : this.copy) {
+ copy.dehydrate();
+ }
+ }
}
Modified: ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OBase.java Tue Mar 3 23:19:23 2009
@@ -71,4 +71,13 @@
buf.append(_id);
return buf.toString();
}
+
+ public void dehydrate() {
+ if (debugInfo != null) {
+ debugInfo.description = null;
+ debugInfo.extensibilityElements = null;
+ debugInfo = null;
+ }
+
+ }
}
Modified: ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OProcess.java Tue Mar 3 23:19:23 2009
@@ -201,4 +201,19 @@
in.defaultReadObject();
instanceCount++;
}
+
+ @Override
+ public void dehydrate() {
+ super.dehydrate();
+ procesScope.dehydrate();
+ allPartnerLinks.clear();
+ for (OBase obase : _children) {
+ obase.dehydrate();
+ }
+ _children.clear();
+ messageTypes.clear();
+ elementTypes.clear();
+ xsdTypes.clear();
+ xslSheets.clear();
+ }
}
Modified: ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-obj/src/main/java/org/apache/ode/bpel/o/OScope.java Tue Mar 3 23:19:23 2009
@@ -194,5 +194,35 @@
return buf.toString();
}
}
+
+ @Override
+ public void dehydrate() {
+ super.dehydrate();
+ this.activity = null;
+ if (compensatable != null) {
+ compensatable.clear();
+ }
+ if (compensationHandler != null) {
+ compensationHandler.dehydrate();
+ compensationHandler = null;
+ }
+ if (terminationHandler != null) {
+ terminationHandler.dehydrate();
+ terminationHandler = null;
+ }
+ if (eventHandler != null) {
+ eventHandler.dehydrate();
+ eventHandler = null;
+ }
+ if (variables != null) {
+ variables.clear();
+ }
+ if (correlationSets != null) {
+ correlationSets.clear();
+ }
+ if (partnerLinks != null) {
+ partnerLinks.clear();
+ }
+ }
}
Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java Tue Mar 3 23:19:23 2009
@@ -235,6 +235,7 @@
BpelProcess unregisterProcess(QName process) {
BpelProcess p = _activeProcesses.remove(process);
+ __log.debug("Unregister process: serviceId=" + process + ", process=" + p);
if (p != null) {
if (__log.isDebugEnabled())
__log.debug("Deactivating process " + p.getPID());
@@ -251,7 +252,10 @@
}
}
- p.deactivate();
+ // unregister the services provided by the process
+ p.deactivate();
+ // release the resources held by this process
+ p.dehydrate();
}
return p;
}
@@ -259,6 +263,10 @@
boolean isProcessRegistered(QName pid) {
return _activeProcesses.containsKey(pid);
}
+
+ BpelProcess getProcess(QName pid) {
+ return _activeProcesses.get(pid);
+ }
/**
* Register a process with the engine.
Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java Tue Mar 3 23:19:23 2009
@@ -21,6 +21,7 @@
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -847,12 +848,39 @@
}
private void doDehydrate() {
- _oprocess = null;
- _partnerRoles = null;
- _myRoles = null;
- _endpointToMyRoleMap = null;
- _replacementMap = null;
- _expLangRuntimeRegistry = null;
+ if (_oprocess != null) {
+ _oprocess.dehydrate();
+ _oprocess = null;
+ }
+ if (_partnerRoles != null) {
+ _partnerRoles.clear();
+ _partnerRoles = null;
+ }
+ if (_myRoles != null) {
+ _myRoles.clear();
+ _myRoles = null;
+ }
+ if (_endpointToMyRoleMap != null) {
+ _endpointToMyRoleMap.clear();
+ _endpointToMyRoleMap = null;
+ }
+ if (_replacementMap != null) {
+ _replacementMap = null;
+ _expLangRuntimeRegistry = null;
+ }
+ _myEprs = null;
+ if (_partnerChannels != null) {
+ _partnerChannels.clear();
+ _partnerChannels = null;
+ }
+ if (_partnerEprs != null) {
+ _partnerEprs.clear();
+ _partnerEprs = null;
+ }
+ if (_partnerRoles != null) {
+ _partnerRoles.clear();
+ _partnerRoles = null;
+ }
}
private void doHydrate() {
@@ -974,4 +1002,33 @@
return _pconf;
}
+ public boolean hasActiveInstances() {
+ try {
+ _hydrationLatch.latch(1);
+ if (isInMemory() || _engine._contexts.scheduler.isTransacted()) {
+ return hasActiveInstances(getProcessDAO());
+ } else {
+ // If we do not have a transaction we need to create one.
+ try {
+ return (Boolean) _engine._contexts.scheduler.execTransaction(new Callable<Object>() {
+ public Object call() throws Exception {
+ return hasActiveInstances(getProcessDAO());
+ }
+ });
+ } catch (Exception e) {
+ String errmsg = "DbError";
+ __log.error(errmsg, e);
+ return false;
+ }
+ }
+ } finally {
+ _hydrationLatch.release(1);
+ }
+ }
+
+ private boolean hasActiveInstances(ProcessDAO processDAO) {
+ Collection<ProcessInstanceDAO> activeInstances = processDAO.getActiveInstances();
+ return (activeInstances != null && activeInstances.size() > 0);
+ }
+
}
Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java?rev=749834&r1=749833&r2=749834&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java Tue Mar 3 23:19:23 2009
@@ -19,6 +19,7 @@
package org.apache.ode.bpel.engine;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
@@ -33,6 +34,7 @@
import org.apache.ode.bpel.dao.BpelDAOConnection;
import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
import org.apache.ode.bpel.dao.ProcessDAO;
+import org.apache.ode.bpel.dao.ProcessInstanceDAO;
import org.apache.ode.bpel.evt.BpelEvent;
import org.apache.ode.bpel.iapi.BindingContext;
import org.apache.ode.bpel.iapi.BpelEngine;
@@ -467,4 +469,10 @@
public DebuggerContext getDebugger(QName pid) throws BpelEngineException {
return _engine._activeProcesses.get(pid)._debugger;
}
+
+ public boolean hasActiveInstances(QName pid) {
+ BpelProcess process = _engine.getProcess(pid);
+ return process != null ? process.hasActiveInstances() : false;
+ }
+
}