2011-01-16 6 views
0

サブスクライバキューがメッセージを受信して​​いません。彼らはエラーキューに終わっているようです。nServiceBusユーザを登録していますが、ユーザはメッセージを受信して​​いません。

唯一の珍しい点は、Webサイト(およびクラスライブラリ)から生成され、Webサイト/クラスライブラリに代わって発行するパブリッシャにWCFされたメッセージをパブリッシャが受信していることです。

パブリッシャーの<add Messages="">を削除した場合、パブリッシャーはメッセージのルーティング先を知らないというエラーが表示されます。

メッセージの宛先が指定されていません。 Messages.ContactRequest。メッセージ は送信できません。 設定ファイルの UnicastBusConfigセクションを確認し、メッセージタイプが の場合は MessageEndpointMappingが存在することを確認してください。

ヘルプ!私はWcfIntegrationとPubSubのサンプルをほぼcut'n'pastedしたので、私はそれが動作していない理由を知らない!

PUBLISHER:

<MsmqTransportConfig 
    InputQueue="RSApp_InputQueue" 
    ErrorQueue="error" 
    NumberOfWorkerThreads="1" 
    MaxRetries="5" 
    /> 

    <UnicastBusConfig 
    DistributorControlAddress="" 
    DistributorDataAddress="" 
    ForwardReceivedMessagesTo=""> 
    <MessageEndpointMappings> 
     <add Messages="Messages" Endpoint="RSApp_InputQueue" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 

加入:

<!-- SUBSCRIBER --> 
    <MsmqTransportConfig 
    InputQueue="RSApp_SubscriberQueue" 
    ErrorQueue="error" 
    NumberOfWorkerThreads="1" 
    MaxRetries="5" 
    /> 

    <UnicastBusConfig 
    DistributorControlAddress="" 
    DistributorDataAddress="" 
    ForwardReceivedMessagesTo=""> 
    <MessageEndpointMappings> 
     <add Messages="Messages" Endpoint="RSApp_InputQueue" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 

P.S. nservicebusによって自動的に作成されたWCFエンドポイントも自動的にbus.publish <>()メッセージを送信しますか?

p.s.

[のServiceContract] パブリックインターフェイスIContactRequestService { [OperationContract(アクション= "http://tempuri.org/IWcfServiceOf_ContactRequest_ErrorCodes/Process"、 ReplyAction = - :私はこれを行うために必要なものを理解していません"http://tempuri.org/IWcfServiceOf_ContactRequest_ErrorCodes/ProcessResponse")] ErrorCodesプロセス(Messages.ContactRequest request); }

ここに私のクライアントは、呼び出し元のコード: - 奇妙はWCFを使用せずにバスにメッセージを置くことは御馳走を動作することです何

public void MakeContactRequest(int id, Guid RequestingUserId, Guid RequesteeUserId, Messages.ContactRequestType type) 
{ 
    //get extra information 
    var u = Services.UserService.FetchUserProfile(id); 

    //add it to local database 
    var RequestIdentifier = Guid.NewGuid(); 

    //create message 
    var req = new ContactRequest() 
     { 
      contactRequestType = type, 
      Name = u.DisplayName, 
      RequestCreationDate = DateTime.Now, 
      TagLine = u.Tagline, 
      RequesterUserId = RequestingUserId, 
      RequesteeUserId = RequesteeUserId, 
      RequestIdentifier = RequestIdentifier 
     }; 

    //drop it onto distributed message queue 
    IContactRequestService client = ChannelFactory.CreateChannel(); 
    try 
    { 
     ErrorCodes returnCode = client.Process(req); 
    } 
    finally 
    { 
     try 
     { 
      ((IChannel)client).Close(); 
     } 
     catch 
     { 
      ((IChannel)client).Abort(); 
     } 
    } 
} 

!!

public void Run() 
{ 
    Console.WriteLine("This will publish IEvent and EventMessage alternately."); 
    Console.WriteLine("Press 'Enter' to publish a message.To exit, Ctrl + C"); 

    bool publishIEvent = true; 
    while (Console.ReadLine() != null) 
    { 
     var eventMessage = publishIEvent ? Bus.CreateInstance<ContactRequest>() : new ContactRequest(); 

     Bus.Publish(eventMessage); 

     Console.WriteLine("Published event "); 

     publishIEvent = !publishIEvent; 
    } 

答えて

0

NSBはあなたのためにPublish()を実行しません。NSBエンドポイントのようにメッセージハンドラに入れなければなりません。 WCF経由でエンドポイントを公開しても、抽象クラスWcfService < TRequest、TResponse >の実装以外は何もする必要はありません。 NSBが内部的に処理するので、他のコードは必要ありません。技術的には、内部でサブスクリプションを管理するので、パブリッシャーはメッセージマッピングを必要としないはずです。なぜ、そこにエラーが発生しているのかわかりません。

メッセージがエラーキューにある場合は、ログに例外が表示されます。 Lite(デフォルトプロファイル)を使用している場合は、多くの場合、ファイルまたは何かを指すようにロギングを設定する必要があります。

+0

ありがとうアダム - クライアント側でエラーが発生しています.client.publish(wcfintegrationサンプルを参照)を呼び出すとエラーが発生しています。何かご意見は? WCFの問題だろうか?ロギングに苦労しています... –

+0

あなたはあなたのBus.Publish()をCancelOrderHandlerのServerプロジェクトに入れておくべきです。クライアントからのパブリッシュは推奨されません。プロファイルのログを上書きする場合は、IConfigureLoggingForProfile を実装するだけです。 –

+0

私は何を意味するのかを示すサンプルプロジェクトをまとめました.http://bit.ly/hM4qDw –

関連する問題