NServicebus发布事件-收到空消息 [英] NServicebus publishing event - recieves empty message

查看:96
本文介绍了NServicebus发布事件-收到空消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的域中发布事件后,我一直收到来自非规范化器主机的以下消息:

I keep recieving the following message from my denormalizer host after publishing an event in my domain:

2011-07-22 14:18:32,374 [Worker.5] WARN  NServiceBus.Unicast.UnicastBus [(null)]
 <(null)> - Received an empty message - ignoring.

我只是通过jolivers eventstore来做到这一点:

I am just doing this with jolivers eventstore:

return Wireup.Init()
                .UsingRavenPersistence("EventStore", new DocumentObjectSerializer())
                .UsingAsynchronousDispatcher()
                .PublishTo(new DelegateMessagePublisher(c => container.Resolve<IPublishMessages>().Publish(c)))
                .Build();

IPublishMessages解析为:

IPublishMessages resolves to :

 public sealed class NServiceBusPublisher : IPublishMessages
{
    private const string AggregateIdKey = "AggregateId";
    private const string CommitVersionKey = "CommitVersion";
    private const string EventVersionKey = "EventVersion";
    private const string BusPrefixKey = "Bus.";
    private readonly IBus bus;

    public NServiceBusPublisher(IBus bus)
    {
        this.bus = bus;
    }

    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }

    public void Publish(Commit commit)
    {
        for (var i = 0; i < commit.Events.Count; i++)
        {
            var eventMessage = commit.Events[i];
            var busMessage = eventMessage.Body as IMessage;
            AppendHeaders(busMessage, commit.Headers); // optional
            AppendHeaders(busMessage, eventMessage.Headers); // optional
            AppendVersion(commit, i); // optional
            this.bus.Publish(busMessage);
        }
    }
    private static void AppendHeaders(IMessage message, IEnumerable<KeyValuePair<string, object>> headers)
    {
        headers = headers.Where(x => x.Key.StartsWith(BusPrefixKey));
        foreach (var header in headers)
        {
            var key = header.Key.Substring(BusPrefixKey.Length);
            var value = (header.Value ?? string.Empty).ToString();
            message.SetHeader(key, value);
        }
    }
    private static void AppendVersion(Commit commit, int index)
    {
        var busMessage = commit.Events[index].Body as IMessage;
        busMessage.SetHeader(AggregateIdKey, commit.StreamId.ToString());
        busMessage.SetHeader(CommitVersionKey, commit.StreamRevision.ToString());
        busMessage.SetHeader(EventVersionKey, GetSpecificEventVersion(commit, index).ToString());
    }
    private static int GetSpecificEventVersion(Commit commit, int index)
    {
        // e.g. (StreamRevision: 120) - (5 events) + 1 + (index @ 4: the last index) = event version: 120
        return commit.StreamRevision - commit.Events.Count + 1 + index;
    }
}

发布事件的NServiceBus主机具有以下配置:

The NServiceBus host that is publishing the events has the following config:

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

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

接收事件的反规范化器主机为:

And the denormalizer host recieving the events is:

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

  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="Events" Endpoint="SonatribeInputQueue"/>
    </MessageEndpointMappings>
  </UnicastBusConfig>

这似乎对我来说是正确的-发布者处理从网络发送的命令,而域引发该事件. NServiceBusPublisher会发布事件,反规范化器主机至少会收到一些信息!这不是已经发送的消息,或者至少发生了一些事情,使它认为消息为空....

Which seems about right to me - the publisher processes the command sent from the web and the domain raises the event. the NServiceBusPublisher publishes the event and the denormalizer host at least recieves something! it's just not the message it had been sent - or something has happened at least for it to think that the message is empty....

有人吗?

** * ** 更新 * ** * ** * ****

*****update***********

我现在从l4n获得以下信息:

I am now getting the following from l4n:

2011-07-22 16:31:30,646 [Worker.7] ERROR NServiceBus.Faults.InMemory.FaultManage
r [(null)] <(null)> - Serialization failed for message with ID 56b7b693-090f-49b
d-83ad-7beeb334fe6d\12639.
System.Security.VerificationException: Operation could destabilize the runtime.
   at SetId(Object , Object )
   at NServiceBus.Serializers.XML.MessageSerializer.GetObjectOfTypeFromNode(Type
 t, XmlNode node) in c:\Dev\NServiceBus\src\impl\Serializers\NServiceBus.Seriali
zers.XML\MessageSerializer.cs:line 343
   at NServiceBus.Serializers.XML.MessageSerializer.Process(XmlNode node, Object
 parent) in c:\Dev\NServiceBus\src\impl\Serializers\NServiceBus.Serializers.XML\
MessageSerializer.cs:line 330
   at NServiceBus.Serializers.XML.MessageSerializer.Deserialize(Stream stream) i
n c:\Dev\NServiceBus\src\impl\Serializers\NServiceBus.Serializers.XML\MessageSer
ializer.cs:line 267
   at NServiceBus.Unicast.UnicastBus.Extract(TransportMessage m) in c:\Dev\NServ
iceBus\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 851
2011-07-22 16:31:30,908 [Worker.7] WARN  NServiceBus.Unicast.UnicastBus [(null)]
 <(null)> - Received an empty message - ignoring.

这是它试图反序列化的消息!

Here is the message it is trying to deserialize!!

[Serializable]
public class AccountCreatedEvent : IEvent
{
    public readonly string Id;
    public readonly string Name;

    public AccountCreatedEvent()
    {

    }

    public AccountCreatedEvent(string id, string name)
    {
        this.Id = id;
        this.Name = name;
    }
    public override string ToString()
    {
        return "AccountCreatedEvent - for when you've created an account";
    }
}

不很忙...

推荐答案

很明显,为什么该消息不能反序列化-您具有只读属性.如果要进行此工作,则需要切换到公共获取/设置属性.为了保留您不公开更改属性的意图,下面是一种替代方法:

It is clear why that message cannot be deserialized - you've got readonly properties. If you want to have this work, you need to switch to public get/set properties. In order to preserve your intent of not-publicly-changeable properties, here's an alternative approach:

[Serializable]
public class AccountCreatedEvent : IEvent
{
    public string Id { get; private set; }
    public string Name {get; private set; }

    public AccountCreatedEvent(string id, string name)
    {
        this.Id = id;
        this.Name = name;
    }

    public override string ToString()
    {
        return "AccountCreatedEvent - for when you've created an account";
    }
}

这篇关于NServicebus发布事件-收到空消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