4

Activiti 5.5で動作する簡単なSpringの例を取得しようとしていますが、問題が発生しています。%activiti_home%/ apps / apache-tomcat-6.0.32 / webapps/activiti-restの下にあるactivitiで構成されたプロセスエンジンを使用しています。

カスタムのスプリング構成ファイルのインクルードを実行するように、スプリング構成ファイルを変更しました。

<import resource="classpath*:applicationContext*.xml"/> 

applicationContext.xmlファイルをactiviti-rest/WEB-INF/classesフォルダーにデプロイしました。Activitiは正常に起動し、BeanコンストラクターにSystem.out.printlnが表示されるので、Spring構成が読み取られ、Beanが構築されていることがわかります。JavaDelegateを実装するクラス用のSpringBeanを作成し、それにBeanを注入すると、常にnullが発生します。

これが私のSpringConfigです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <bean id="myBean" class="org.bpmn.examples.MyBean"/>
    <bean id="taskBean" class="org.bpmn.examples.GetBeanTest">
            <property name="myBean" ref="myBean"/>
    </bean>
</beans>

これが私のBeanです:

package org.bpmn.examples;

import java.io.Serializable;

public class MyBean implements Serializable {

    public MyBean() {
        super();
        System.out.println("<========================== myBean ===========================>");
        System.out.println("<========================== myBean ===========================>");
        System.out.println("<========================== myBean ===========================>");
    }
    /**
     * 
     */
    private static final long serialVersionUID = -2867207654072787909L;
    Long id;
    String description;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

}

JavaDelegateを実装する私のクラスは次のとおりです。

package org.bpmn.examples;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;

public class GetBeanTest implements JavaDelegate {

    private MyBean myBean;

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        if(myBean == null){
            System.out.println("Bean was null!");
        }else{
            System.out.println("Bean is valid!");
        }

    }

    public void setMyBean(MyBean myBean) {
        this.myBean = myBean;
    }
}

これはすべて私には非常に簡単に思えますが、問題は、ActivitiがJavaServiceタスクで呼び出されているクラスでSpring Beanを使用しておらず、新しいインスタンスを作成していることだと思います。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="TestSpringConfig" name="TestSpringConfig">
    <documentation>Place documentation for the 'TestSpringConfig' process here.</documentation>
    <startEvent id="startevent1" name="Start"></startEvent>
    <serviceTask id="servicetask1" name="BeanTest" activiti:class="org.bpmn.examples.GetBeanTest"></serviceTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="servicetask1"></sequenceFlow>
    <sequenceFlow id="flow2" name="" sourceRef="servicetask1" targetRef="endevent1"></sequenceFlow>
  </process>
</definitions>

ここにあるような単純なもの、またはJPAエンティティとして構成されたもののいずれかでSpring Beanへの参照を取得するにはどうすればよいですか?

いずれか/すべての返信を歓迎します!


2011年6月28日更新:スタンドアロンのStandaloneProcessEngineConfigurationの代わりにSpringProcessEngineConfigurationを使用するようにactiviti-restアプリを変更しようとして、activiti-cfg.jarファイルのactiviti-cfg.xmlファイルを変更し、Tomcatを再起動しました。

xmlファイルを次のように変更します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:tcp://localhost/activiti" />
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>

  <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"/>
  <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
    <property name="processEngineConfiguration" ref="processEngineConfiguration" />
  </bean>

  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>

  <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="databaseSchemaUpdate" value="true" />
    <property name="jobExecutorActivate" value="false" />
  </bean>

  <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
    <property name="processEngineConfiguration" ref="processEngineConfiguration" />
  </bean>

  <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
  <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
  <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
  <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
  <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

</beans>

Tomcatを再起動しても例外は表示されませんが、Explorerを起動してログインしようとすると、次の例外が発生します。

INFO: Server startup in 12011 ms
10:32:02,338  ERROR [extensions.webscripts.AbstractRuntime] Exception from executeScript - redirecting to status template error: 05280000 Wrapped Exception (with status template): null
org.springframework.extensions.webscripts.WebScriptException: 05280000 Wrapped Exception (with status template): null
    at org.springframework.extensions.webscripts.AbstractWebScript.createStatusException(AbstractWebScript.java:742)
    at org.springframework.extensions.webscripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:167)
4

3 に答える 3

13

私のプロジェクトの1つは、春にActivitiを使用しています。JavaDelagateが問題になる可能性があると思います。毎春のBeanで、activitiのサービスタスクから次のように呼び出すことができます。

Beanの定義:

<bean id="exampleBean" class="org.bpmn.examples.ExampleBean"/>

activiti xml:

<serviceTask id="servicetask" name="Example" activiti:expression="${exampleBean.doSomething()}"></serviceTask>

プロセス変数などのパラメータを関数に渡すこともできます。

<serviceTask id="servicetask" name="Example" activiti:expression="${exampleBean.doSomething(processVariable)}"></serviceTask>

私は常にサービスタスクをこのように使用しており、シングルトンBeanに問題はありません。それが役に立てば幸い。私があなたの問題を理解していなかったら、コメントをとってください。

アップデート:

私のプロジェクトでは、組み込みワークフローエンジンのようなアクティビティを使用しています。Activitiは、私のWebアプリケーションで同じapplicationContextを使用します。

私のプロセスエンジン構成:

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="databaseType" value="mssql" />
        <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="databaseSchemaUpdate" value="true" />
        <property name="jobExecutorActivate" value="true" />
        <property name="deploymentResources" value="classpath*:/diagrams/*.bpmn20.xml" />           
    </bean> 


    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>
于 2011-06-28T08:18:11.200 に答える
1

@Autowiredを使用しています

私の依存関係を持ち込むために。JavaDelegateはSpringによってインスタンス化されないため、私は

applicationContext.getAutowireCapableBeanFactory().autowireBean(this);

すべての依存関係をDelegateに注入するDelegateのスーパークラスのコンストラクターで。どこからapplicationContextを取得するのか疑問に思われるかもしれませんが、http://sujitpal.blogspot.com/2007/03/accessing-spring-beans-from-legacy-code.htmlが答えを提供します。

于 2012-02-16T16:23:42.633 に答える
0

私の推測では、activitiは、スプリングコンテナからインスタンスを取得する必要があるという事実を認識していないため、実際には常に新しいインスタンスを作成します。

このリソースをまだチェックしていない場合:

http://www.activiti.org/userguide/index.html#springintegration

多分それはあなたが必要とするものです(すなわちProcessEngineFactoryBean)

于 2011-06-24T22:54:47.967 に答える