オープンソースCMS「DotNetNuke」のセットアップ
前回はMicrosoft Web Platform Installerを利用して、DotNetNukeとWebMatrixをインストールする方法を紹介した。今回は、DotNetNukeのインストール方法を紹介する。
ブックマークされました!
ブックマークがエラーになりました。もう一度お願いします。

作者 Boris Lublinsky , 翻訳者 伊藤 幸博 投稿日 2009年3月8日
Windows Workflow はビジネスプロセスを実装するための優れたフレームワークです。1つ欠けているのはヒューマンアクティビティ(人的な作業を伴う処理)の直接的なサポートです。この問題を解決するいくつかのアプローチが Microsoft の刊行物 [1 2] に見受けられますが 、一般的に使用できるほど包括的なものではありません。本稿では WF における完全に包括的なヒューマンアクティビティの実装へのアプローチの1つを定義したいと思います。
人間の相互作用をサポートすることの複雑性は複合的な課題を顕在化させます。そのうちのいくつかは以下のようなものです。
これらの課題は業界においては認識されてきており、これらの問題の解決を目指した2つの主要な仕様がもたらされました [3 4]。私たちはその仕様の文書ではなく精神を引き継いだ実装の構築を試みたいと思います。
ソリューション全体の主なコンポーネントを図1に示します。

図1 ソリューションのコンポーネント
ソリューションの中心に作業キューマネージャ (Work Queue Manager) があります。これはシステムの全ユーザの全てのタスクを把握する中央集権型サービスです。人の手による処理を必要とするいずれのワークフロー (Workflow) も(あるいはワークフローを含むサービス/アプリケーションも)、作業キューマネージャにそれらを永続化してシステムの他のコンポーネントが連動できるようにリクエストを送出するカスタムワークフローアクティビティ [5] を呼び出します。これによって作業キューマネージャはワークフローエンジンとヒューマンアクティビティの実行との間を分離するレイヤとなり、ワークフローの実行中にユーザがシステム内に存在しないというケースをサポートします。また作業キューマネージャが中央集権型のサービスであることにより、プロセスがどこから起動されたかによらず全てのタスクを所定のユーザと結びつける事が可能になります。異なるユーザタスクは異なる入力情報を必要としまた異なる出力を行う場合があるため、どのようなリクエストおよびレスポンスも包括的に処理可能とするためワークフローとヒューマンアクティビティの間の通信は XML による入出力となっています。XML を使用することは実装を複雑にする要因になるように思われるかもしれませんが、.Net で実装されている XML シリアル化の優れたサポート [6] によって XML とオブジェクトをマッピングするのは非常に簡単です。作業キュービューア (Work Queue Viewer) はユーザが入力可能な全てのタスクを閲覧することができる GUI アプリケーションです。これは標準的で、名前、種別、優先度、作成情報等のタスクの基本的な要素のみを表示するアプリケーションです。ユーザはこの情報に基づいてキュー内のどのタスクを処理するか決定できます。実際のタスクの処理は指定されたタスクに特有の機能をサポートするタスクアプリケーション (Task Application) によって行われます。作業キューメンテナンス (Work Queue Maintenance) アプリケーションは作業キューマネージャの管理をサポートする UI を提供します。これは既存のヒューマンタスクの表示と修正、履歴の表示などが可能です。最後にヒューマンアクティビティ (Human Activity) は、作業キューマネージャとの通信を実装し、ワークフロー開発者にヒューマンタスク実行のための非常にシンプルなプログラミングモデルを提供するカスタムアクティビティ(補足の "Windows Workflow Foundation コンポーネントモデル" を参照)です。この点から見れば、ユーザの相互作用は通常のサービス呼び出しと違いがありません。
Windows Workflow Foundation コンポーネントモデル
[11] で説明されているように、Windows Workflow Foundation (WWF) の実装は今日のワークフロー実装で優勢となっている実行可能なワークフロー言語(ドメイン言語)とはかなり異なっています。WWF では "プロセスグラフ内のアクティビティは、汎用のプログラミング言語内でそのアクティビティの実行時の振る舞いを実装するコンポーネントとリンクされます。処理言語内の各アクティビティ種別はそれぞれ1つの実装コンポーネントに対応します。例えばウェブサービス呼び出しアクティビティ、ヒューマンタスクアクティビティ、Eメールアクティビティは全て1つの実装コンポーネントに対応します。
結果として、特定のケース(我々のケースではヒューマンタスクアクティビティ)で要求される実行時の振る舞いを実装する新しいアクティビティ種別を導入して WWF を拡張するのは極めて容易になります。このアプローチにより新しいアクティビティの実装による新規構築や既存の処理言語の拡張がかなり簡単になっています。
各コンポーネントの相互作用の全体像をシーケンス図(図2)に示します。

