当前位置: 首页 > 知识库问答 >
问题:

未调用托管在Azure中的NServiceBus订阅服务器

微生永春
2023-03-14

我有一个非常简单的设置,其中producer发布事件,并有一个订阅者来处理。这两个角色都托管在Azure中,使用存储队列作为传输。这是生产者配置:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Worker, UsingTransport<AzureStorageQueue>, IWantCustomInitialization
{
   public void Init()
   {
       Configure.Transactions.Disable();
       Configure.With()
                .DefaultBuilder()
                .UnicastBus();

   }
}

这是订户配置:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Worker, UsingTransport<AzureStorageQueue>, IWantCustomInitialization
{
    public void Init()
    {
        Configure.Transactions.Disable();
        Configure.With()
                 .DefaultBuilder()
                 .UnicastBus()
                 .LoadMessageHandlers();


    }
}

和应用程序。配置:

<connectionStrings>
  <add name="NServiceBus/Transport" connectionString="UseDevelopmentStorage=true" />
</connectionStrings>

<AzureProfileConfig Profiles="NServiceBus.Development" />
<AzureSubscriptionStorageConfig ConnectionString="UseDevelopmentStorage=true" />

<AuditConfig QueueName="audit" />
<UnicastBusConfig>
  <MessageEndpointMappings>
    <add Assembly="Interfaces" Type="Interfaces.SumbitOrder" Endpoint="Producer" />
  </MessageEndpointMappings>
</UnicastBusConfig>

事件的定义与往常一样:

public class SumbitOrder : IEvent
{
    public string Name { get; set; }
}

此次活动的发布与其他活动一样:

Bus.Publish(Bus.CreateInstance<SumbitOrder>(m => { m.Name = "sample order"; }));

因此,浏览IntelliSense流时,我可以看到以下消息输出到控制台:

控制台:“收到发件人发送的ID为0d46873c-102e-4d2a-b2a8-a3290097836a的消息Subscriber1@UseDevelopmentStorage=真“控制台输出”从发送方收到ID为0d46873c-102e-4d2a-b2a8-a3290097836a的消息Subscriber1@UseDevelopmentStorage=真“时间:12.05.2014 9:11:40线程:[4892]

控制台:"订阅Subscriber1@UseDevelopmentStorage=消息类型接口。SumbitOrder,接口,版本=1.0.0.0,文化=中性,PublicKeyToken=null”控制台输出”订阅Subscriber1@UseDevelopmentStorage=消息类型接口为真。SumbitOrder,接口,版本=1.0.0.0,文化=中性,PublicKeyToken=null"。时间:12.05.2014 9:11:40线程:[4892]

我还可以在生产者输入队列上看到相同的消息:

{
  "IdForCorrelation": null,
  "Id": "0d46873c-102e-4d2a-b2a8-a3290097836a",
  "MessageIntent": 3,
  "ReplyToAddress": "Subscriber1@UseDevelopmentStorage=true",
  "TimeToBeReceived": "10675199.02:48:05.4775807",
  "Headers": {
    "NServiceBus.MessageId": "0d46873c-102e-4d2a-b2a8-a3290097836a",
    "NServiceBus.CorrelationId": "0d46873c-102e-4d2a-b2a8-a3290097836a",
    "NServiceBus.OriginatingEndpoint": "Subscriber1",
    "$.diagnostics.originating.hostid": "3814ca7177296375c232c8d0293664dc",
    "NServiceBus.MessageIntent": "Subscribe",
    "NServiceBus.Version": "4.6.1",
    "NServiceBus.TimeSent": "2014-05-12 06:11:38:591761 Z",
    "NServiceBus.OriginatingMachine": "VALDIS-MAC",
    "NServiceBus.ControlMessage": "True",
    "SubscriptionMessageType": "Interfaces.SumbitOrder, Interfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
  },
  "Body": null,
  "CorrelationId": "0d46873c-102e-4d2a-b2a8-a3290097836a",
  "Recoverable": true
}

订阅服务器被写入订阅存储表。但是,事件处理程序从未被调用:

namespace Subscriber1
{
    public class SubmitOrderHandler : IHandleMessages<SumbitOrder>
    {
        public void Handle(SumbitOrder message)
        {
            // logic
        }
    }
}

