読者です 読者をやめる 読者になる 読者になる

StreamInsightでInputAdapterを作ってみる

streaminsight

前回の記事ではサンプルを動かすことで、おおまかにStreamInsightでどのような実装を行うのか理解しました。
今回はStreamInsightの構造の一つである入力アダプター(InputAdapter)を実装してみます。

と、Kinectと接続することを念頭にWebSocket用のInputAdapterを作成しようとしたのですが、IISやらその他のもにゃもにゃの関係で、Windows 7 では System.Net.Websocketsがサポートされていません(というか、~Windows 7では抽象クラスしか提供されません)。

ここは大人しくTCP Socketで接続するInputAdapterを作ってみましょう。そうしよう。

f:id:weathercook:20140226204509j:plain

InputAdapterの構成

サンプルアプリケーションを見てみると、InputAdapterを作ると言っても単体のクラスを作れば解決するというわけでもなさそうです。具体的にはざっくり以下の様なクラスが必要になってきます。

  • InputAdapter Class
  • InputAdapterFactory Class
  • InputAdapterConfig Class
  • TPayload Class

実際のデータのEnqueueはInputAdapterクラスでおこない、InputAdapterFactoryクラスはアプリケーション要件に合わせてInputAdapterクラスを組み合わせるためのハブ的な役割になります。

また、InputAdapterクラス, InputAdapterFactoryクラスはともにOutputAdapterに渡すストリームに型があるか/無いかに応じて別のクラスを継承する必要があります。

今回はそこはかとなく型のあるストリーム処理をしたかったので、ストリームに流すPayloadの型を表現するクラス(TPayloadクラス)を追加しています。

InputAdapterConfigクラスは設定項目を保持するクラスです。

InputAdapterクラスとInputAdapterFactoryクラスについてはもう少し詳しく見て行きましょう。

ちなみに、このへんのリファレンスを参考にしました。
http://technet.microsoft.com/ja-jp/library/microsoft.complexeventprocessing.adapters.aspx

InputAdapterFactoryクラス

InputAdapterFactoryクラスは扱うイベントのモデルと回復性サポートのあるなしにしたがって適切な基本クラスを継承して作成します。

基本クラスの用語体系は [回復性サポートあり][型指定あり][入力 | 出力] パターンに従いますので、 たとえば「回復性サポートなし型指定ありの入力アダプター」を作りたい場合は以下のようになります。

public class SampleInputAdapterFactory : ITypedInputAdapterFactory<SampleInputAdapterConfig> {}

InputAdapterFactoryクラスはCreate, Disposeメソッドを実装し、ストリームの開始時と停止時にAdapterConfigにしたがって適切なInputAdapterを呼び出します。

実際に超単純なInputAdapterFactoryを書いてみると以下の様な感じになります。

SampleInputAdapterFactory class

ちなみに回復性サポートってなんでしょうね。。。まだ調べられていないので、このへんはもっと調査が必要です。

InputAdapterクラス

InputAdapterクラスはイベントの種類とモデルにしたがって適切な基本クラスを継承する必要があります。

基本クラスの用語体系は [型指定あり][ポイント | 期間 | エッジ][入力 | 出力] パターンに従いますので、 たとえば「型指定ありのポイント入力アダプター」を作りたい場合には以下のようになります。

public class SampleInputAdapter : TypedPointInputAdapter<SampleInputPayload> {}

ここで SampleInputPayload は入力アダプターに渡されるPayloadを表現する型になります。"Typed"なアダプターなので型が必要なわけですね。
基本クラスから Start() メソッドを継承してQueueにEnqueueすることで、入力ストリームを回すことができます。

実際に超単純なInputAdapterを書いてみると以下の様な感じになります。

StreamInsight input adapter classes sample code.

TCP接続は?

上記のような情報を踏まえたうえでTCP接続するInputAdapterのクラス群を実装してみました。まだまだわからないことだらけなので、「このへんはもっとこうするべき!」みたいなツッコミをいただけると喜びます。

StreamInsight InputAdapter Classes for UDP protoco ...

次回はOutputAdapterを詳しく見ていきます。

よくわかるSQL Server 2012データベース構築・管理入門編 (TECHNICAL MASTER)

よくわかるSQL Server 2012データベース構築・管理入門編 (TECHNICAL MASTER)

ひと目でわかるMicrosoft SQL Server 2008 (マイクロソフト公式解説書)

ひと目でわかるMicrosoft SQL Server 2008 (マイクロソフト公式解説書)