MessageBus:等待处理完成后发送ACK到请求者

时间:2018-08-01 19:11:02

标签: nservicebus masstransit

我们使用外部TCP / IP接口,其中一项要求是保持连接打开,等待处理完成后再发送ACK并返回结果。

假设我们要使用MessageBus(masstransit / nservicebus)与处理模块进行通信并跟踪消息状态:接收,处理,成功,失败,哪种方法是最好的?

具体来说,当消息到达处理程序/消费者时,它将如何知道TCP / IP连接?我应该将其存储在某些自定义容器中,然后注入消费者手中吗?

任何指导表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

使用者将知道如何启动和管理TCP连接生命周期。

接收到消息时,处理程序可以调用代码,该代码根据消息数据执行某些操作。这涉及在屏幕上的某个地方显示绿色的大象还是打开端口,进行呼叫,然后处理ACK,都不会改变消息的处理方式。

负责执行该操作的实际代码可以打包成诸如nuget包之类的东西,并通过某种通用接口进行公开(如果这样会使您更快乐),但是与具有双重角色的组件不矛盾邮件的使用者和邮件的处理者。

  

将为每个消息创建使用者的新实例   接收。另外,就我而言,使用者无法启动TCP / IP   连接,它已经提前打开(并存储在某个位置   其他)和消费者需求就可以使用它。

对不起,我应该更仔细地阅读您的原始问题。

有一种解决方案,可以从NServiceBus共享访问资源,如here所述。

public class SomeEventHandler : IHandleMessages<SomeEvent>
{
    private IMakeTcpCall _caller;

    public SomeEventHandler(IMakeTcpCalls caller)
    {
        _caller = caller;
    }

    public Task Handle(SomeEvent message, IMessageHandlerContext context)
    {
        // Use the caller 
        var ack = _caller.Call(message.SomeData);

        // Do something with ack
        ...

        return Task.CompletedTask;
    }
}

理想情况下,您将拥有一个DI容器,该容器可以作为一个实例来管理 IMakeTcpCall 实例的生命周期(尽管在大容量情况下这可能会很奇怪),以便您可以重新使用开放式TCP通道。

例如,在Castle Windsor中:

Component.For<IMakeTcpCalls>().ImplementedBy<MyThreadsafeTcpCaller>().LifestyleSingleton();

带有NServiceBus的城堡温莎integrates