ServiceStackは、MQ、REST、HTML、またはSOAPサービス用に作成されたサービスを区別せず、同じものです。つまり、それぞれがリクエストDTOを受け入れ、オプションでレスポンスDTOを返します。同じサービスで、HTML、REST、SOAP、MQなどの任意のエンドポイントまたは形式からの呼び出しを処理できます。
MQがどのように適合するかについては、ServiceStackのアーキテクチャ図を参照してください。
制限
覚えておく必要があるのは次のとおりです。
- SOAPと同様に、MQは1つの動詞のみをサポートするため、メソッドには投稿という名前を付ける必要があります。 または任意
- アクションフィルターのみが実行されます(つまり、グローバルフィルターまたは属性フィルターは実行されません)
-
IHttpRequest
の代わりにMqRequestスタブとMqResponseスタブを取得します 、IHttpResponse
。引き続き.Items
を使用できます リクエストパイプラインを介してデータを渡しますが、CookieやHTTPヘッダーの設定などのHTTPアクションは無害です
RedisMQホストの構成
MQホスト自体は、ServiceStackフレームワークの残りの部分から完全に切り離されています。ServiceStackフレームワークは、メッセージをServiceStackに自分で渡すまで、MQが存在することを認識しません。これは通常、登録済みハンドラー内で行われます。例:
var redisFactory = new PooledRedisClientManager("localhost:6379");
var mqHost = new RedisMqServer(redisFactory, retryCount:2);
mqHost.RegisterHandler<Hello>(m => {
return this.ServiceController.ExecuteMessage(m);
});
//shorter version:
//mqHost.RegisterHandler<Hello>(ServiceController.ExecuteMessage);
mqHost.Start(); //Starts listening for messages
RegisterHandler<T>
で リッスンするリクエストのタイプを指定します。
デフォルトでは、メッセージごとに1つのハンドラーのみを登録でき、ServiceStackでは、リクエストは既知のサービス実装に関連付けられます。MQの場合、最初に一致するメソッドシグネチャを検索します:Post(Hello)
それが存在しない場合は、フォールバックAny(Hello)
を探します 。
メッセージごとに複数のハンドラーを自分で追加できます
複数のハンドラーを呼び出したい場合は、独自のList<Handler>
を維持するだけです。 リクエストが届いたら、すべてを実行して実行します。
さまざまなサービスの呼び出し
別のサービスを呼び出したい場合は、それを別のRequest DTOに変換し、代わりにServiceControllerに渡します。
MQリクエストが誰かから送信された場合(例:
)mqClient.Publish(new Hello { Name = "Client" });
ハンドラーは、リクエストDTOが本文に含まれているタイプIMessageのインスタンスで呼び出されます 財産。その時点で、メッセージを破棄するか、検証するか、変更するかを選択できます。
MQリクエストは他のサービスリクエストと同じです
ほとんどの場合、通常はメッセージをServiceControllerに転送して処理します。その実装は、次のとおりです。
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
実装は、 mqMsg.BodyからリクエストDTOを抽出するだけです。 そして、そのメッセージを、MQ IHttpRequest、IHttpResponseスタブを含むMqRequestContextを使用して、その時点からC#リクエストDTOが渡される通常のサービスとして処理します。