3

これは、grails アプリケーションのアクティビティ ワークフロー タイマー ジョブに関するものです。

期限切れのジョブで Grails アプリを起動すると、ログやドメイン クラスのメソッドなどの通常の Grails 機能に対して例外がスローされます。

例:

Caused by: groovy.lang.MissingPropertyException: No such property: log for class: com.service.common.UtilityService
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:49)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassGetPropertySite.getProperty(PogoMetaClassGetPropertySite.java:50)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:239)
    at com.service.common.UtilityService.insertToQueue(UtilityService.groovy:370)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.activiti.engine.impl.javax.el.BeanELResolver.invoke(BeanELResolver.java:479)
    ... 71 more

これは、Spring STS からアプリを実行している開発環境で発生します。Grails(1.3.6)にはActivitiプラグイン5.8.2を使用しています

Web アプリが完全に起動した後、ジョブ (起動後の時間にスケジュール) が適切に実行され、不足しているプロパティの例外はスローされません。

代わりにを使用してログのプロパティが見つからない問題を修正できますが、private static final log = LogFactory.getLog(this)get メソッドや find メソッドを使用する場合と同様に、ドメイン クラスへの参照はエラーをスローします。

例えば:

Caused by: groovy.lang.MissingMethodException: No signature of method: static com.domain.wr.WorkRequest.read() is applicable for argument types: (java.lang.String) values: [44700]
Possible solutions: getId(), getAt(java.lang.String), setId(java.lang.Long), grep(java.lang.Object), each(groovy.lang.Closure), find(groovy.lang.Closure)
    at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1357)
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1343)
    at groovy.lang.ExpandoMetaClass.invokeStaticMethod(ExpandoMetaClass.java:1082)
    at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
    at com.service.common.UtilityService.insertToQueue(UtilityService.groovy:373)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.activiti.engine.impl.javax.el.BeanELResolver.invoke(BeanELResolver.java:479)
    ... 71 more

アクティビティ構成

Config.groovy

// Added by the Grails Activiti plugin:
activiti {
      processEngineName = "activiti-engine-default"
      databaseType = "oracle"
      deploymentName = appName
      history = "audit" // "none", "activity", "audit" or "full"
      sessionUsernameKey = "username"
      useFormKey = true
      deploymentResources = ["classpath:activiti/escalation/WorkRequest.bpmn20.xml"]

}

Config.properties

activiti.processEngineName =activiti-engine-default
activiti.databaseSchemaUpdate =true 
activiti.jobExecutorActivate =true
activiti.mailServerHost = "mail1.net"
activiti.mailServerPort = 25
activiti.mailServerUsername = ""
activiti.mailServerPassword = ""
activiti.mailServerDefaultFrom = ""

ダウンタイムによりワークフローがタイマー タスクで使用できなくなるため、これによりアプリケーションが強制終了されます。

4

2 に答える 2

1

私は多かれ少なかれ同じ問題を抱えていました、そして私たちの場合、Springインジェクションが終了する前にActivitiがジョブの実行を開始したことが原因でした。そのため、起動時にのみ発生します。ジョブは、まだ存在しないプロパティにアクセスしています。

アプリがブートストラップを終了した後にACT_RU_JOBテーブルのRETRIES_を増やして、ジョブが正常に実行されるかどうかを確認することで、同じ状況にあることを確認できます。

これがあなたの場合である場合、私は唯一のオプションはプラグインをアップグレードすることであり、それでも失敗する場合はバグを作成することだと思います。

于 2013-03-22T09:47:13.500 に答える
0

この問題は解決しました。
1) Config.groovy を編集し、起動時に activiti を無効にします

 activiti {
          processEngineName = "activiti-engine-default"
          databaseType = "oracle"
          disabled = true
          deploymentName = appName
          sessionUsernameKey = "username"
          useFormKey = true
          deploymentResources = []
    }

2) User BootStrap の init メソッドに Activiti オブジェクトの初期化を追加します。

def init = { servletContext ->

    org.springframework.context.ApplicationContext ctx = ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
    def bb = new grails.spring.BeanBuilder(ctx)
    bb.beans {
        //println "Activiti Process Engine Initialization..."
        customDbIdGenerator(com.mycompany.activiti.customDbIdGenerator){
            idBlockSize=CH.config.activiti.idBlockSize?:100
        }
        processEngineConfiguration(org.activiti.spring.SpringProcessEngineConfiguration) {
            processEngineName = CH.config.activiti.processEngineName?:ActivitiConstants.DEFAULT_PROCESS_ENGINE_NAME
            databaseType = CH.config.activiti.databaseType?:ActivitiConstants.DEFAULT_DATABASE_TYPE
            databaseSchemaUpdate = CH.config.activiti.databaseSchemaUpdate ? CH.config.activiti.databaseSchemaUpdate.toString() : ActivitiConstants.DEFAULT_DATABASE_SCHEMA_UPDATE
            deploymentName = CH.config.activiti.deploymentName?:ActivitiConstants.DEFAULT_DEPLOYMENT_NAME
            deploymentResources = CH.config.activiti.deploymentResources?:ActivitiConstants.DEFAULT_DEPLOYMENT_RESOURCES
            jobExecutorActivate = CH.config.activiti.jobExecutorActivate?:ActivitiConstants.DEFAULT_JOB_EXECUTOR_ACTIVATE
                  history = CH.config.activiti.history?:ActivitiConstants.DEFAULT_HISTORY
            mailServerHost = CH.config.activiti.mailServerHost?:ActivitiConstants.DEFAULT_MAIL_SERVER_HOST
            mailServerPort = CH.config.activiti.mailServerPort?:ActivitiConstants.DEFAULT_MAIL_SERVER_PORT
            mailServerUsername = CH.config.activiti.mailServerUsername
            mailServerPassword = CH.config.activiti.mailServerPassword
            mailServerDefaultFrom = CH.config.activiti.mailServerDefaultFrom?:ActivitiConstants.DEFAULT_MAIL_SERVER_FROM
            dataSource = ref("dataSource")
            transactionManager = ref("transactionManager")
            idGenerator= ref("customDbIdGenerator")
        }

          processEngine(org.activiti.spring.ProcessEngineFactoryBean) {
              processEngineConfiguration = ref("processEngineConfiguration")
          }

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

        activitiService(org.grails.activiti.ActivitiService) {
            runtimeService = ref("runtimeService")
            taskService = ref("taskService")
            identityService = ref("identityService")
            formService = ref("formService")
        }
    }
    println "## Registering Beans ##";
    bb.registerBeans(ctx);
    ctx.getBean("processEngine");

    println "Bean Count2 "+ctx.getBeanDefinitionCount();
}

使用される DB ID ジェネレーターはカスタムであり、デフォルトのものに置き換えることができることに注意してください。

于 2013-06-26T08:46:25.463 に答える