然而,普通消息正在工作(Bus.Send)——所以这两个Azure角色之间的连接已启动并正在运行。我不确定问题出在哪里,也不知道这是否与问题有关,但在调试时,我可以在总线上看到以下异常。发布行:

    Microsoft.Data.OData.ODataException: Cannot convert a primitive value to the expected type 'Edm.DateTime'. See the inner exception for more details. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Xml.Schema.XsdDateTime.Parser.ParseTime(Int32& start)
   at System.Xml.Schema.XsdDateTime.Parser.ParseTimeAndZoneAndWhitespace(Int32 start)
   at System.Xml.Schema.XsdDateTime.Parser.Parse(String text, XsdDateTimeFlags kinds)
   at System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags kinds)
   at System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption)
   at Microsoft.Data.OData.PlatformHelper.ConvertStringToDateTime(String text)
   at Microsoft.Data.OData.JsonLight.ODataJsonLightReaderUtils.ConvertStringValue(String stringValue, Type targetType)
   at Microsoft.Data.OData.JsonLight.ODataJsonLightReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue, String propertyName)
   --- End of inner exception stack trace ---
   at Microsoft.Data.OData.JsonLight.ODataJsonLightReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue, String propertyName)



Inner exceptoin:
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Xml.Schema.XsdDateTime.Parser.ParseTime(Int32& start)
   at System.Xml.Schema.XsdDateTime.Parser.ParseTimeAndZoneAndWhitespace(Int32 start)
   at System.Xml.Schema.XsdDateTime.Parser.Parse(String text, XsdDateTimeFlags kinds)
   at System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags kinds)
   at System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption)
   at Microsoft.Data.OData.PlatformHelper.ConvertStringToDateTime(String text)
   at Microsoft.Data.OData.JsonLight.ODataJsonLightReaderUtils.ConvertStringValue(String stringValue, Type targetType)
   at Microsoft.Data.OData.JsonLight.ODataJsonLightReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue, String propertyName)

这将导致NServiceBus中的无效操作异常。核心组件。但是手动从堆栈跟踪调用最终公共方法是成功的:

XmlConvert.ToDateTime("2014-05-11T20:42:01.15Z", XmlDateTimeSerializationMode.RoundtripKind);

调用堆栈上的NServiceBus的最后一个方法是:NServiceBus。蔚蓝色的dll!n服务总线。单播。订阅。AzureSubscriptionStorage。n服务总线。单播。订阅。MessageDrivenSubscriptions。ISubscriptionStorage。订阅(NServiceBus.Address={unknown},System.Collections.Generic.IEnumerable

我可以验证Azure存储队列与本地托管的传输相同的设置是否工作良好。所以我想应该有一些东西与emulator中的角色是如何托管的或者存储emulator是如何工作的有关。

请帮助诊断此问题,因为当前发布/订阅场景失败,这是我们向管理层演示完整样本以进行决策过程的演示!


共有1个答案

乜清野
2023-03-14

从stacktrace上看,Microsoft内部似乎存在空引用异常。数据从表存储中读取订阅数据时使用OData库。

你的版本是什么?也许可以查看一下表内容,看看其中一个日期时间字段中是否有空值?

 类似资料:
  • 现在我正在使用AAD应用程序使服务成为= AAD应用程序 流程如下所示: 服务A:从托管标识获取令牌 服务A:转到KeyVault,出示令牌并获取AAD应用程序的秘密 服务A:转到AAD,提供一个秘密并为特定资源请求一个令牌 服务A:拨打服务B 服务B:验证令牌和资源 我想知道是否可以向我的服务注册托管标识,因此如果提供托管标识令牌,则服务B可以信任服务A。类似于这样: 服务A:从托管身份获取令牌

  • 来自第三次订阅的消息会发生什么情况,是否会在TTL之后发送到死信队列 有没有办法找出消息未被使用的订阅

  • 我在spring中有一个服务,它需要使用十种不同的方法获取数据。 我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有响应出现,然后返回响应。 在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程不等待订阅者方法完成。 下面是我订阅的两种方法 下面是我的主要方法 以下是我的输出: 我的输出显示,主线程没有等待订阅服务器完成其任务,因此我如何处理这种情况?

  • 我在将Azure web角色部署到云服务时遇到了一个问题。它显示了错误 云服务在此订阅中不可用。 我正在使用Azure上的即付即用订阅。我不知道是否有任何限制与这个订阅云服务部署或没有。

  • 我已经尝试按照本教程来验证我的服务总线对,但是,我得到了401。 我在设置中使用以下代码: 然后我这样称呼SB客户: 当我调用我得到一个401错误: 失败:Azure Messaging ServiceBus[82]为标识符myqueue-578624f3-f732-4a9b-2ab0-9adc01949a5a创建发送链接时发生异常。错误消息:“系统。UnauthorizedAccessExcep