使用NServiceBus FileShareDataBus时清理文件

时间:2016-01-20 14:21:06

标签: nservicebus

我的问题与moving away from presentational tags类似,但我认为答案根本没有回答这个问题。

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

配置:

    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())
    ....

消息:

[TimeToBeReceived("00:01:00")]
public class MessageWithLargePayload : ICommand
{
    public string SomeProperty { get; set; }
    public DataBusProperty<byte[]> LargeBlob { get; set; }
}

这很好用(它创建队列,在队列中发送消息,为LargeBlob属性创建一个文件并将其存储在基本路径中,接收者接收消息并处理它)。

我的问题是:在处理完消息或从队列中取出消息之后,还是有任何方法可以删除创建的文件(LargeBlob)。

this question明确指出文件没有清理,但我认为这是一种混乱的行为,任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

  

有没有办法在处理完邮件或从队列中删除邮件之后或在邮件进入错误队列之后删除文件。

  1. 处理完消息后
  2. 退出队列后
  3. 在错误队列
  4. 之后

    我不确定你追求的是什么?你想删除文件,但你不确定什么时候?

    NServiceBus无法确定何时应删除该文件。也许您推迟了稍后要处理的文件的消息。或者你将任务交给另一个处理程序。这意味着如果删除文件,其他处理程序无法处理该文件。因此删除文件取决于您的功能需求。

    当邮件在错误队列中时,您很可能想要再次尝试处理它。为什么还要将消息放在错误队列中,而不是仅仅删除消息?

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

    正如您所知,有很多情况下删除文件可能会造成问题。唯一真正知道何时可以删除哪个文件的人是您作为开发人员。您必须提出删除文件的策略。

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

    public void Handle(MessageWithLargePayload message)
    {
        var filename = Path.Combine(Program.BasePath, message.LargeBlob.Key);
        Console.WriteLine(filename);
    

    <强>更新 添加了一些有关可能的清理策略的文档。我们有一些非常好的解决方案,但这需要时间。所以现在也许this can help

答案 1 :(得分:1)

我通过创建一个服务来解决文件清理挑战,该服务在可配置的小时数后删除文件。我会说,对于大量的总线文件,如果你进行滚动删除而不是每天尝试一次,你会更成功。

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

PowerShell脚本适用于低容量,但我遇到了使用大量文件可靠运行的问题。

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