nimbus (1.2.4) | 2018-01-25 20:02 |
nimbus-sample (1.2.4) | 2018-01-26 17:06 |
jp.ossc.nimbus.service.codemaster.CodeMasterServiceは、CodeMasterFinderデフォルト実装サービスです。
マスターは、jp.ossc.nimbus.service.beancontrol.BeanFlowInvokerFactoryで直接業務フローを呼び出すか、jp.ossc.nimbus.service.ioccall.FacadeCallerを使ってIOC経由でjp.ossc.nimbus.service.beancontrol.BeanFlowInvokerFactoryを業務フローを呼び出すかして、その戻り値をマスターとして、メモリ中で管理します。
マスターとなるオブジェクトに制限はありません。但し、マスターを更新する際に差分だけを更新したい場合(マスターが巨大な場合など)は、PartUpdateインタフェースを実装したクラスである必要があります。
マスターが更新された場合は、更新通知を受け取ることで、業務フローを再度実行してマスターを入れ替える事ができます。
更新通知の受信は、jp.ossc.nimbus.service.jms.JMSMessageConsumerFactoryでJMS経由で受け取るか、jp.ossc.nimbus.service.publish.MessageReceiver経由で通知を受け取る事ができます。
このサービスは、複合的なサービスで、以下のサービスを下位サービスとして使用します。
下位サービスインタフェース | 用途 |
jp.ossc.nimbus.service.beancontrol.BeanFlowInvokerFactory | マスターを生成する業務フローを取得する |
jp.ossc.nimbus.service.ioccall.FacadeCaller | マスターを生成する業務フローをIOC経由で呼び出す。 |
jp.ossc.nimbus.service.jms.JMSMessageConsumerFactory | JMS経由でマスターの更新通知を受け取る。 |
jp.ossc.nimbus.service.publish.MessageReceiver | メッセージ配信経由でマスターの更新通知を受け取る。 |
jp.ossc.nimbus.service.sequence.Sequence | IOC経由で業務フローを呼び出す場合に、呼び出し情報として設定する通番を発行する |
以下に簡単なサービス定義を示します。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <!DOCTYPE server PUBLIC
- "-//Nimbus//DTD Nimbus 1.0//JA"
- "http://nimbus.sourceforge.jp/dtd/nimbus-service_1_0.dtd">
- <server>
- <manager>
- <!-- マスターを取得するCodeMasterFinderサービス -->
- <service name="CodeMasterFinder"
- code="jp.ossc.nimbus.service.codemaster.CodeMasterService">
- <!-- マスターを生成する業務フローを取得するBeanFlowInvokerFactoryサービスのサービス名を設定する -->
- <attribute name="BeanFlowInvokerFactoryServiceName">#BeanFlowInvokerFactory</attribute>
- <!-- マスターの更新通知を受け取るMessageReceiverサービスのサービス名を設定する -->
- <attribute name="MessageReceiverServiceName">#MessageReceiver</attribute>
- <!-- MessageReceiverサービスからマスターの更新通知を受け取るための受信サブジェクトを設定する -->
- <attribute name="Subjects">CodeMaster</attribute>
- <!-- マスター名の配列を設定する -->
- <attribute name="MasterNames">
- JOB_TYPE_MST
- </attribute>
- <depends>BeanFlowInvokerFactory</depends>
- <depends>MessageReceiver</depends>
- </service>
- <!-- 業務フローを生成するBeanFlowInvokerFactoryサービス -->
- <service name="BeanFlowInvokerFactory"
- code="jp.ossc.nimbus.service.beancontrol.DefaultBeanFlowInvokerFactoryService">
- <attribute name="DirPaths">flow</attribute>
- <attribute name="BeanFlowInvokerAccessClass">jp.ossc.nimbus.service.beancontrol.BeanFlowInvokerAccessImpl2</attribute>
- <depends>JDBCTransactionResourceFactory</depends>
- <depends>PersistentManager</depends>
- </service>
- <!-- JDBCコネクションのTransactionResourceを生成するResourceFactoryサービス -->
- <service name="JDBCTransactionResourceFactory"
- code="jp.ossc.nimbus.service.resource.datasource.JdbcConnectionFactoryService">
- <attribute name="ConnectionFactoryServiceName">#ConnectionFactory</attribute>
- <depends>
- <!-- JDBCドライバ経由でコネクションを取得するConnectionFactoryサービス -->
- <service name="ConnectionFactory"
- code="jp.ossc.nimbus.service.connection.JDBCConnectionFactoryService">
- <attribute name="DriverName">org.hsqldb.jdbcDriver</attribute>
- <attribute name="ConnectionURL">jdbc:hsqldb:./localDB</attribute>
- <attribute name="UserName">sa</attribute>
- <attribute name="Password"></attribute>
- <attribute name="AutoCommit">false</attribute>
- </service>
- </depends>
- </service>
- <!-- 永続化を管理するPersistentManagerサービス -->
- <service name="PersistentManager"
- code="jp.ossc.nimbus.service.connection.DefaultPersistentManagerService"/>
- <!-- メッセージ受信サービス -->
- <service name="MessageReceiver"
- code="jp.ossc.nimbus.service.publish.MessageReceiverService">
- <attribute name="ClientConnectionFactoryServiceName">#ClusterClientConnectionFactory</attribute>
- <attribute name="StartReceiveOnStart">true</attribute>
- <depends>#ClusterClientConnectionFactory</depends>
- </service>
- <!-- クラスタクライアントコネクションファクトリサービス -->
- <service name="ClusterClientConnectionFactory"
- code="jp.ossc.nimbus.service.publish.ClusterClientConnectionFactoryService">
- <attribute name="ClusterServiceName">#Cluster</attribute>
- <attribute name="FlexibleConnect">true</attribute>
- <depends>
- <!-- クラスタサービス -->
- <service name="Cluster"
- code="jp.ossc.nimbus.service.keepalive.ClusterService">
- <attribute name="MulticastGroupAddress">239.0.0.10</attribute>
- <attribute name="Client">true</attribute>
- </service>
- </depends>
- </service>
- </manager>
- </server>
マスターを生成する業務フローの例を示す。
- <?xml version="1.0" encoding="Shift_JIS"?>
- <!DOCTYPE flows PUBLIC
- "-//Nimbus//DTD Nimbus Bean Flow 1.0//JA"
- "http://nimbus.sourceforge.jp/dtd/beanflow_1_0.dtd">
- <flows>
- <!-- 業種マスタを読み込む業務フロー -->
- <flow name="JOB_TYPE_MST">
- <!-- JDBC接続のリソース宣言 -->
- <resource name="Connection" service="Nimbus#JDBCTransactionResourceFactory" trancontrol="true"/>
- <!-- マスタ読み込み用のRecordListを定義する -->
- <step name="Master">
- <target><object code="jp.ossc.nimbus.beans.dataset.RecordList"/></target>
- <attribute name="Name">JOB_TYPE_MST</attribute>
- <attribute name="Schema">
- :typeCode,java.lang.String,,,,1
- :jobName,java.lang.String
- </attribute>
- </step>
- <!-- マスタをデータベースから読み込む -->
- <step name="Load">
- <target><service-ref>Nimbus#PersistentManager</service-ref></target>
- <result>
- <invoke name="loadQuery">
- <argument type="java.sql.Connection"><resource-ref>Connection</resource-ref></argument>
- <argument>select TYPE_CODE->{typeCode}, JOB_NAME->{jobName} from JOB_TYPE_MST</argument>
- <argument type="java.lang.Object" nullValue="true"/>
- <argument type="java.lang.Object"><step-ref>Master</step-ref></argument>
- </invoke>
- </result>
- </step>
- </flow>
- </flows>
MessageReceiverを使ってマスターを更新する場合の、更新を通知する側のコード例を示します。
この場合、更新を通知する側にはServerConnectionFactoryサービスが必要です。
- import jp.ossc.nimbus.core.ServiceManagerFactory;
- import jp.ossc.nimbus.service.publish.ServerConnectionFactory;
- import jp.ossc.nimbus.service.publish.ServerConnection;
- import jp.ossc.nimbus.service.codemaster.CodeMasterNotifyBean;
- // ServerConnectionFactoryを取得する
- ServerConnectionFactory scf = (ServerConnectionFactory)ServiceManagerFactory.getServiceObject("ConnectionFactory");
- // ServerConnectionを取得する
- ServerConnection sc = scf.getServerConnection();
- // コードマスタ通知Beanを生成する
- CodeMasterNotifyBean cmnb = new CodeMasterNotifyBean();
- // ServerConnectionを設定する
- cmnb.setServerConnection(sc);
- // 送信サブジェクトを設定する
- cmnb.setSubject("CodeMaster");
- // 更新するマスター名を設定する
- cmnb.setMasterFlowKey("JOB_TYPE_MST");
- // 更新通知を追加する
- cmnb.addMessage();
- // 更新通知を送信する
- cmnb.send();