Nservicebus在不同的框中移动超时消息

时间:2012-03-27 23:08:12

标签: nservicebus

我们正在尝试在相同版本的NSB上进行服务器移动,但转移到另一个框。

需要移动一些超时消息。超时消息有一个响应地址(它必须返回的端点),移动它们的最佳方法是什么。我看到几个选项

1)使用队列资源管理器导入它们并手动编辑响应。如果我们有超过100个超时消息,它将无法管理。我已经验证了这项工作。

2)我尝试使用Andreas最新超时消息的一些代码从(2.6到3.0)移动,看起来底层deseralizer已经改变。我得到:“根元素缺失”,当试图读取身体。我尝试将其反序列化为TimeoutData和Timeoutmessage。

3)我设置了一个端点来监听TimeoutMessage并使用mutator将头部更改为目标端点,这似乎有效,但是超时消息在处理后不会从队列中删除。

因此,我坚持1,我想要一些自动化过程。想法?

2 个答案:

答案 0 :(得分:0)

您最好的选择可能是修改现有的TimeoutMigrator

https://github.com/NServiceBus/NServiceBus/tree/master/src/tools/migration/TimeoutMigrator

然后查看反射器中当前的TimeoutData或查看存储队列中的内容。

然后修改迁移器中的TimeoutData类以匹配当前架构:

https://github.com/NServiceBus/NServiceBus/blob/master/src/tools/migration/TimeoutMigrator/TimeoutData.cs

答案 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();

    }

感谢。