JBM 3ソースファイルの解読FieldInstantiation実装集合Field

2847 ワード

以前のアプリケーションではノードインイベントでActionHandlerを定義していましたが、Fieldではユーザの検索方法と検索パラメータを定義していて、良いようです^^;しかし、人員検索の方法とパラメータは異なるノードで異なる(方法名、パラメータ個数、パラメータ値)、長期的に考慮すると、人員検索サービスが確認されている場合、人員検索Actionは確認されているため、繰り返し設計する必要はありません.人員検索サービスが現在のニーズを満たすインタフェースを追加できない場合、プロセス定義は必ず新しいバージョンをアップグレードします.人員はActionを探して変更しないことができて、あるいは変更が少ないことができますか?私はできると思います.解決したい問題です.
ユーザが検索するインタフェース、パラメータ、およびパラメータタイプは、反射で解決できます.プロセス定義ActionHandlerのFieldを集合タイプとして定義すると,パラメータタイプが不確定な場合に対応できる.ネットでしばらくぶらぶらしていたが、関連資料が見つからなかった.Jbpmの学習資料は相対的に小さく、多くの問題はソースコードから手をつけるしかなく、ソースコードを見に行くしかなかった.
Instantiatorインタフェースとインプリメンテーションクラスから答えが見つかります.
FieldはListのテストActionHandler

public class FieldOfListTest implements ActionHandler {

	private static final long serialVersionUID = 1L;

	public List<String> parameters;
	
	public void execute(ExecutionContext executionContext) throws Exception {
		System.out.println(parameters);
	}
}

FieldはListのフロー定義部

			<action class="com.jbpm.test.FieldOfListTest">
				<parameters element-type="java.lang.String">
					<parameter>admin</parameter>
					<parameter>manager</parameter>
				</parameters>
			</action>

FieldはMapのテストActionHandler

public class FieldOfMapActionTest implements ActionHandler {

	private static final long serialVersionUID = 1L;

	public Map<String, String> parameters;
	
	public void execute(ExecutionContext executionContext) throws Exception {
		if (parameters != null){
			Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator();
			while(iterator.hasNext()){
				Entry<String, String> entry = iterator.next();
				System.out.println(entry.getKey() + ":" + entry.getValue());
			}
		}
	}

FieldはMapのプロセス定義部分

			<action class="com.jbpm.test.FieldOfMapTest">
				<parameters key-type="java.lang.String" value-type="java.lang.String">
					<parameter>
						<key>role</key>
						<value>ROLE_0</value>
					</parameter>
					<parameter>
						<key>level</key>
						<value>LEVEL_0</value>
					</parameter>
				</parameters>
			</action>

processDefinitionからActionHandlerのクラスメンバーまで、jbpmはクラスを反射して動的ロードを実現し、サポートされるタイプが多く、FieldInstantiatorクラスのgetValue(Class type,Element propertyElement)メソッドを表示することができます.アイデアはいいですが、機能は確かに強いので、集合クラスを定義するときに複数のデータ型をサポートすればいいですね(Map).