2011-09-29 29 views
4

我正在使用Webmethods集成服务器。里面有一个java服务,采用静态java方法,通过使用BufferedWriter和FileWriter将数据写入日志文件(server.log)。静态方法的代码是这样的:我是否需要通过使用BufferedWriter和FileWriter将数据写入同一文件实现同步?

public static void writeLogFile(String message) throws ServiceException{ 
    try { 
     BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true)); 
     bw.write(message); 
     bw.newLine(); 
     bw.close(); 
    } catch (Exception e) { 
     throw new ServiceException(e.getMessage()); 
    } 
} 

注:
-The代码已被简化例如目的。
- 我无法更改writeLogFile方法声明和属性。这意味着,它将始终是:public static void writeLogFile。禁止这种修改:public synchronized void writeFile。

有可能writeLogFile方法可以被不同的实例调用,所以我需要确保没有两个或更多的实例在同一时间访问相同的资源(server.log)。这意味着,如果有两个实例尝试访问server.log,则其中一个实例必须等待另一个实例才能将数据写入server.log。

问题是: 我应该更改上面的代码吗?如果是这样,我需要做什么样的修改?我应该在java静态方法中实现“synchronized”吗?

@EJP:
所以,下面哪一个是最好的代码来实现同步?

1)

 FileWriter fw = new FileWriter("./logs/server.log", true); 
     synchronized (fw) { 
      BufferedWriter bw = new BufferedWriter(fw); 
      bw.write(message); 
      bw.newLine(); 
      bw.close(); 
     } 

2)

 BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true)); 
     synchronized(bw) { 
      bw.write(message); 
      bw.newLine(); 
      bw.close(); 
     } 

3)

 synchronized(util.class) { //yes, the class name is started with lowercase 
      BufferedWriter bw = new BufferedWriter(new FileWriter("./logs/server.log", true)); 
      bw.write(message); 
      bw.newLine(); 
      bw.close(); 
     } 

4)其它意见?

谢谢。

回答

2

只要使方法同步。它不影响其用于二进制兼容性目的的方法签名。

+0

我不能这样做,因为我不能更改方法声明。这是一个来自webmethods的固定规则,它始终是:public static void xxx – null

+0

@suud:'synchronized'不需要声明。您只能将其放入定义中。 –

+0

因此,在代码里面放置一个同步的(XXX.class)块。但是我个人会尽力让作者开放。 – EJP

-1

号的基类的BufferedWriter和FileWriter的是java.io.Writer中,

它有它在每次写操作

Object java.io.Writer.lock 

The object used to synchronize operations on this stream. 

尝试让BufferedWriter将体重静态和裁判它自己的锁通过一个静态方法,因此,所有的写操作写经相同作家到文件对象

顺便说一句,我想你正在发明尚未另一个日志-lib的...可能是你可以使用log4j的或任何形式的日志而不是

+0

不是。那是一个实例成员。此方法的每个调用者都将获得自己的FileWriter和BufferedWriter实例。 – EJP

+0

我不使用log4j的,因为log4j的不支持这种情景:在写入其输出日志文件名具有图案的附加器日志文件:moduleName_currentDate.log(中的currentdate的模式是年月日)。 – null

+0

log4j支持在运行时创建FileAppender。检查FileAppender的参数化构造函数http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html – swanliu

0

我有另一个建议。我猜同步可以被视为一个方面,同样可以使用一些AOP框架来实现。这符合你不改变代码的要求。但我不是100%肯定它和posted a question相同。请监视它的回应。

相关问题