【发布时间】:2015-08-21 23:42:13
【问题描述】:
我正在开发一个带有JTextArea 的简单swing 应用程序来显示来自整个应用程序的日志消息。为了开发这个应用程序,我使用了 MVC 模式的简化版本,其中控制器在两个方向上都介于视图和模型之间:
- 当用户与摇摆控件交互时,如果此交互需要访问模型(即,它需要读取和/或写入模型),那么摇摆控件引发的事件将调用适当的控制器方法;
- 当应该更新视图时,控制器会调用视图的一个或多个方法。
几乎所有的异常都在控制器中被捕获并发送到java.util.logging.Logger,如下面的代码sn-p。
public void onWriteFile() {
try {
// ...
}
catch(IOException ex) {
Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "onWriteFile()", ex);
}
view.refresh(...);
}
只有以下异常会在自定义图形组件中被捕获并发送到记录器(我从 清单 6 中的示例中获得灵感。Java theory and practice: Be a good (event) listener 的稳健侦听器调用)。
private synchronized void processDrawingEvent(DrawingEvent e) {
if (e == null) {
return;
}
for (Iterator<DrawingListener> i = listeners.iterator(); i.hasNext();) {
DrawingListener listener = i.next();
try {
switch (e.getStatus()) {
case DRAWING:
listener.drawing(e);
break;
case DONE:
listener.done(e);
break;
case DELETED:
listener.deleted(e);
break;
}
} catch (RuntimeException ex) {
i.remove();
Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
目前对Logger.log(...) 方法的所有调用都来自同一个线程。但是,如果这个方法被不同的线程调用,我应该使用this这样的解决方案吗?
【问题讨论】:
-
看看 Log4j2。它有一个内置的异步记录器
-
Logger reference (JDK 7) 明确指出
All methods on Logger are multi-thread safe。 ++ 你似乎在调查an specific AsyncFileHandler implementation。我不知道这是否是一个适当的问题。 ++ 对于 IO 密集型日志记录(可能独立于多线程),该答案似乎已经足够了。 ++ 我会说去吧(我不会为你测试它)。 -
您的开发看起来像一个富客户端(Swing)。我不希望有大量的日志记录。我会保持简单并专注于实际问题。
标签: java multithreading swing logging model-view-controller