使用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)
文件中明确指出文件未清理,但我认为这是一种混乱的行为,有人能帮忙吗
在消息被处理或从队列中取出后,或者在消息到达错误队列后,是否有任何方法可以删除文件
正如您所知,在许多情况下,删除文件可能会带来问题。唯一真正知道什么时候可以删除哪个文件的人是作为开发人员的您。你必须想出一个策略来删除这些文件
有一个类
程序
,带有一个静态字段BasePath
。将其公开,以便处理程序可以访问它。然后在处理程序中,您可以获得如下文件位置:
public void Handle(MessageWithLargePayload message)
{
var filename = Path.Combine(Program.BasePath, message.LargeBlob.Key);
Console.WriteLine(filename);
更新
添加了一些关于可能的清理策略的文档。我们有一些很好的解决方案,但这需要时间。所以现在可能是这样。我通过创建一个服务,在可配置的小时数后删除文件,从而解决了文件清理难题。我要说的是,对于大量的总线文件,如果您执行滚动删除,与尝试每天执行一次相比,您将更加成功 GitHub上有两个已经编码的选项可以使用:
- PowerShell脚本:
- Windows服务:
Windows服务在大容量上是可靠的,而且效率更高。“您必须想出一个策略来删除文件。”->好的,好的。问题是怎么做?在我看来,您无法控制文件nservicebus创建的名称或存储位置(哪个子目录)。我能想到的唯一一件事是:定期清空基本目录,这似乎有点骇人听闻?根据用例的不同,您可以让处理程序执行删除文件的操作。或者,您可以向另一个处理程序发送另一条消息以删除该文件。因为这样您就可以在原始事务之外删除文件(这是非事务性的)。因此,文件被处理,所有内容都存储在数据库中,事务被提交。根据您的情况以及您是否使用发件箱,所有内部事务都将进行处理。然后,只有在真正处理文件时才会删除文件。这有意义吗?是的,有意义。我明白了,你告诉我的(我想:-),这一切都有意义。我剩下的问题是一个技术问题:当我不知道要删除哪个文件时,如何删除该文件?据我所知,NServiceBus在时间戳目录中创建了一个文件,其名称为guid。我如何知道哪个文件对应于哪个消息?我已经编辑了原始答案,以包含一个关于如何获取文件位置的代码示例。这对你有用吗?facepalm,我可以自己找到的^^。谢谢你的概念解释和代码。这很有帮助。