我尝试将消息放入本地计算机上定义的专用队列中,但队列大小不能超过 8 MB。每次达到该大小后我都会遇到异常。特定队列的大小设置为 10 GB。我运行的是 Windows 7 专业版。是否因此而受到限制?
是否可以直接从队列中读取消息作为字符串(与您在查看来自计算机管理 MSC 管理单元的 MSMQ 消息时看到的消息正文相同),以便我可以自己将其保存到数据库中?我希望能够存储它以便稍后重播而不会丢失任何数据,我担心如果反序列化/序列化它我可能会丢失一些东西。
HTTP 传输自 MSMQ 3.0 起就已可用,但恐怕 MassTransit 不提供使用 HTTP 协议作为队列之间的传输协议的功能。
这里有一个非常类似的问题,尚未得到完全解答。
有谁知道客户端是否可以订阅总线并通过 HTTP 发送/接收消息?这是我愿意实现的架构:
我将在本地网络中拥有 2 台计算机
我希望他们之间的通信通过http 完成。
我尝试将地址更改为UseSubscriptionService,http而不是msmq,但它不起作用。如果我将计算机 A 的MSMQ 服务设置为强化模式,则计算机 B上运行的客户端应用程序在尝试订阅mt_subscriptions.
Bus.Initialize(sbc =>
{
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.UseMulticastSubscriptionClient();
sbc.ReceiveFrom("msmq://localhost/test_queue_client");
sbc.UseSubscriptionService("msmq://m3-dev1/mt_subscriptions"); // maybe I could use http instead of msmq, but it doesn't work
});
Run Code Online (Sandbox Code Playgroud)
有什么线索吗?
我正在实施服务总线并查看MassTransit.我的模式不是发布/订阅,而是发件人/接收器,其中接收器可以脱机并在以后重新联机.现在我开始编写测试来验证MassTransit是否使用以下代码成功传递了消息:
bus = ServiceBusFactory.New(sbc =>
{
sbc.UseMsmq(
cfg =>
{
cfg.Configurator.UseJsonSerializer();
cfg.Configurator.ReceiveFrom("msmq://localhost/my_queue");
cfg.VerifyMsmqConfiguration();
});
});
Run Code Online (Sandbox Code Playgroud)
然后我抓住公共汽车并发布这样的消息:
bus.Publish<TMessage>(message);
Run Code Online (Sandbox Code Playgroud)
我可以从MSMQ中注意到,创建了两个队列并且发送了消息,导致Mass Transit没有引发任何错误,但我在队列容器中找不到任何消息.

我究竟做错了什么?
更新 阅读Mass Transit新闻组我发现在发件人/收件人的情况下,接收器可以在以后的任何时间上线,可以使用以下代码发送消息:
bus.GetEndpoint(new Uri("msmq://localhost/my_queue")).Send<TMessage>(message);
Run Code Online (Sandbox Code Playgroud)
在我的场景中,我不是在写一个发布者/订阅者,而是一个发送者/接收者.
我们有一个解决方案,我们使用Windows服务选择消息.
Windows服务每隔2分钟触发一次并检索MSMQ消息以将其传递给Web服务.
我正在研究WCF/MSMQ.
有谁知道如何使用MSMQ处理减少量?我的理解是队列位于服务器上,但是如果服务器出现故障并且无法恢复,那么如何防止消息丢失呢?
关于这个主题的任何好文章?
我想使用WCF + MSMQ(netMsmqBinding),我想知道我是否需要在客户端安装任何与MSMQ相关的东西,而不是我的客户端应用程序和.NET框架.
我正在尝试将我们的大球体系结构中的一些部分分离,并确定了几个明显可以选择使用CQRS来提供更具弹性和可扩展性的解决方案的边界.
典型示例:当客户下订单时,我们在订单提交付款时批准其线程,由销售系统批准等等.
这可以全部异步处理 - 允许我们在支付处理系统不可用时接受和排队订单等 - 但我不确定如何管理客户的UI数据.
换句话说 - 他们下订单.他们的订单排在队列中.如果他们在五秒钟后重新登录帐户并点击"查看订单" - 会发生什么?
我想在很多地方做这件事 - 而且并非所有这些行动都像确认订单一样重要; 在某些情况下,它就像客户更改电话号码一样简单 - 所以他们并不是所有我只能说"非常感谢,我们会向您发送确认电子邮件"的情况 - 因为发送确认电子邮件每次修改记录的邮件都让我觉得有些过分.
我应该看看任何模式或解决方案来帮助解决这个问题?
我正在尝试使用MSMQ,并且可以让发送器/接收器在本地计算机上工作.现在我正在尝试让发件人从另一台机器上工作并将消息发送到远程专用队列,但现在我的发送者说它已经发送了一条消息但是没有收到任何消息 - 或者看起来它已经被发送到了我可以告诉.
我确保它连接到删除专用队列,如下所示:
FormatName:Direct=TCP:ipaddress\private$\TestQueue
Run Code Online (Sandbox Code Playgroud)
其中ipaddress是我的远程机器的正确地址.然后,我可以在计算机管理中看到为此队列创建了传出队列.然而,当我使用Send()方法时,它完成并且什么都不做.传出队列中没有任何内容,并且肯定不会出现在远程计算机上.它也没有任何错误地做到这一点 - 它什么都不做,继续.
我尝试使用这篇文章http://beaucrawford.net/post/MSMQ-ndash3b-Sending-Messages-to-Remote-Queues.aspx添加确认代码但是它确实抛出一个异常,说明找不到请求的消息在确认队列中.
有任何想法吗?在我可以进行分布式消息队列之前是否需要配置?
更新:
发现它与我发送的队列的权限有关.使用下面的答案,我打开了死信排队,找出消息的去向,发现消息被发送到远程专用队列,但访问被拒绝.
我正在尝试找到一种方法来按照发件人发送的顺序处理邮件,因为NServiceBus不保证邮件将按特定顺序处理.
发件人是一个发布createOrder和reviseOrder命令的订单系统.发件人允许用户向同一订单提交多个修订版,因此队列中可以同时包含修订版4和修订版3.每个修订版都有一个与之关联的修订号和原因代码,这些代码驱动了一些业务逻辑,因此我们不能忽略任何修订或至少部分原因.
我有几个想法如下 -
将修订号存储在目标记录中.发件人在每个修订消息中发送其修订号.处理程序比较发件人和目标修订号,如果匹配,则更新记录,否则将消息放在队列末尾.使用此方法,如果修订版2消息失败并进入错误队列,则永远不会处理修订版3.
发件人发送每个修订消息的所有修订的所有原因代码的历史记录.因此,如果修订版2消息失败,则修订版3消息将具有所有原因代码.这些原因代码将记录在目标中,但可能不会出现与先前修订原因代码相关联的任何业务逻辑.
我们如何为这种情况设计?
还有关于如何处理失败的修订消息的任何想法?
一些指导非常感谢.
谢谢.
msmq ×10
.net ×2
c# ×2
masstransit ×2
nservicebus ×2
wcf ×2
c#-4.0 ×1
cqrs ×1
esb ×1
msmq-wcf ×1
servicebus ×1
windows-7 ×1