2014/03/01 CLR/H in TOKYO #1 Re-Venge WF でワークフロー Ahf(小尾 智之)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
WF でワークフロー
Ahf(小尾 智之)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
self introduction VB 使い WF メイニア CLR/H スタッフ
てすとぶろぐ http://blogahf.blogspot.jp/
@twit_ahf
Tomoyuki.Obi @IT エンジニアライフ 地方からの戯言
プロレス好き DDT / BJW / K-DOJO みちのくプロレス
2014/03/01 CLR/H in TOKYO #1 Re-Venge
https://www.facebook.com/groups/175020096009440/
2014/03/01 CLR/H in TOKYO #1 Re-Venge
agenda
• Workflow Foundation とは
• WF で構築するワークフロー
2014/03/01 CLR/H in TOKYO #1 Re-Venge
Workflow Foundation 概略
2014/03/01 CLR/H in TOKYO #1 Re-Venge
Workflow Foundation #とは
実行基盤
非開発者向け 高い視認性
コンポーネント指向
2014/03/01 CLR/H in TOKYO #1 Re-Venge
これまでの流れ
WF 3.x
WF 4
WF 4.03
WF 4.5
.NET 3.0 の新機能として登場
完全リニューアル。WF 3.x と互換性無
状態遷移フローの復活
バージョニング、アノテーション等追加
WF Manager 基本アクティビティ増加
2014/03/01 CLR/H in TOKYO #1 Re-Venge
アクティビティ / ワークフロー
アクティビティ デザイナー
IIS Workflow Manager
ワークフロー デザイナー
SQL Server VB / C# / PowerShell
2014/03/01 CLR/H in TOKYO #1 Re-Venge
シーケンシャルワークフロー
• 上から下へ制御が流れる • 制御を戻すことはできない
2014/03/01 CLR/H in TOKYO #1 Re-Venge
フローチャートワークフロー
• 制御を自由に設定できる
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ステートマシンワークフロー
• 受注済→発注済→出荷済 というような状態変化を表す
2014/03/01 CLR/H in TOKYO #1 Re-Venge
アクティビティ
• VB や C# / PowerShell Workflow または既存アクティビティを組合せ
• カプセル化した処理=アクティビティ
• アクティビティ=ワークフロー
–ビルドしたワークフローをアクティビティ として利用可能
2014/03/01 CLR/H in TOKYO #1 Re-Venge
アクティビティデザイナー
WPF によるユーザー コントロール作成と同じ
2014/03/01 CLR/H in TOKYO #1 Re-Venge
デザイナーのメリット
WPF 画面の作成と同様 WPF でできることは 同じく実現可能
デザイナー上での入力 プロパティダイアログを 見なくても設定可能
インテリセンス対応 WF 固有の
ExpressionTextbox ではインテリセンス自作可能
2014/03/01 CLR/H in TOKYO #1 Re-Venge
WF サービス
WF サービスプロジェクトの初期状態
メッセージの受信と結果の送信が既に用意されている
間に処理を挟むことで サービスとして作成
2014/03/01 CLR/H in TOKYO #1 Re-Venge
WF と PowerShell
Workflow Foundation
PowerShell Workflow
workflow Get-Sample { Dir }
実行
Xaml に変換
2014/03/01 CLR/H in TOKYO #1 Re-Venge
次世代の WF
Workflow Manager
Workflow のホスティングを行うアプリケーション
オンプレミス/クラウド上を問わずに簡易に ワークフローホスティングを行うアプリケーション
IIS の設定等が不要 セキュリティ要件が厳しめに変更され
WF 4.x アクティビティの一部が利用不可 基本演算を行うアクティビティなどが大量に追加 別名 Azure Workflow Services(ただしアイコンはない)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
WF でワークフロー
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ワークフロー?
• 日本でのワークフローは「稟議申請」 などのドキュメントワークフローが主
• 「申請」「承認」「決裁」など
• 途中の承認経路が所属や内容によって変化
• 申請内容によって経路が変化する事も
特徴:実行される期間が長い
2014/03/01 CLR/H in TOKYO #1 Re-Venge
サンプルの構成
Workflow
WorkflowApplicationクラスを利用
セルフホスト
メールを送付
2014/03/01 CLR/H in TOKYO #1 Re-Venge
承認?
Aさん
Bさん
決裁
申請
却下
承認?
承認ワークフロー
ここで処理の中断が必要
2014/03/01 CLR/H in TOKYO #1 Re-Venge
アクティビティの仕様
• 簡単な承認アクティビティ
• 承認者の情報や結果は変数を利用
• 処理内容
–承認者に稟議内容を書いたメールを飛ばす
–処理の中断(呼び出されるまで待機)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
メールの送信
SDK にサンプルとして用意済み(C# のみ)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ブックマーク
処理状態の一時停止
実行中のインスタンスを永続化
再開指示があるまで待機
しおりをはさむかのように どこまで処理が進んでいるかを記録する
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ブックマークのコード Protected Overloads Overrides Sub Execute( ByVal context As System.Activities.NativeActivityContext) Dim bookName = context.GetValue(Me.BookmarkName) If bookName.Trim = "" Then Return context.CreateBookmark(bookName, New BookmarkCallback(AddressOf OnResume)) End Sub ‘‘‘ <summary>ブックマークから呼ばれるコールバック</summary>
Private Sub OnResume( ByVal context As NativeActivityContext, ByVal bookmark As Bookmark, ByVal value As Object) context.SetValue(Me.HostedValue, value) End Sub ブックマーク名はワークフローの中で
一意でなくてはならない
2014/03/01 CLR/H in TOKYO #1 Re-Venge
Persist と Unload
Persist インスタンスは生存
Unload インスタンスは破棄
どちらで永続化するかの指定は ホスト・アプリケーション側の指定による
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ブックマークからの再開
‘ブックマークからの再開 (WorkflowApplication).ResumeBookmark( "BookmarkName", value)
Args1:再開したいブックマーク名 Args2:引き渡す値
'ワークフローの実行 (WorkflowApplication).Run() executionWFId = (WorkflowApplication).Id 'ワークフローの再読込 (WorkflowApplication).Load(executionWFId)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
引数の受け渡し
ワークフロー開始時にホスト側から引数を受け渡せる
Dim wfApps As WorkflowApplication Dim wfArgs = New Dictionary(Of String, Object) wfApps = New WorkflowApplication(wfFile, wfArgs) wfApps.Run()
Dictionary(String, Object) Args1:引数名(大小文字の区別あり) Args2:引数
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ホストでのイベント
Aborted
OnUnhandled Exception
Completed
wfApps.Aborted = Sub(e As WorkflowApplicationAbortedEventArgs) Console.WriteLine(e.Reason) End Sub
ワークフローの中断
予期せぬ例外発生
ワークフローの終了
2014/03/01 CLR/H in TOKYO #1 Re-Venge
Demo
2014/03/01 CLR/H in TOKYO #1 Re-Venge
カスタマイズ
• 承認者の順序を入れ替える • 新たに承認者を追加する
ワークフロー上アクティビティを追加 / 移動させればよい
2014/03/01 CLR/H in TOKYO #1 Re-Venge
Aさん Bさん
決裁
申請
却下
承認?
こういうのは?
2014/03/01 CLR/H in TOKYO #1 Re-Venge
並行処理なアクティビティ
Parallel アクティビティを利用すると並列な階層を作成できる
中に配置するアクティビティは通常の承認アクティビティをそのまま利用できる
2014/03/01 CLR/H in TOKYO #1 Re-Venge
Demo
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ASP.NET との共用
ASP.NET と共用することで簡単に ワークフローを外部から利用可能にできる
RESTful な API
ResumeBookmark
こまめに Unload することが必要
http://kuma.jp/(id)/(value)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
参考)永続化環境構築
• 永続化用データベース
–データベースは自分で作成
– [Windows]¥Microsoft.NET¥Framework¥v4.0.30319¥SQL¥ja
• SqlWorkflowInstanceStoreSchema.sql
• SqlWorkflowInstanceStoreLogic.sql
• 上記以外は別目的のスクリプトなので未使用
• SqlWorkflowInstanceStoreSchemaUpgrade.sql – WF4 → WF4.5 へのアップデート用
2014/03/01 CLR/H in TOKYO #1 Re-Venge
実行後の状態
2014/03/01 CLR/H in TOKYO #1 Re-Venge
参考)永続化の設定
(WorkflowApplication).InstanceStore = New DurableInstancing.SqlWorkflowInstanceStore([接続文字列])
WorkflowApplication 実行時に 一定の条件を満たすと上記設定にて 指定した永続化ストアに永続化を行う
注:一定の条件 Persist アクティビティの呼び出し 一定時間の待機状態(Delayなど)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
まとめ
• WF を利用するのは簡単
• アイデア次第で使える場面も
• コードで書くのではなく デザイナーで組み合わせる
•使うのは開発者じゃない!
2014/03/01 CLR/H in TOKYO #1 Re-Venge
Appendix
• Workflow Designer Express (http://wfdesignerexpress.codeplex.com/)
• The Activity Designer (http://blogs.msdn.com/b/tilovell/)
• AppFabric Team Blog (http://blogs.msdn.com/b/appfabric/)
• MS 松崎さん Blog (http://blogs.msdn.com/b/tsmatsuz/)
2014/03/01 CLR/H in TOKYO #1 Re-Venge
ご清聴ありがとうございました