簡體   English   中英

將Activiti作為Grails中的Spring Bean接線

[英]Wiring Activiti as a Spring Bean in Grails

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

我相信我有正確的布線設置,但是當我運行一個調用運行時服務的簡單集成測試時,我得到一個錯誤,Spring無法打開一個休眠會話(參見下面的完整堆棧跟蹤 )。

更新 :我可以使用run-app啟動應用run-app ,然后調用一個調用我的服務的控制器操作,一切正常。 因此,Activiti布線工作,它與Grails集成測試mixin有一些沖突。

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

我的具體(也可能是誤導)問題是,我如何配置我的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

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

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

我們Alephsa正在維護grails activiti插件更新到最新版本的Activiti(5.17),我們正在努力更新到版本6.你可以在bintray上找到插件,也可以使用grails activiti spring安全插件。 在我們的github帳戶中,您可以找到指導您工作的源代碼。

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM