我们使用外部TCP / IP接口,其中一项要求是保持连接打开,等待处理完成后再发送ACK并返回结果。
假设我们要使用MessageBus(masstransit / nservicebus)与处理模块进行通信并跟踪消息状态:接收,处理,成功,失败,哪种方法是最好的?
具体来说,当消息到达处理程序/消费者时,它将如何知道TCP / IP连接?我应该将其存储在某些自定义容器中,然后注入消费者手中吗?
任何指导表示赞赏。谢谢。
答案 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