我们正在尝试在相同版本的NSB上进行服务器移动,但转移到另一个框。
需要移动一些超时消息。超时消息有一个响应地址(它必须返回的端点),移动它们的最佳方法是什么。我看到几个选项
1)使用队列资源管理器导入它们并手动编辑响应。如果我们有超过100个超时消息,它将无法管理。我已经验证了这项工作。
2)我尝试使用Andreas最新超时消息的一些代码从(2.6到3.0)移动,看起来底层deseralizer已经改变。我得到:“根元素缺失”,当试图读取身体。我尝试将其反序列化为TimeoutData和Timeoutmessage。
3)我设置了一个端点来监听TimeoutMessage并使用mutator将头部更改为目标端点,这似乎有效,但是超时消息在处理后不会从队列中删除。
因此,我坚持1,我想要一些自动化过程。想法?
答案 0 :(得分:0)
您最好的选择可能是修改现有的TimeoutMigrator
https://github.com/NServiceBus/NServiceBus/tree/master/src/tools/migration/TimeoutMigrator
然后查看反射器中当前的TimeoutData或查看存储队列中的内容。
然后修改迁移器中的TimeoutData类以匹配当前架构:
答案 1 :(得分:0)
安德烈亚斯, 谢谢你的回复。我回去做了我的第三个解决方案。我监听timeoutmessage,使用DestinationOverride变异到新地址并做一个总线。发送到超时终点。
我必须添加DonotCOntinueDispatchingCUrrentMessageToHandlers以从队列中删除超时消息。
这是我的代码看起来像
public void Handle(TimeoutMessage message)
{
DestinationOverride.CurrentDestination = ConfigurationManager.AppSettings["ResponseQueue"];
var header = message.GetHeader("CorrId");
bus.Send<TimeoutMessage>(ConfigurationManager.AppSettings["OutputQueue"], tm =>
{
tm.ClearTimeout = false; //always false since we don't store the "clear" requests
tm.Expires = message.Expires;
tm.SagaId = message.SagaId;
tm.State = message.State;
tm.SetHeader("CorrId",header);
});
bus.DoNotContinueDispatchingCurrentMessageToHandlers();
}
感谢。