使用NServiceBus文件共享选项卡时清理文件

使用NServiceBus文件共享选项卡时清理文件,nservicebus,Nservicebus,我的问题有点类似于,但我认为答案根本没有回答问题 详细说明,, 我有以下代码段: 配置: BusConfiguration busConfiguration = new BusConfiguration(); busConfiguration.EndpointName("Samples.DataBus.Sender"); busConfiguration.UseSerialization<JsonSerializer>(); busConfigurat

我的问题有点类似于,但我认为答案根本没有回答问题

详细说明,, 我有以下代码段:

配置:

    BusConfiguration busConfiguration = new BusConfiguration();
    busConfiguration.EndpointName("Samples.DataBus.Sender");
    busConfiguration.UseSerialization<JsonSerializer>();
    busConfiguration.UseDataBus<FileShareDataBus>().BasePath(BasePath);
    busConfiguration.UsePersistence<InMemoryPersistence>();
    busConfiguration.EnableInstallers();
    using (IBus bus = Bus.Create(busConfiguration).Start())
    ....
总线配置总线配置=新总线配置();
EndpointName(“Samples.DataBus.Sender”);
useConserialization();
busConfiguration.UseDataBus().BasePath(BasePath);
busConfiguration.UsePersistence();
busConfiguration.EnableInstallers();
使用(IBus总线=总线.Create(总线配置).Start())
....
信息:

[TimeToBeReceived("00:01:00")]
public class MessageWithLargePayload : ICommand
{
    public string SomeProperty { get; set; }
    public DataBusProperty<byte[]> LargeBlob { get; set; }
}
[接收时间(“00:01:00”)]
具有较大负载的公共类消息:ICommand
{
公共字符串SomeProperty{get;set;}
公共DataBusProperty LargeBlob{get;set;}
}
这工作正常(它创建队列,在队列中发送消息,为LargeBlob属性创建一个文件并将其存储在基本路径中,接收方接收消息并处理它)

我的问题是:在消息被处理或从队列中取出后,或者在消息到达错误队列后,是否有任何方法可以删除创建的文件(LargeBlob)

文件中明确指出文件未清理,但我认为这是一种混乱的行为,有人能帮忙吗

在消息被处理或从队列中取出后,或者在消息到达错误队列后,是否有任何方法可以删除文件

  • 消息处理后
  • 被带出队列后
  • 在它进入错误队列之后
  • 我真的不知道你在找什么?您想删除文件,但不确定何时删除

    NServiceBus无法确定何时应该删除该文件。可能您正在延迟一条消息,以便稍后处理该文件。或者您将任务交给另一个处理程序。这意味着如果文件被删除,其他处理程序将无法处理该文件。因此,删除文件取决于您的功能需要

    当消息位于错误队列中时,您很可能希望再次尝试并处理它。为什么要将消息放在错误队列中,而不是完全删除消息

    除此之外,文件系统不是事务性的。因此,任何软件都无法判断消息处理是否正确,文件是否应该删除。当在NServiceBus中启用发件箱时,消息将从队列存储中删除,但尚未处理。如果到那时该文件已经被删除,它也无法再被处理


    正如您所知,在许多情况下,删除文件可能会带来问题。唯一真正知道什么时候可以删除哪个文件的人是作为开发人员的您。你必须想出一个策略来删除这些文件


    有一个类
    程序
    ,带有一个静态字段
    BasePath
    。将其公开,以便处理程序可以访问它。然后在处理程序中,您可以获得如下文件位置:

    public void Handle(MessageWithLargePayload message)
    {
        var filename = Path.Combine(Program.BasePath, message.LargeBlob.Key);
        Console.WriteLine(filename);
    
    更新
    添加了一些关于可能的清理策略的文档。我们有一些很好的解决方案,但这需要时间。所以现在可能是这样。

    我通过创建一个服务,在可配置的小时数后删除文件,从而解决了文件清理难题。我要说的是,对于大量的总线文件,如果您执行滚动删除,与尝试每天执行一次相比,您将更加成功

    GitHub上有两个已经编码的选项可以使用:

    • PowerShell脚本:
    • Windows服务:
    PowerShell脚本在低卷情况下工作,但在大卷文件的情况下运行时存在问题


    Windows服务在大容量上是可靠的,而且效率更高。

    “您必须想出一个策略来删除文件。”->好的,好的。问题是怎么做?在我看来,您无法控制文件nservicebus创建的名称或存储位置(哪个子目录)。我能想到的唯一一件事是:定期清空基本目录,这似乎有点骇人听闻?根据用例的不同,您可以让处理程序执行删除文件的操作。或者,您可以向另一个处理程序发送另一条消息以删除该文件。因为这样您就可以在原始事务之外删除文件(这是非事务性的)。因此,文件被处理,所有内容都存储在数据库中,事务被提交。根据您的情况以及您是否使用发件箱,所有内部事务都将进行处理。然后,只有在真正处理文件时才会删除文件。这有意义吗?是的,有意义。我明白了,你告诉我的(我想:-),这一切都有意义。我剩下的问题是一个技术问题:当我不知道要删除哪个文件时,如何删除该文件?据我所知,NServiceBus在时间戳目录中创建了一个文件,其名称为guid。我如何知道哪个文件对应于哪个消息?我已经编辑了原始答案,以包含一个关于如何获取文件位置的代码示例。这对你有用吗?facepalm,我可以自己找到的^^。谢谢你的概念解释和代码。这很有帮助。