【问题标题】:Sending Castle Proxy from NHibernate with MassTransit over MSMQ causes StackOverflowException通过 MSMQ 使用 MassTransit 从 NHibernate 发送 Castle 代理会导致 StackOverflowException
【发布时间】:2010-12-29 10:37:02
【问题描述】:

我正在尝试通过 MSMQ 使用 MassTransit 发送消息。该消息包含两个属性,它们是从 NHibernate 查询获得的类型并包含 Castle Proxies(用于延迟加载)。

如果我发送带有代理的消息(使用bus.Endpoint.Send(msg))作为消息的一部分,我会生成一个 StackOverflowException。如果我不分配这两个属性并将它们保留为 null,则消息将毫无问题地通过队列触发。

是这样吗,还是我的 MSMQ/MassTransit 设置有问题?

如果没有,我是否需要使用 AutoMapper 之类的东西来摆脱这些代理?

【问题讨论】:

  • 您在尝试访问这些延迟加载的属性时是否收到此 StackOverflowException 异常?或者只是通过总线发送消息?
  • 只需发送消息即可。在到达 MSMQ 之前发生在生产者端。
  • 你能创建一个独立的测试用例来重现这个吗?
  • 无论如何,是的,我会先将其映射到 DTO,然后再通过网络发送。
  • 是的 - 使用 AutoMapper 将其映射到 DTO 有所帮助,但在另一端出现了 NHibernate 怪异(因为会话处于不同的进程中)。需要重新考虑架构。

标签: c# nhibernate msmq castle masstransit


【解决方案1】:

这可能是基于生成的动态代理和正在使用的序列化程序的异常。我假设它是默认的 XML 序列化程序?我会在 MT 的 github 页面上发布一个问题,以便我们查看:https://github.com/MassTransit/MassTransit

这些消息应该被视为进程之间解耦的契约。使用 NHibernate 实体,这些服务不仅与消息耦合,因为数据库更改可能会影响其他消费者。理想情况下,您总是会在传递它之前将其映射到另一个对象。

您不只是bus.Publish(msg) 而是直接发送到总线的端点有什么原因吗?您可以加入 MT 邮件列表并详细讨论:http://groups.google.com/group/masstransit-discuss

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2013-06-24
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多