2017-06-16 5 views
1

私はIProvideConfiguration<UnicastBusConfig>とそのMessageEndpointMappingsが廃止されているNServiceBus 6に更新しました。NServiceBus 6では、エンドポイントは公開エンドポイントを知らずにイベントを購読できますか?

私はドキュメントの発行/購読の手順に従っています。私が理解しているように、イベントを購読するときは、公開エンドポイントに明示的に名前を付ける必要があります。

config.MessageEndpointMappings.Add(
       new MessageEndpointMapping 
       { 
        AssemblyName = MyAssemblyName, 
        TypeFullName = typeof(IMyEvent)), 
        Endpoint = "SubscribingEndpoint" 
       }); 

今:

前に、私は、イベントインターフェイスの特定のエンドポイントは、加入者の名前になりますができ これは離れて行くと、私は次のことを持っています。だからここに私はIMyEventの出版社ではなく、加入者を指定する必要があります

var routing = endpointConfiguration.UseTransport<MsmqTransport>().Routing(); 
    endpointConfiguration.SendFailedMessagesTo("error"); 
    endpointConfiguration.AuditProcessedMessagesTo("audit"); 
    //register command 
    routing.RouteToEndpoint(typeof(MyCommand), "SomeEndpoint"); 
    //subscribe to event 
    routing.RegisterPublisher(typeof(IMyEvent), "PublishingEndpoint"); //? 

:これは完全にIProvideConfigurationクラスの必要性を置き換えます。 NSB5では、これは必要ではありませんでした。

イベントが複数のエンドポイントによって公開されている場合はどうすればよいですか?あなたの質問に答えるために

+0

イベントは常に1つのエンドポイントからのみ公開されていました(ルールに従うと、1つのサイト運営者が...)、AFAIKは常にイベントの発行者アドレスを提供する必要がありました。行う? –

+0

@SeanFarmar私は、イベントは1つのエンドポイントによってのみ公開されるべきであることを理解します。 NSB5では、上記のように、サブスクライバは、パブリッシャのエンドポイント名ではなく、MessageEndpointMappingで独自のエンドポイント名を使用してサブスクライブします。 v5のドキュメントには、それほど詳しく述べられていません。これは、イベントVSコマンドの質問よりも、設定問題の問題です。この場合、コマンドの送信は、ルーティングを設定する作業が多いことを除けば、コマンドを送信することができます。 – John

+2

私は混乱しています。あなたは、エンドポイントの名前ではなく、出版社のエンドポイント名を使用できるというリンクを提供できますか? AFAIKは常にサブスクライバがパブリッシャにサブスクリプションメッセージを送信するので、パブリッシャのエンドポイント名を設定する必要があります(それは意味をなさない)... –

答えて

1

:イベントは、いくつかのエンドポイントによって公開されている場合

は、だから私は何をしますか?

複数のパブリッシャーから同じイベントを購読するには、サブスクライバーからRegisterPublisherコールを複数回受信することができます。

同じイベントが複数の論理エンドポイントから発行されていると、通常は匂いとみなされます。論理エンドポイントごとに異なるイベント・タイプを使用したり、イベントからコマンドに切り替えたりすることを検討してください。あなたがメッセージデザインについて確信が持てない場合は、Particular Software Google Groupを訪問することを強くお勧めします。人々はこのSOの質問を拡張する設計質問をお手伝いしてくれることを非常に嬉しく思っています。

V5とV6の間の変化について:NSB5で

私は、加入者は、出版社のエンドポイント名を私が上に示しているようMessageEndpointMappingに、独自のエンドポイント名を使用して、サブスクライブ、およびではないでしょう。

私はこの声明の後に苦労しています。 V5とV6は購読と同じアプローチを採用しています。

MSMQを使用しているため、サブスクライバはイベントの各パブリッシャにサブスクリプションメッセージを送信する必要があります。加入者が加入メッセージをどこに送るべきかを知るためには、加入者はこれに関するルーティング情報を必要とする。これは、V5とV6が異なる構文を使用する場合です。

  • V5はMessageEndpointMappingsで一致するルートを探します。マッピングで指定されたエンドポイントにサブスクリプションメッセージを送信します(サンプルコードのSubscribingEndpoint)。
  • V6は、サブスクリプションメッセージとコマンドの分離を強制します。そのため、通常のコマンドをルーティングし、サブスクリプションメッセージをルーティングするためのAPIが異なります。ブローカーベースのトランスポート(例:RabbitMQ)はサブスクリプションメッセージを必要としないため、サブスクリプションメッセージのルーティングは必要ありません。

ご覧のとおり、V5とV6の構文に違いがあります。概念は変更しないでください。

  • はあなたの論理的なエンドポイントはに加入者エンドポイントに送信されたサブスクリプションメッセージを引き起こす可能性があり、同じサブスクリプションストレージを共有:あなたは、上記の例はあなたのために働く、私はそれがそうであるいくつかの理由を想像することができると主張しているので、事故によって出版社に見えるようにする。
  • パブリッシャが使用する永続サブスクリプションストレージには、すでにサブスクライバからのサブスクリプションが含まれています。あなたの設定では購読メッセージを受信しなくなるかもしれませんが、パブリッシャが使用する "古い"サブスクリプションがまだあります。

NServiceBusとMSMQトランスポートを使用している場合これらの理由の一つは、あなたのシーイングの行動を説明したりしないことがありますかどうか、は、加入者は、常に発行者に到達するために、サブスクリプション・メッセージのために、出版社に設定したルートを持っている必要があります。この設計は、V5とV6との間で変更されなかった。

特定のドキュメントで利用可能なV5とV6の両方でパブリッシュ/サブスクライブデモンストレーションの素敵なサンプルがあります:私はIProvideConfigurationとそのMessageEndpointMappingsが廃止されNServiceBus 6に更新したhttps://docs.particular.net/samples/pubsub/?version=core_5

が。

V6では、これらのAPIの両方が警告で廃止されていますが、引き続き機能します。これらのAPIは、次のメジャーバージョンで削除されます。

これは少しクリアすることを願っています。

関連する問題