yawlfoundation / yawl

Yet Another Workflow Language
http://www.yawlfoundation.org
GNU Lesser General Public License v3.0
90 stars 35 forks source link

External Data Gateway cannot be found upon YAWL Engine start-up #607

Closed fmannhardt closed 7 years ago

fmannhardt commented 7 years ago

When using an External Data Gateway via the ExternalPluginsPath parameter, a workitem is started, and restarting the YAWL Engine the Data Gateway cannot be found resulting in the following Exception and the YAWL Engine not starting up at all. :

2017-06-03 22:23:07,218 [FATAL] YEngine :- Failure to restart engine from persistence image org.yawlfoundation.yawl.exceptions.YPersistenceException at org.yawlfoundation.yawl.engine.YWorkItem.restoreDataToNet(YWorkItem.java:346) ~[yawl-lib-4.1.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_131] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0131] at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:196) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] at org.yawlfoundation.yawl.engine.YWorkItem$$_jvst93b1b.restoreDataToNet(YWorkItem$$_jvst93b_1b.java) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YEngineRestorer.restoreWorkItems(YEngineRestorer.java:230) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YEngineRestorer.restoreInstances(YEngineRestorer.java:82) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YEngine.restore(YEngine.java:222) [yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YEngine.initialise(YEngine.java:181) [yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YEngine.getInstance(YEngine.java:141) [yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.interfce.EngineGatewayImpl.(EngineGatewayImpl.java:116) [yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.interfce.interfaceB.InterfaceB_EngineBasedServer.init(InterfaceB_EngineBasedServer.java:76) [yawl-lib-4.1.jar:?] at javax.servlet.GenericServlet.init(GenericServlet.java:158) [servlet-api.jar:3.0.FR] at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5253) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5543) [catalina.jar:7.0.65] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.65] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) [catalina.jar:7.0.65] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) [catalina.jar:7.0.65] at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1263) [catalina.jar:7.0.65] at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1978) [catalina.jar:7.0.65] at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_131] at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_131] at java.lang.Thread.run(Unknown Source) [?:1.8.0_131] Caused by: org.yawlfoundation.yawl.exceptions.YStateException: External data pull failure. at org.yawlfoundation.yawl.elements.YTask.performExternalDataExtraction(YTask.java:1122) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.elements.YTask.getStartingDataSnapshot(YTask.java:1035) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.elements.YTask.prepareDataForInstanceStarting(YTask.java:999) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YWorkItem.restoreDataToNet(YWorkItem.java:342) ~[yawl-lib-4.1.jar:?] ... 30 more 2017-06-03 22:23:07,225 [FATAL] InterfaceB_EngineBasedServer :- Failure to initialise runtime (persistence failure) org.yawlfoundation.yawl.exceptions.YPersistenceException: Failure to restart engine from persistence image at org.yawlfoundation.yawl.engine.YEngine.restore(YEngine.java:236) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YEngine.initialise(YEngine.java:181) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.YEngine.getInstance(YEngine.java:141) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.interfce.EngineGatewayImpl.(EngineGatewayImpl.java:116) ~[yawl-lib-4.1.jar:?] at org.yawlfoundation.yawl.engine.interfce.interfaceB.InterfaceB_EngineBasedServer.init(InterfaceB_EngineBasedServer.java:76) [yawl-lib-4.1.jar:?] at javax.servlet.GenericServlet.init(GenericServlet.java:158) [servlet-api.jar:3.0.FR] at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5253) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5543) [catalina.jar:7.0.65] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.65] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) [catalina.jar:7.0.65] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) [catalina.jar:7.0.65] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) [catalina.jar:7.0.65] at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1263) [catalina.jar:7.0.65] at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1978) [catalina.jar:7.0.65] at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_131] at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_131] at java.lang.Thread.run(Unknown Source) [?:1.8.0_131]

I found that the reason is quite simple. The 'ExternalPluginsPath' property is loaded after the workitems are restored. Thus the Data Gateway is not available. The fix should be a simple as moving the lines:

// set the path to external db gateway plugin classes (if any) String pluginPath = context.getInitParameter("ExternalPluginsPath"); ExternalDBGatewayFactory.setExternalPaths(pluginPath); PredicateEvaluatorFactory.setExternalPaths(pluginPath);

before this part:

// init engine reference _engine = (EngineGateway) context.getAttribute("engine"); if (_engine == null) { Class<? extends YEngine> engineImpl = getEngineImplClass(); boolean persist = getBooleanFromContext("EnablePersistence"); boolean enableHbnStats = getBooleanFromContext("EnableHibernateStatisticsGathering"); _engine = new EngineGatewayImpl(engineImpl, persist, enableHbnStats); _engine.setActualFilePath(context.getRealPath("/")); context.setAttribute("engine", _engine); }

yawlfoundation commented 7 years ago

Yes, right Felix. Fixed in latest update

fmannhardt commented 7 years ago

Thanks