接收算法
由于MSMQ API的设计方式,接收算法比其他轮询驱动的传输(例如SQL服务器).
主循环使用获取消息枚举器2
迭代队列中的所有可用消息,并为每条消息创建单独的接收任务。
禁用安装程序
NuGet包包含两个PowerShell脚本,以帮助简化端点的队列创建和清理。通过调用EnableInstaller配置API。每次端点启动时都会运行创建队列的代码。
为了避免在端点上启用安装程序时创建队列(使用端点配置。启用安装程序()
),将此传输配置API调用为显式不创建队列:
var传输=新的MsmqTransport{CreateQueues=假};端点配置。使用运输(运输);
禁用DeadLetterQueuing
全球的
将邮件转发到死信队列(DLQ)作为安全机制默认为ON。DLQ设置可防止由于配置错误或无法将消息传递到目标队列的任何其他原因而导致消息丢失。
调用此API以禁用在DLQ中存储无法传递的消息。只有在消息丢失是可接受的情况下才能使用此设置。写入DLQ会增加性能开销。在高容量情况下,可以将其关闭。在这样做时,必须确保路由配置准确,否则会导致消息丢失。
var传输=新的MsmqTransport{UseDeadLetterQueue=false};端点配置。使用运输(运输);
每条消息:(需要1.1以上版本)
可以通过发送、发布或回复选项覆盖特定消息的全局死信队列行为。
启用:
var options=新的SendOptions();选项。UseDeadLetterQueue();
禁用:
var options=新的SendOptions();选项。UseDeadLetterQueue(启用:false);
禁用发送连接缓存
默认情况下,缓存设置为true,并指示MSMQ缓存到远程队列的连接,并根据需要重新使用它们,而不是为每条消息创建新连接。此API允许关闭连接缓存。但是,在大多数情况下,这样做会对消息吞吐量产生负面影响。
var传输=新的MsmqTransport{UseConnectionCache=false};端点配置。使用运输(运输);
使用非事务队列
应谨慎使用此设置。由于队列不是事务性的,因此在处理期间发生异常的任何消息都不会回滚到队列。因此,只有在可以接受消息丢失的情况下才能使用此设置。
虽然使用非事务性队列可能会提高性能,但应仔细权衡消息丢失的可能性。
var传输=新的MsmqTransport{UseTransactionalQueues=false};端点配置。使用运输(运输);
此设置与使用不同事务模式。无。此设置意味着将存储消息的物理队列将不是事务队列。使用非事务队列的端点将无法向使用事务队列的终结点发送消息。因此,所有打算相互通信的端点都必须使用相同的设置。
启用日志记录
全球的
此API支持使用日志消息。使用此选项,MSMQ将在日志队列.
var传输=新的MsmqTransport{UseJournalQueue=true};端点配置。使用运输(运输);
每条消息:(需要1.1以上版本)
可以通过发送、发布或回复选项覆盖特定消息的全局日志行为。
启用:
var options=新的SendOptions();选项。使用日志队列();
禁用:
var options=新的SendOptions();选项。UseJournalQueue(启用:false);
到达队列的时间
覆盖到达时间队列(TTRQ)时间跨度。默认值为Message。InfiniteTimeout(无限超时)。
TTRQ是消息到达目标队列的时间限制,从消息发送时开始计算。这将设置基础消息。到达队列的时间.
var传输=新的MsmqTransport{TimeToReachQueue=时间跨度。从分钟(15)};端点配置。使用运输(运输);
MSMQ标签
此功能是在版本6中添加的,可用于与版本5(及更高版本)端点通信。然而,它应该不在与早期版本(2、3或4)通信时使用,因为在这些版本中,MSMQ标签用于通信特定的NServiceBus实现细节。
通常在使用调试MSMQ时本机工具,在MSMQ标签中有一些自定义文本很有帮助。例如消息类型或消息id。从版本6开始,用于应用于的文本消息。标签可以在配置时使用将标签应用于消息
扩展方法。此方法接受一个委托,该委托将传递给标头集合,并应返回一个字符串用于标签。它将被调用用于所有标准消息以及审计、错误和所有控制消息。此规则的唯一例外是收到的邮件头已损坏。在某些情况下,使用标题。控制消息标题
键确定消息是否为控制消息。这些消息将被转发到错误队列,但不应用标签。返回的字符串可以是字符串。清空
表示没有标签,并且最多只能包含240个字符。
var传输=新的MsmqTransport{//将msmq消息标签设置为当前消息IdApplyCustomLabelToOutgoingMessages=headers=>headers[headers.MessageId]};端点配置。使用运输(运输);
交易和交付担保
MSMQ传输支持以下功能运输交易模式:
- 事务范围(分布式事务)
- 传输事务-使用接收发送原子
- 传输事务-仅接收
- 不可靠(事务已禁用)
另请参见控制事务范围选项.
交易范围(分布式交易)
在此模式下,在接收消息之前启动环境事务。该事务包括处理的所有阶段,包括用户数据访问和传奇数据访问。
MSMQ不支持快照隔离级别。快照隔离级别仅适用于需要持久性的情况。如果传输和持久性不共享同一事务,则只能在持久化器上应用此隔离级别。将传输事务模式降低到至少使用接收发送原子,使用事务范围中的包装处理程序,然后通过隔离级别。快照
作为参数。这存在一致性问题,如传输事务一致性保证文章
本地事务
在1.0及更高版本中,MSMQ传输使用本机事务来支持仅接收
和发送原子并接收
水平。使用发送带有接收的电子邮件
用于接收消息的本机事务与发送操作共享。这意味着消息接收操作以及任何发送或发布操作都是原子提交的。使用时仅接收
,事务不会与发送操作共享,并且在接收事务需要中止时,可能不会回滚已调度的消息。
NServiceBus 6.0版中的MSMQ传输不区分仅接收
和发送原子并接收
这两个级别的行为如下发送原子并接收
.
不可靠(事务已禁用)
在这种模式下,当收到消息时,它会立即从输入队列中删除。如果处理失败,消息将丢失,因为操作无法回滚。处理消息时执行的任何其他操作都是在没有事务的情况下执行的,并且无法回滚。当消息处理部分失败时,这可能会导致意外的副作用。