Nservicebus MessageBus:处理完成时等待,并向请求者发送ACK

Nservicebus MessageBus:处理完成时等待,并向请求者发送ACK,nservicebus,masstransit,Nservicebus,Masstransit,我们使用外部TCP/IP接口,其中一个要求是保持连接打开,在处理完成时等待,并将结果发送回ACK 假设我们希望使用MessageBus(masstransit/nservicebus)与处理模块通信并跟踪消息状态:接收、处理、成功、失败,那么实现这一目标的最佳方法是什么 具体来说,当消息到达处理程序/使用者时,它将如何知道TCP/IP连接?我是否应该将其存储在某个定制容器中并将其注入消费者 感谢您的指导。谢谢。消费者将知道如何启动和管理TCP连接生命周期 当收到消息时,处理程序可以调用代码,该代

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

假设我们希望使用MessageBus(masstransit/nservicebus)与处理模块通信并跟踪消息状态:接收、处理、成功、失败,那么实现这一目标的最佳方法是什么

具体来说,当消息到达处理程序/使用者时,它将如何知道TCP/IP连接?我是否应该将其存储在某个定制容器中并将其注入消费者


感谢您的指导。谢谢。

消费者将知道如何启动和管理TCP连接生命周期

当收到消息时,处理程序可以调用代码,该代码根据消息数据执行某些操作。无论是在屏幕上某处显示一个绿色的大象,还是打开一个端口、拨打一个电话,然后处理ACK,都不会改变您处理消息的方式

负责执行操作的实际代码可以打包成类似nuget包的东西,并通过某种通用接口公开(如果这让您更高兴的话),但与作为消息消费者和消息处理器的双重角色的组件并不矛盾


将为每条消息创建消费者的新实例 接收。另外,在我的例子中,使用者不能启动TCP/IP 连接时,它已在前面打开(并存储在某个位置 除此之外),消费者需要的只是能够使用它

对不起,我应该仔细阅读你原来的问题

有一种从NServiceBus共享访问资源的解决方案,如文档所示

public类SomeEventHandler:IHandleMessages
{
专用IMAKETCPCALLu呼叫者;
public SomeEventHandler(IMakeTcpCalls调用者)
{
_呼叫者=呼叫者;
}
公共任务句柄(SomeEvent消息、IMessageHandlerContext上下文)
{
//使用呼叫者
var ack=\u caller.Call(message.SomeData);
//用ack做点什么
...
返回Task.CompletedTask;
}
}
理想情况下,您应该有一个DI容器,将ImakeCpCall实例的生命周期作为一个单例进行管理(尽管在大容量场景中这可能会变得很奇怪),这样您就可以重新使用开放的TCP通道

例如,在:

Component.For().ImplementedBy().LifestyleSingleton();

Castle Windsor with NServiceBus

我是否正确理解TCP/IP连接用于监控NServiceBus中的消息处理状态?为什么需要保持连接打开?@HadiEskandari,当消息来自外部接口时,它会触发某些操作,如“创建顺序”。它需要确认订单是在同一个打开的TCP/IP连接上创建的还是失败的。不幸的是,它不支持延迟的后续响应。这些接口是30年前设计的,我们不能更改它们…将为每个接收到的消息创建一个新的消费者实例。另外,在我的例子中,消费者不能启动TCP/IP连接,它已经在前面打开(并存储在其他地方),消费者只需要有权使用它。听起来这些信息应该被注入到消费者()中。谢谢,这很有意义。就我而言,我必须使用MassTransit和Autofac。我相信这里也支持类似的功能。
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;
    }
}
Component.For<IMakeTcpCalls>().ImplementedBy<MyThreadsafeTcpCaller>().LifestyleSingleton();