図2 シーケンス図
上記からもわかるように、ソリューション全体には以下の2種類のコンポーネントが含まれます。
本稿ではソリューションの汎用コンポーネントについてのみ説明したいと思います。
先に示したように、作業キューマネージャは中央集権型のサービスです。その機能はデータコントラクトをベースにしており、図3に示す通りになっています。
図3 作業キューマネージャのデータコントラクト
このデータモデルの主な構成要素は以下の通りです。
図4 タスクの状態遷移図
タスクが作業キューマネージャに送出された時点では待機状態になります。アプリケーションから実行をリクエストされると予約状態に遷移します。アプリケーションがタスク処理を完了するとタスクは完了状態に移行し、作業キューマネージャにヒューマンアクティビティへタスクの完了を知らせる応答を返すようにシグナルを送ります。あるいはもしタスク処理がキャンセルされるかタイムアウトになった場合は、タスクは待機状態に戻ります。これらのデータ型に加えて、データモデルは図5に示すような例外データ型を定義します。

図5 例外データ型
作業キューマネージャには3つのサービスのグループ - ワークフローサービス、ユーザサービスおよびメンテナンスサービスがあります。
ワークフローサービス(図6)はヒューマンタスクアクティビティによってタスクの実行を提出する際に使用されるサービスと、作業キューマネージャが実行完了のシグナルを送るために使用する、ワークフローサービスによって提供されるべきインターフェースを定義しています。これら2つのサービスはワークフロー内で実行されるヒューマンアクティビティと作業キューマネージャとの間を統合します。

図6 ワークフローサービス
作業キューマネージャによって実装される SubmitForExcecution サービスは、多数の異なるワークフローの一部となり得るヒューマンアクティビティからのリクエストを受信します。リクエストは一度受信されると更なる処理のためにデータベースに保存されます。
CompleteExecutionContract はここで定義されてはいますが、ワークフローによって実装されます。このサービスはワークフローに特定のタスクの実行が完了して処理の続行が可能であるというシグナルを送るために使用されます。
ユーザサービス(図7)はユーザと作業キューマネージャとの相互作用のサポートのために実装されます。WorkWithItems サービスは以下の3つのオペレーションをサポートします。
図7 ユーザサービス
メンテナンスサービス(図8)は作業キューマネージャの保守アプリケーションのサポートのために実装されます。
図8 メンテナンスサービス
ViewTasks メソッドは MaintenanceQuery データ型で定義されるフィルタを使用して既存のタスクのリストを返却します。タスクは閲覧後に修正が可能で、UpdateTask メソッドを用いて作業キューマネージャに変更内容を返却することができます。
サービスのデータベース設計(図9)にはヒューマンタスクに関連する全ての情報を永続化するために必要なテーブルが含まれます。メインのテーブル - HumanTask テーブルはタスク名称、ID(サービスによって割り当てられる)、優先度、そして誰がいつこれらのイベントを実行したかという情報で補完されるタスクのライフサイクルイベントなどの基本的なヒューマンタスクの情報が全て格納されます。
図9 作業キューマネージャデータベース
他の付加的テーブルには以下のような付加的なタスクの情報が格納されます。
データアクセスを最適化するため、ストアドプロシージャとビューもいくつか実装しています。ストアドプロシージャは以下のようなものです。
AddTaskCallback はコールバック情報を追加して(後述の InsertTaskCallback を使用して)指定されたヒューマンタスクと関連付けるストアドプロシージャです。最初に与えられたコールバックが既に存在するかどうかチェックし、もし存在する場合は既存のコールバックレコードを使用し、無い場合は Callback テーブルに新しいレコードを作成します。その後リンクを作成するため InsertTaskCallback ストアドプロシージャを呼び出します。InsertTaskCallback は TaskCallback テーブルにデータを投入するストアドプロシージャで、与えられたコールバックとヒューマンタスクの間のリレーションシップを作成します。AddTaskType はタスク種別情報を追加し(後述の InsertTaskTypeTask を使用して)指定されたヒューマンタスクと関連付けるストアドプロシージャです。最初に与えられたタスク種別が既に存在するかどうかチェックし、もし存在する場合は既存のタスク種別レコードを使用し、無い場合は TaskType テーブルに新しいレコードを作成します。その後リンクを作成するため InsertTaskTypeTask ストアドプロシージャを呼び出します。InsertTaskTypeTask は TaskTaskType テーブルにデータを投入するストアドプロシージャで、与えられたタスク種別とヒューマンタスクの間のリレーションシップを作成します。AddTaskPotentialOwner は潜在ユーザの情報を追加し(後述の InsertTaskPotentialUser を使用して)指定されたヒューマンタスクと関連付けるストアドプロシージャです。最初に与えられた潜在ユーザが既に存在するかどうかチェックし、もし存在する場合は既存の潜在ユーザのレコードを使用し、無い場合は PotentialUser テーブルに新しいレコードを作成します。その後リンクを作成するため InsertTaskPotentialUser ストアドプロシージャを呼び出します。InsertTaskPotentialUser は TaskPotentialUser テーブルにデータを投入するストアドプロシージャで、与えられた潜在ユーザとヒューマンタスクの間のリレーションシップを作成します。これらのストアドプロシージャを利用することで、重複の排除によってデータベースのデータ量を最小化しつつ、データベースのアクセス数はおよそ半分に減少します。
データベースのビュー(図10)によってデータベースの読み込みアクセスが簡略化されます。指定されたユーザに関する全てのタスク情報(タスク種別を含む)が単一のビューから取得することができます。
図10 完全なタスクのビュー
リポジトリパターンを実装する永続化レイヤのクラス図を図11に示します。
図11 永続化クラス図
サービスの実装は全般的にとてもわかりやすいものになっています。一旦特定のメソッドが呼び出されると、そのメソッドは必要なデータベースアクセスを全て実装するリポジトリクラス(図11)に実行を委譲します。
ヒューマンアクティビティは人間の相互作用を実装するカスタムワークフローアクティビティです。このアクティビティはワークフローデザイナから作業キューマネージャとの通信を隠蔽し、ユーザの相互作用を通常のサービス呼び出しと同様に扱う事ことを可能にします。
このアクティビティの実装はアクティビティと外界との間の非同期通信を提供するワークフローキュー [7] に基づいており、アクティビティはキューにメッセージの受け取りを登録し、サービスはキューにメッセージを送信します。カスタムアクティビティは外部イベントの処理および非同期アクティビティの実行完了の伝達のためにこのモデルを使用することができます。これによりアクティビティはある程度までの実行の後、実行再開の刺激が与えられるまで待機することができます。これらの実装に関する全体的な相互作用を図12に示します。

