1

現在、nServiceBus でホストされているアプリケーションで何かを起動して実行するのに苦労しています。サードパーティがメッセージを投稿している azure ServiceBus キューがあり、アプリケーション (現時点ではローカルでホストされています) にこれらのメッセージを受信させたいと考えています。

エンドポイントを構成する方法についての回答をグーグルで検索しましたが、有効な構成で運がありませんでした。Azureストレージキューに接続する方法の例を見つけることができますが、サービスバスキューには接続しないので、これを行ったことがありますか? (他の理由で Azure Servicebus キューが必要です)

私が持っている設定は以下の通りです

public void Init()
    {
        Configure.With()
           .DefaultBuilder()
           .XmlSerializer()
           .UnicastBus()
           .AzureServiceBusMessageQueue()
           .IsTransactional(true)
           .MessageForwardingInCaseOfFault()
           .UseInMemoryTimeoutPersister()
           .InMemorySubscriptionStorage();
    }

. Message=エンドポイント開始時の例外、エラーがログに記録されました。理由: 入力キュー [mytimeoutmanager@sb://[ * ].servicebus.windows.net/] は、この Source=NServiceBus.Host と同じマシン上にある必要があります

.

<configuration>
  <configSections>
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
    <section name="AzureServiceBusQueueConfig" type="NServiceBus.Config.AzureServiceBusQueueConfig, NServiceBus.Azure" />
    <section name="AzureTimeoutPersisterConfig" type="NServiceBus.Timeout.Hosting.Azure.AzureTimeoutPersisterConfig, NServiceBus.Timeout.Hosting.Azure" />
  </configSections>
  <AzureServiceBusQueueConfig IssuerName="owner" QueueName="testqueue" IssuerKey="[KEY]" ServiceNamespace="[NS]" />
  <MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />
  <!-- Use the following line to explicitly set the Timeout manager address -->
  <UnicastBusConfig TimeoutManagerAddress="MyTimeoutManager" />
  <!-- Use the following line to explicity set the Timeout persisters connectionstring -->
  <AzureTimeoutPersisterConfig ConnectionString="UseDevelopmentStorage=true" />
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedruntime version="v4.0" />
    <requiredruntime version="v4.0.20506" />
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>
4

2 に答える 2

0

UnicastBus()次のように、通話の最後に移動してみてください。

    Configure.With()
       .DefaultBuilder()
       .XmlSerializer()
       .AzureServiceBusMessageQueue()
       .IsTransactional(true)
       .MessageForwardingInCaseOfFault()
       .UseInMemoryTimeoutPersister()
       .InMemorySubscriptionStorage()
       .UnicastBus(); // <- Here

そして、メッセージをキューに投稿するサードパーティについて。NServiceBus がシリアライゼーション/デシリアライゼーションを処理する方法を尊重する必要があることに注意してください。NServiceBus でこれを行う方法を次に示します (最も重要な部分は、BinaryFormatter を使用したシリアル化の結果である生のメッセージで BrokeredMessage が初期化されることです)。

    private void Send(Byte[] rawMessage, QueueClient sender)
    {
        var numRetries = 0;
        var sent = false;

        while(!sent)
        {
            try
            {
                var brokeredMessage = new BrokeredMessage(rawMessage);

                sender.Send(brokeredMessage);

                sent = true;
            }
                // back off when we're being throttled
            catch (ServerBusyException)
            {
                numRetries++;

                if (numRetries >= MaxDeliveryCount) throw;

                Thread.Sleep(TimeSpan.FromSeconds(numRetries * DefaultBackoffTimeInSeconds));
            }
        }

    }

    private static byte[] SerializeMessage(TransportMessage message)
    {
        if (message.Headers == null)
            message.Headers = new Dictionary<string, string>();

        if (!message.Headers.ContainsKey(Idforcorrelation))
            message.Headers.Add(Idforcorrelation, null);

        if (String.IsNullOrEmpty(message.Headers[Idforcorrelation]))
            message.Headers[Idforcorrelation] = message.IdForCorrelation;

        using (var stream = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, message);
            return stream.ToArray();
        }
    }

NServiceBus でメッセージを正しくデシリアライズする場合は、サードパーティがメッセージを正しくシリアライズするようにしてください。

于 2012-10-10T10:04:42.353 に答える
0

私は今、まったく同じ問題を抱えており、それを解決する方法を理解するために数時間を費やしました. 基本的に、Azure タイムアウト パーシスタは、NServiceBus.Hosting.Azure を使用する Azure でホストされるエンドポイントに対してのみサポートされます。NServiceBus.Host プロセスを使用してエンドポイントをホストする場合、NServiceBus.Timeout.Hosting.Windows 名前空間クラスが使用されます。MSMQ で TransactionalTransport を初期化すると、このメッセージが表示されます。

それを回避するために、次の 2 つの方法を使用しました。

  1. As_Server エンドポイント構成を使用する必要がある場合は、初期化で .DisableTimeoutManager() を使用できます。これにより、TimeoutDispatcher の初期化が完全にスキップされます。
  2. As_Client エンドポイント構成を使用します。トランスポートにはトランザクション モードを使用せず、タイムアウト ディスパッチャーは初期化されません。

どうにかして Azure タイムアウト マネージャーを挿入する方法があるかもしれませんが、まだ見つけていません。実際には As_Client が必要なので、問題なく動作します。

于 2012-11-01T15:45:48.293 に答える