使用 NServiceBus FileShareDataBus 时清理文件
Cleanup files when using NServiceBus FileShareDataBus
我的问题有点类似于this question,但我认为回复根本没有回答问题。
详细说明,
我有以下代码片段:
配置:
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)。
Documentation 明确指出文件未清理,但我认为这是一种混乱的行为,有人可以帮忙吗?
Is there any way to remove the files after the message has been handled or taken out of the queue or after it lands in the error-queue.
- 消息处理后
- 出队后
- 进入错误队列后
我不太确定你在找什么?您想删除文件,但不确定何时?
NServiceBus 无法确定何时删除文件。也许您正在延迟文件的消息以便稍后处理。或者您将任务交给另一个处理程序。这意味着如果文件被删除,其他处理程序将无法处理该文件。所以删除文件取决于你的功能需求。
当邮件在错误队列中时,您很可能想要再次尝试处理它。为什么要将消息放入错误队列,而不是完全删除消息?
除此之外,文件系统不是事务性的。因此,任何软件都无法判断消息是否得到了正确处理以及文件是否应该被删除。当在 NServiceBus 中启用发件箱时,消息从队列存储中删除,但尚未处理。如果到那时该文件已被删除,则也无法再处理它。
如您所知,在很多情况下,删除文件都会造成问题。唯一真正知道何时可以删除哪个文件的人是作为开发人员的您。您必须想出一个删除文件的策略。
sample 有一个带有静态字段 BasePath
的 class Program
。使其成为 public 以便您的处理程序可以访问它。然后在处理程序中,您可以获得这样的文件位置:
public void Handle(MessageWithLargePayload message)
{
var filename = Path.Combine(Program.BasePath, message.LargeBlob.Key);
Console.WriteLine(filename);
更新
添加了一些关于可能的清理策略的文档。我们有一些非常好的解决方案的计划,但这需要时间。所以现在也许 this can help.
我通过创建一个在可配置的小时数后删除文件的服务解决了文件清理难题。我要说的是,如果有大量总线文件,滚动删除与尝试每天执行一次相比会更成功。
GitHub 上有两个选项已经编码可以使用:
- PowerShell 脚本:
https://gist.github.com/smartindale/50674db76bd2e36cc94f
- Windows 服务:https://github.com/bradjolicoeur/VapoDataBus
PowerShell 脚本适用于少量文件,但我在 运行 可靠地处理大量文件时遇到了问题。
Windows 服务在处理大量数据时可靠且效率更高。
我的问题有点类似于this question,但我认为回复根本没有回答问题。
详细说明, 我有以下代码片段:
配置:
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)。
Documentation 明确指出文件未清理,但我认为这是一种混乱的行为,有人可以帮忙吗?
Is there any way to remove the files after the message has been handled or taken out of the queue or after it lands in the error-queue.
- 消息处理后
- 出队后
- 进入错误队列后
我不太确定你在找什么?您想删除文件,但不确定何时?
NServiceBus 无法确定何时删除文件。也许您正在延迟文件的消息以便稍后处理。或者您将任务交给另一个处理程序。这意味着如果文件被删除,其他处理程序将无法处理该文件。所以删除文件取决于你的功能需求。
当邮件在错误队列中时,您很可能想要再次尝试处理它。为什么要将消息放入错误队列,而不是完全删除消息?
除此之外,文件系统不是事务性的。因此,任何软件都无法判断消息是否得到了正确处理以及文件是否应该被删除。当在 NServiceBus 中启用发件箱时,消息从队列存储中删除,但尚未处理。如果到那时该文件已被删除,则也无法再处理它。
如您所知,在很多情况下,删除文件都会造成问题。唯一真正知道何时可以删除哪个文件的人是作为开发人员的您。您必须想出一个删除文件的策略。
sample 有一个带有静态字段 BasePath
的 class Program
。使其成为 public 以便您的处理程序可以访问它。然后在处理程序中,您可以获得这样的文件位置:
public void Handle(MessageWithLargePayload message)
{
var filename = Path.Combine(Program.BasePath, message.LargeBlob.Key);
Console.WriteLine(filename);
更新 添加了一些关于可能的清理策略的文档。我们有一些非常好的解决方案的计划,但这需要时间。所以现在也许 this can help.
我通过创建一个在可配置的小时数后删除文件的服务解决了文件清理难题。我要说的是,如果有大量总线文件,滚动删除与尝试每天执行一次相比会更成功。
GitHub 上有两个选项已经编码可以使用:
- PowerShell 脚本: https://gist.github.com/smartindale/50674db76bd2e36cc94f
- Windows 服务:https://github.com/bradjolicoeur/VapoDataBus
PowerShell 脚本适用于少量文件,但我在 运行 可靠地处理大量文件时遇到了问题。
Windows 服务在处理大量数据时可靠且效率更高。