図12 ワークフローキューを用いたアクティビティの実装
アクティビティは一旦開始すると可能な限り実行を継続します。外部実行が必要な時点に達すると、アクティビティはワークフローキューに登録します。その後ワークフローインスタンスは待機状態に入り不動態化(永続化)が可能になります。外部実行が完了するとキューに情報が追加されます。この時点でランタイムは実行を継続するワークフローインスタンスを再活性化します。
実際のヒューマンアクティビティの実装は2つの部分 - アクティビティ自身とコールバックサービスで構成されます。
ヒューマンアクティビティはヒューマンタスクマネージャに新しいヒューマンタスク処理を開始するようにメッセージを送信します。このサービスの呼び出しが成功した場合、アクティビティは自身をワークフローキューに登録し待機状態になります。もしサービスの実行で何らかのエラーが発生した場合、アクティビティはワークフローが処理可能なワークフロー例外をスローします。
サービスは返答を受け取るとアクティビティの作業キューへその返答を追加します。キューメッセージは返答をキューから取り除くアクティビティを活性化し、実行を終了します。
コールバックサービスは CompleteExecutionContract(図6)を実装し、ワークフローを実装するサービス/アプリケーションによって開始されなければなりません。このサービスを正しく動作させるためには、WorkflowRuntime が設定されている必要があります。これには executionComplete クラスの公開静的変数を使用することができます。
ヒューマンアクティビティの実行のためには幾つかのパラメータ - タスク種別、優先度などが必要になります。これらのパラメータは DependencyProperty [8] として定義されます。DependencyProperty はワークフローデザイナ [9] によって設定されるよう公開が可能なため、プログラミングを行うことなく視覚的にアクティビティパラメータを設定することができます(図13)。
図13 アクティビティパラメータの設定
作業キュービューアはユーザコントロールとして実装されており(図14)、どのようなフォーム上にも配置することができます。このコントロールはデータビューコントロールを実装し、パラメータとしてデリゲートを受け取ります。与えられた行のいずれかのセルがクリックされるとタスク ID とタスク種別と共にデリゲートが呼び出されます。図14はメッセージボックスをポップアップするだけのシンプルなデリゲートを表示しています。
図14 作業キュービューア
ビジネスプロセスの完全な自動化の推進にもかかわらず、ヒューマンアクティビティはビジネスプロセスの実装において未だ重要な役割を果たしており、またこれからも果たし続けるでしょう。本稿の始めに示したように、ユーザの相互作用を導入することによって、ワークフローの実装とは直接的には関係ない多数の追加的な懸案事項が表面化します。本稿で説明したように実装を完全に切り離すことにより、ワークフロー開発とユーザ相互作用の開発との間で関心を分離することができます。加えて、ヒューマンタスクマネージャによるヒューマンタスクのサポートの中央集権化によって、特定ユーザのタスク管理の集約が簡単になります。
本稿の執筆を共に手助けしてくれた Paul Rovkah氏と Rob Sheldon氏に心より感謝の意を表します。
1 Jeremy Boyd. Integrating Windows Workflow Foundation and Windows Communication Foundation MSDN January 2007.
[日本語版]
Windows Workflow Foundation と Windows Communication Foundation の統合
(http://msdn.microsoft.com/ja-jp/library/bb266709.aspx)
2 Windows Workflow Foundation Web Workflow Approvals Starter Kit?Microsoft Downloads.
3 Web Services Human Task (WS_HumanTask).
4 WS BPEL extensions for People
5 Matt Milner. Build Custom Activities To Extend The Reach Of Your Workflows MSDN Magazine, December 2006,
6 Dare Obasanjo XML Serialization in the .NET Framework January 2003,
[日本語版]
.NET Framework での XML シリアル化
(http://msdn.microsoft.com/ja-jp/library/ms950721.aspx)
7 Serge Luca. Using the Windows Workflow Foundation Queuing system
8 Glenn Block Attached Properties and the Workflow Designer
9 Dennis Pilarinos. Getting DependencyProperty RegisterAttached properties to appear in the Property Browser redux
10 B.Lublinsky, Implementing a Service Registry for .NET Web Services (参考資料). January 2008, InfoQ,
[翻訳版]
.NET Webサービス向けのサービスレジストリの実装
(http://www.infoq.com/jp/articles/net-service-registry)
11 Tom Baeyens. Process Component Models: The Next Generation In Workflow? (参考資料) February 2008, InfoQ.
[翻訳版]
プロセスコンポーネントモデルは次世代のワークフローか?
(http://www.infoq.com/jp/articles/process-component-models)
原文はこちらです:http://www.infoq.com/articles/lublinksy-workqueue-mgr
(このArticleは2008年5月5日に原文が掲載されました)
前回はMicrosoft Web Platform Installerを利用して、DotNetNukeとWebMatrixをインストールする方法を紹介した。今回は、DotNetNukeのインストール方法を紹介する。
DotNetNukeは、Windows Serverで動作するCMS(Contents Management System)である。この記事ではWeb Platform Installer を利用して人気CMS「DotNetNuke」と無償Web開発環境「WebMatrix」のインストールする方法を紹介する。
クラウドコンピューティングを前提とした大規模データ技術が利用可能となってきています。Big Dataが一過性のブームで終わるかどうかにかかわらず、スケーラブルな分散アーキテクチャーの基盤はデータベース技術に主導されつつあります。RDBとORM主体のエンタープライズシステムは、HadoopやNoSQLとの組み合わせにより複合的なデータモデルに発展しました。
2011年12月8日~2011年12月9日に、ロンドンのSkills Matter eXchangeにて開催された「Groovy & Grails eXchange 2011」の参加報告を、日本Grails/Groovyユーザーグループのメンバーが3回に渡って紹介します。
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続���開 催されていく予定である。本記事では、開催の様子をレポートする。
Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。
No comments
スレッド表示 返信