在Grails中将activity作为Spring Bean连接起来



我正在尝试创建一个使用Activiti作为其流程引擎的Grails应用程序。为此,我希望将主要的activity服务类(RuntimeService, TaskService等)连接为Spring bean。

我相信我的连接设置是正确的,但是当我运行一个调用运行时服务的简单集成测试时,我得到一个错误,Spring无法打开hibernate会话(参见下面的全栈跟踪)。

Update:我可以用run-app启动应用程序,然后调用调用我的服务的控制器动作,这一切都工作了。所以,Activiti连接工作,它只是有一些冲突与Grails集成测试混合。

我真的希望Activiti服务使用与Grails应用程序相同的数据源连接。我假设问题是Activiti试图创建自己的ConnectionHolder实例,而Grails已经有了一个用于集成测试的设置。

我的具体(可能是被误导的)问题是,我如何配置我的Activiti ProcessEngine,使它使用与我的Grails应用程序相同的数据源和hibernate连接?

更普遍的问题是,我如何才能最好地使我的Grails应用程序可以使用Activiti服务?我看过grails的Activiti插件,它的源代码帮助我做到了这一点。然而,我宁愿不使用这个插件;它没有使用最新的活动,它的开发也不是很活跃,而且无论如何它都不是我真正需要的。

全栈跟踪

| Failure:  start approver request(com.package.MyServiceSpec)
|  org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@7f2e1821] for key [org.springframework.jdbc.datasource.LazyConnectionDa
    at grails.test.mixin.integration.IntegrationTestMixin.initIntegrationTest(IntegrationTestMixin.groovy:58)
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
    at org.spockframework.runtime.extension.builtin.JUnitFixtureMethodsExtension$FixtureType$FixtureMethodInterceptor.intercept(JUnitFixtureMethodsExtension.java:145)
    at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:84)
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
    at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:138)
Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@7f2e1821] for key [org.springframework.jdbc.datasource.LazyConn
    ... 7 more
Caused by: java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@7f2e1821] for key [org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy@1b7aeb] bound to thread [main]
    ... 7 more
| Completed 1 integration test, 1 failed in 0m 1s
<标题> resources.groovy h1> 务类
class MyService {
    def foapAuthFoapService
    def processEngine
    def runtimeService
    def repositoryService
    def taskService
    def managementService
    def historyService
    def formService
    /**
    * Start the activiti process.
    * 
    */
    def startRequest(String requester, String subject, String designatedApprover) {
        runtimeService.startProcessInstanceByKey('MyProcess', ["requester": requester, "subject": subject, "designatedApprover": designatedApprover])
    }
}
<标题> Spock测试
    def "start request"() {
        setup:
            def approverRequest = service.startRequest(requester, subject, designatedApprover)
            def variables = runtimeService.getVariables(approverRequest.id) //approverRequest.getProcessVariables()     
        expect:
            approverRequest instanceof ProcessInstance
            variables.entrySet().contailsAll(["designatedApprover": designatedApprover, "requester": requester, "subject": subject].entrySet())
        where:
            requester | subject |   designatedApprover
            "abc123"  | "def456"|   "hij789"
    }

我们alphsa正在维护grails activiti插件更新到最新版本的activiti(5.17),我们正在努力更新到版本6。你也可以在bintray上找到grails activiti spring security插件。在我们的github帐户中,您可以找到源代码来指导您的工作。

问候。

最新更新