teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

ログ出力機能のコードを追記しました。排他制御を自分なりに組み込んだつもりです。書き込み対象のファイルにロックが取得されていた場合、一定のインターバル後にリトライ処理を行う様にしました。

2016/08/07 08:57

投稿

rs516
rs516

スコア12

title CHANGED
File without changes
body CHANGED
@@ -13,5 +13,93 @@
13
13
 
14
14
  質問ばかりで申し訳ありませんが、ご回答の程宜しくお願い致します。
15
15
 
16
+
16
17
  ###補足情報(言語/FW/ツール等のバージョンなど)
17
- 使用しているのは、java7になります。
18
+ 使用しているのは、java7になります。
19
+
20
+
21
+ ###該当のソースコード
22
+ package jp.sample;
23
+
24
+ import java.io.File;
25
+ import java.io.FileOutputStream;
26
+ import java.io.IOException;
27
+ import java.nio.channels.FileChannel;
28
+ import java.nio.channels.FileLock;
29
+
30
+ /**
31
+ * ログ出力機能のサンプルクラスです。
32
+ *
33
+ */
34
+ public class LogWritter {
35
+
36
+ /** 最大リトライ回数 */
37
+ private static final int MAX_RETRY_COUNT = 3;
38
+
39
+ /** インターバル(ミリ秒) */
40
+ private static final int RETRY_INTERVAL = 10000;
41
+
42
+ public static void main(String[] args) throws IOException {
43
+
44
+ logWritter("user123", "OK", "2016-0807-1200-00");
45
+ }
46
+
47
+ /**
48
+ * ログ出力の処理です。(引数はとりあえず固定値)
49
+ *
50
+ * @param userId ユーザーID
51
+ * @param result 処理結果
52
+ * @param trunDate 処理日時
53
+ * @throws IOException
54
+ */
55
+ private static void logWritter(String userId, String result, String trunDate) throws IOException {
56
+
57
+ // ログ出力内容を編集する
58
+ StringBuilder sb = new StringBuilder();
59
+ sb.append(userId);
60
+ sb.append(result);
61
+ sb.append(trunDate);
62
+ sb.append(System.getProperty("line.separator")); // 改行コード
63
+
64
+ File file = new File("C:/work/log/test.log");
65
+ FileOutputStream fs = null;
66
+ int retryCount = 0;
67
+ try {
68
+ while (true) {
69
+ if (retryCount > MAX_RETRY_COUNT) {
70
+ break;
71
+ }
72
+ fs = new FileOutputStream(file, true);
73
+ FileChannel ch = fs.getChannel();
74
+ FileLock lock = null;
75
+ try {
76
+ lock = ch.tryLock(); //ロックを取得
77
+
78
+ // 他プロセスがロック取得してない場合、ログ出力処理を行う。
79
+ // ロックがかかっていた場合、1秒待機後にリトライを行う。
80
+ if (lock != null) {
81
+ fs.write(new String(sb).getBytes("UTF-8"));
82
+ break;
83
+ } else {
84
+ Thread.sleep(RETRY_INTERVAL);
85
+ retryCount++;
86
+ }
87
+
88
+ } catch (InterruptedException e) {
89
+ System.out.println("Thread.sleepで例外発生");
90
+ e.printStackTrace();
91
+ break;
92
+ } finally {
93
+ if (lock != null) {
94
+ System.out.println("排他ロックの開放");
95
+ lock.release();
96
+ }
97
+ }
98
+ }
99
+ } finally {
100
+ if (fs != null)
101
+ System.out.println("ファイルストリームのクローズ");
102
+ fs.close();
103
+ }
104
+ }
105
+ }