1

我有一个 tomcat 服务器,我有一个控制器,它写入一个文件,数据来自请求。所以我怀疑服务器中的多个线程是否可以同时写入同一个文件并导致问题?

我的要求是所有请求都将数据附加到同一个文件中。我没有使用任何线程。

我的代码如下:

File file = new File(fileName); 
try { 
    if(!file.exists()) { 
        file.createNewFile();    
    }
    InputStream inputStream = request.getInputStream();
    FileWriter fileWriter = new FileWriter(fileName,true);
    BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
    bufferWriter.write(IOUtils.toString(inputStream));
    bufferWriter.flush(); 
    bufferWriter.close(); 
}
4

2 回答 2

2

此类问题有标准解决方案。

您必须创建singleton类,它将在所有线程之间共享。

singleton将有一些BlockingQueue(例如LinkedBlockingQueue),其中所有线程都会将它们的消息放入单个文件中。

singleton本身也将是它的方法Thread内部run(),它会不断地take从所需的文件中取值queue并按顺序将其写入所需的文件中。

于 2013-02-05T13:19:33.277 回答
0

我的要求是所有请求都将数据附加到同一个文件

最好使用过滤器javax.servlet.Filter(您不必手动创建单例,您可以在需要或不需要其功能时打开或关闭过滤器。

但是,您仍然需要同步对文件的并发访问。正如 Andremoniy 指出的那样,您可以使用自己的线程来执行此操作,这样您的过滤器就不会阻塞请求/响应。

编辑

关于用于写入文件的共享对象的一件事:最好将此对象的实例存储在javax.servlet.ServletContext而不是创建单例对象中。如果您需要使用 servlet 让 Java Web 应用程序中的所有其他组件都可以访问一个对象,那么这是标准方法。

于 2013-02-05T13:47:23.400 回答