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

时间:2014-05-12 07:05:00

标签: c# azure nservicebus

我有一个非常简单的设置,生产者发布事件并有一个订阅者进行处理。这两个角色都使用存储队列作为传输托管在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();


    }
}

和app.config:

<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流我可以看到以下消息输出到控制台:

控制台:&#34;来自发件人Subscriber1 @ UseDevelopmentStorage = true&#34;收到ID为0d46873c-102e-4d2a-b2a8-a3290097836a的消息 控制台输出&#34;收到来自发件人的ID为0d46873c-102e-4d2a-b2a8-a3290097836a的消息Subscriber1 @ UseDevelopmentStorage = true&#34; 时间:12.05.2014 9:11:40 螺纹:[4892]

控制台:&#34;订阅Subscriber1 @ UseDevelopmentStorage = true到消息类型Interfaces.SumbitOrder,Interfaces,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null&#34; 控制台输出&#34;订阅Subscriber1 @ UseDevelopmentStorage = true到消息类型Interfaces.SumbitOrder,Interfaces,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null&#34;。 时间:12.05.2014 9:11:40 螺纹:[4892]

我也可以在Producer输入队列中看到相同的消息:

{
  "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角色之间的连接已启动并正在运行。 我不确定问题出在哪里,我不知道这是否与问题有关,但在调试时我可以在Bus.Publish行上看到以下异常:

    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.Core程序集中导致InvalidOperationException的结果。 但是手动调用堆栈跟踪调用最终公共方法它是成功的:

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

来自NServiceBus的最后一个调用堆栈的方法是:NServiceBus.Azure.dll!NServiceBus.Unicast.Subscriptions.AzureSubscriptionStorage.NServiceBus.Unicast.Subscriptions.MessageDrivenSubscriptions.ISubscriptionStorage.Subscribe(NServiceBus.Address address = {unknown}, System.Collections.Generic.IEnumerable<NServiceBus.Unicast.Subscriptions.MessageType> messageTypes = {unknown})

我可以验证与Azure存储队列相同的设置与刚才在本地托管的传输一样可行。所以我的猜测应该有一些与角色如何在模拟器中托管或存储模拟器如何工作相关的东西。

请帮助诊断这个,因为当前的pub / sub场景失败了,这是我们向管理层演示完整样本以供决策制定过程的显示器!

1 个答案:

答案 0 :(得分:0)

从堆栈跟踪中,当从表存储中读取订阅数据时,看起来Microsoft.Data.OData库中存在空引用异常。

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

相关问题