开发者

Locking file across services

What is the best way to share a file between two "writer" services in the same application?

Edit: Sorry I should have given more details I guess.

I have a Service that saves entries into a buffer. When the buffer gets full it writes all the entries to the file (and so on). Another Service running will co开发者_如何学Pythonme at some point and read the file (essentially copy/compress it) and then empty it.


Here is a general idea of what you can do:

public class FileManager
{
    private final FileWriter writer = new FileWriter("SomeFile.txt");
    private final object sync = new object();

    public void writeBuffer(string buffer)
    {
        synchronized(sync)
        {
            writer.write(buffer.getBytes());
        }
    }        

    public void copyAndCompress()
    {
        synchronized(sync)
        {
            // copy and/or compress
        }
    }

}

You will have to do some extra work to get it all to work safe, but this is just a basic example to give you an idea of how it looks.


A common method for locking is to create a second file in the same location as the main file. The second file may contain locking data or be blank. The benefit to having locking data (such as a process ID) is that you can easily detect a stale lockfile, which is an inevitability you must plan for. Although PID might not be the best locking data in your case.

example: Service1:

  • creates myfile.lock
  • creates/opens myfile

Service2:

  • Notices that myfile.lock is present and pauses/blocks/waits
  • When myfile.lock goes away, it creates it and then opens myfile.

It would also be advantageous for you to double-check that the file contains your locking information (identification specific to your service) right after creating it - just in case two or more services are waiting and create a lock at the exact same time. The last one succeeds and so all other services should notice that their locking data is no longer in the file. Also - pause a few milliseconds before checking its contents.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