0

ブローカーサービスを理解し始めたばかりですが、複数のメッセージタイプ/キューなどについて質問があります...状況は非常に単純です。

ジョブキュー(時間ベース)があり、各ジョブが「処理」されると、結果がテーブルに保存されます。トリガーは結果テーブルに配置され、ブローカーサービスを使用して各結果を(非同期で)処理します。各結果(XML)はジョブのタイプに基づいて異なる可能性があるため、タイプごとにストアドプロシージャが必要です。これを実現するには複数のメッセージタイプが必要だと思いますが...

  1. メッセージタイプごとに1つずつ、複数のキューも必要ですか?
  2. 複数の契約も必要ですか?
  3. 複数のサービスが必要ですか?
  4. このようなものの良いデザインパターンを知っていますか?

理想的には、多くのリーダー(タイプごとに1つ)を含む1つのキューが必要ですが、キューごとに1つのストアドプロシージャしか持てないため、これが可能かどうかはわかりません。複数のメッセージタイプと複数のキューを作成すると、複数のサービスも必要になるようです。

4

2 に答える 2

2

1つのサービス/キュー/コントラクトに固執することをお勧めします。複数のメッセージタイプで問題ありません。非同期処理でアクティブ化されたprocを次のようにコーディングする必要があります(擬似コード)。

begin transaction;
receive message into @msg
switch @msg.message_type
case 'A': exec proc_for_a @msg;
case 'B': exec proc_for_b @msg;
...
case 'Z': exec proc_for_z @msg;
end
commit;

WM_PAINT / WM_CREATEなどを使用して古いスタイルのウィンドウプログラミングを行ったことがある場合、アクティブ化された手順は非常に似ている可能性があり、SSBメッセージタイプがWM_XXXの役割を果たします。これは、イベント駆動型プログラミングがイベント駆動型プログラミングに似ているためです...

于 2012-08-02T20:16:11.220 に答える
0

これが私が思いついたものです(単一のコントラクト/キュー/サービスに固執することについてのRemusの答えを使用して)。

タイプに基づいて特定のメッセージ/コントラクト/キュー/サービス名を作成します。

create message [//MyPrefix/SomeTypeMessage]
create queue dbo.SomeTypeQueue
create service [//MyPrefix/SomeTypeService]
create contract [//MyPrefix/SomeTypeContract]

したがって、「SomeType」は、挿入されたデータのどこかにあるタイプです。呼び出しが会話を開始するトリガーが作成されると、タイプはさまざまなsysnameを連結するために使用されます。'myTypeDataField'で見つかったデータに基づいて、レコードはさまざまなキュー/プロシージャに送信されます。

declare @handle uniqueidentifier, 
        @service sysname, 
        @contract sysname,
        @messageType sysname,
        @myType varchar(50)


set @myType = (select myTypeDataField from inserted)
set @messageBody = (select * from inserted for xml auto)

set @service = N'//MyPrefix/' + @myType + 'Service'
set @contract = N'//MyPrefix/' + @myType + 'Contract'
set @messageType = N'//MyPrefix/' + @myType + 'Message'

begin tran

    begin dialog conversation @handle
    from service @service
    to service @service, 'current database'
    on contract @contract
    with encryption = off;

    send on conversation @handle
    message type @messageType(@messageBody);

commit
于 2012-08-03T00:44:20.613 に答える