3

Rhino Service Busを使用して、1つのパブリッシャーと複数のサブスクライバーの間にpub-subをセットアップしようとしています。ただし、私が今までに得たと思われるのは、競合するコンシューマーだけです(メッセージは一方のコンシューマーまたは他方のコンシューマーに分散されますが、両方には送信されません)。

現在のパブリッシャー構成は次のようになります(注:新しいOnewayRhinoServiceBusFacilityを使用しているため、送信側でバス要素を定義する必要はありません)

<facility id="rhino.esb.sender" >
        <messages>
            <add name="My.Messages.Namespace" endpoint="msmq://localhost/my.queue"/>
        </messages>
</facility>

現在のサブスクライバー構成は次のようになります。

<facility id="rhino.esb.receiver" >
    <bus threadCount="1" numberOfRetries="5" endpoint="msmq://localhost/my.queue" DisableAutoQueueCreation="false" />
    <messages>
        <add name="My.Messages.Namespace" endpoint="msmq://localhost/my.queue" />
    </messages>
</facility>

パブリッシャーとサブスクライバーを起動する2つのシンプルなコマンドラインアプリがあります。サブスクライバービンをコピーして貼り付けるだけで、2つのサブスクライバーを設定できます。私のメッセージハンドラは次のようになります。

public class DummyReceiver : ConsumerOf<MyMessageType>
{
    public void Consume(MyMessageType message)
    {
                    // ......
            }
    }

何か案は?乾杯

4

1 に答える 1

3

ドー!プロデューサーコードで公開の代わりに送信を使用していました。別の例からそれをコピーし、変更するのを忘れていました。

したがって、参考までに、私の発行元コードは次のようになります。

var container = new WindsorContainer(new XmlInterpreter("RhinoEsbSettings.xml"));
RhinoServiceBusFacility facility = new RhinoServiceBusFacility();
container.Kernel.AddFacility("rhino.esb", facility);

var bus = container.Resolve<IStartableServiceBus>();
bus.Start();

MyMessageType msg = new ...
bus.Publish(msg);

そして、私の消費者向けスタートアップコードは次のようなものです。

var container = new WindsorContainer(new XmlInterpreter("RhinoEsbSettings.xml"));
container.Register(Component.For<ConsumerOf<MyMessageType>>().ImplementedBy<DummyReceiver>().LifeStyle.Transient.Named("Consumer"));

RhinoServiceBusFacility facility = new RhinoServiceBusFacility();
container.Kernel.AddFacility("rhino.esb", facility);

var bus = container.Resolve<IStartableServiceBus>();
bus.Start();
于 2009-12-01T11:31:21.353 に答える