Seaside: CannotDeleteFileException: 无法删除旧版本的燃料文件

Seaside: CannotDeleteFileException: Could not delete the old version of fuel file

在 pharo seaside 应用程序中,单击主页按钮,所有数据将保存在燃料文件中,class 名称为 Test.fl。如果我在两个实例中一次调用同一个主页,两者都调用下面的代码来保存 Test.fl 文件和最新更新,

FLSerializer
    serialize: self allObjects
    toFileNamed: self name , '.fl'**

并出现异常:

CannotDeleteFileException: Could not delete the old version of file ...\Pharo3.0\Test.fl

并且我已经使用 Mutex 允许在第一个实例之后执行另一个实例,

mutexBlock := Mutex new.
mutexBlock critical: [
    FLSerializer
        serialize: self allObjects
        toFileNamed: self name , '.fl' ]

但我仍然遇到同样的错误

CannotDeleteFileException: Could not delete the old version of file

请任何人帮我解决这个错误。

您的直觉很可能是正确的:两个进程正试图同时写入(删除)同一个文件。但是,您的 Mutex 方法将不起作用,因为每次执行该代码时都会创建一个新的 Mutex 。您必须将 Mutex 存储在 class 或实例变量中(取决于您的代码的工作方式),以便每个进程都将使用 相同的实例 Mutex.

您的代码将如下所示:

MyClass class>>serializeProtect
    ^ SerializeProtect ifNil: [ SerializeProtect := Mutex new ]

self class serializeProtect critical: [
    FLSerializer
        serialize: self allObjects
        toFileNamed: self name , '.fl' ]

注意:惰性初始化 Mutex 通常 安全。为了简单起见,我只是在这里这样做。

那里不需要互斥锁。 Pharo 的 Seaside 一次处理一个请求。也就是说,这仅在您的文件写入速度很快时才有效,因为所有其他连接都在等待写入完成。如果不是,则需要在单独的线程中进行写入,然后确实控制对它的访问