2014-03-12 45 views
4

我正在嘗試創建一個使用Activiti作爲其流程引擎的Grails應用程序。爲此,我希望主要的Activiti服務類(RuntimeService,TaskService等)作爲Spring bean進行連線。將Activiti連接爲Grails中的Spring Bean

我相信我有正確的接線安裝,但是當我運行一個簡單的集成測試調用運行時服務,我得到一個錯誤是,Spring無法打開Hibernate的Session(見完整的堆棧跟蹤,下面)。

更新:我可以用run-app啓動應用程序,然後調用一個調用我的服務的控制器動作,它都可以工作。因此,Activiti線路的工作原理與Grails集成測試mixin僅有一些衝突。

我確實希望Activiti服務使用與Grails應用程序相同的數據源連接。我假設問題在於Activiti正試圖創建自己的ConnectionHolder實例,當時Grails已經有了一個集成測試的設置。

我的具體(可能是錯誤的)問題是,我如何配置我的Activiti ProcessEngine,以便它使用與我的Grails應用程序相同的數據源和hibernate連接?

更一般的問題是,我如何最好地使Activiti服務可用於我的Grails應用程序?我看過the Activiti plugin for 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 [[email protected]] 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 [[email protected]] for key [org.springframework.jdbc.datasource.LazyConn 
    ... 7 more 
Caused by: java.lang.IllegalStateException: Already value [[email protected]] for key [or[email protected]1b7aeb] bound to thread [main] 
    ... 7 more 
| Completed 1 integration test, 1 failed in 0m 1s 

resources.groovy

import org.activiti.engine.ProcessEngine 
import org.activiti.spring.ProcessEngineFactoryBean 
import org.activiti.explorer.form.* 
import org.activiti.spring.SpringProcessEngineConfiguration 
import grails.util.Environment 
//These imports are only needed in the test environment for building an h2 database for activiti during unit tests 
import org.springframework.jdbc.datasource.DataSourceTransactionManager 
import org.springframework.jdbc.datasource.SimpleDriverDataSource 

beans = {    
    processEngineConfig(SpringProcessEngineConfiguration) { 
     dataSource = ref('dataSource') 
     transactionManager = ref('transactionManager') 
     databaseType = 'oracle' 
     databaseSchema = 'OURSCHEMA' 
     databaseSchemaUpdate = false 
     jobExecutorActivate = true 
    } 

    processEngine(ProcessEngineFactoryBean) { 
     processEngineConfiguration = ref("processEngineConfig") 
    } 

    runtimeService(processEngine: "getRuntimeService") 
    repositoryService(processEngine: "getRepositoryService") 
    taskService(processEngine: "getTaskService") 
    managementService(processEngine: "getManagementService") 
    historyService(processEngine: "getHistoryService") 
    formService(processEngine: "getFormService") 
} 

服務類

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]) 
    } 
} 

斯波克測試

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" 
    } 

回答

2

我們在Alephsa正在維護Grails Activiti插件更新到最新版本的Activiti(5.17),我們正在努力升級到第6版。您還可以在grails activiti spring security插件中找到插件bintray。在我們的github帳戶中,您可以找到源代碼來指導您的工作。

問候。