質問編集履歴

1

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

2016/08/07 08:57

投稿

rs516
rs516

スコア12

test CHANGED
File without changes
test CHANGED
@@ -28,6 +28,182 @@
28
28
 
29
29
 
30
30
 
31
+
32
+
31
33
  ###補足情報(言語/FW/ツール等のバージョンなど)
32
34
 
33
35
  使用しているのは、java7になります。
36
+
37
+
38
+
39
+
40
+
41
+ ###該当のソースコード
42
+
43
+ package jp.sample;
44
+
45
+
46
+
47
+ import java.io.File;
48
+
49
+ import java.io.FileOutputStream;
50
+
51
+ import java.io.IOException;
52
+
53
+ import java.nio.channels.FileChannel;
54
+
55
+ import java.nio.channels.FileLock;
56
+
57
+
58
+
59
+ /**
60
+
61
+ * ログ出力機能のサンプルクラスです。
62
+
63
+ *
64
+
65
+ */
66
+
67
+ public class LogWritter {
68
+
69
+
70
+
71
+ /** 最大リトライ回数 */
72
+
73
+ private static final int MAX_RETRY_COUNT = 3;
74
+
75
+
76
+
77
+ /** インターバル(ミリ秒) */
78
+
79
+ private static final int RETRY_INTERVAL = 10000;
80
+
81
+
82
+
83
+ public static void main(String[] args) throws IOException {
84
+
85
+
86
+
87
+ logWritter("user123", "OK", "2016-0807-1200-00");
88
+
89
+ }
90
+
91
+
92
+
93
+ /**
94
+
95
+ * ログ出力の処理です。(引数はとりあえず固定値)
96
+
97
+ *
98
+
99
+ * @param userId ユーザーID
100
+
101
+ * @param result 処理結果
102
+
103
+ * @param trunDate 処理日時
104
+
105
+ * @throws IOException
106
+
107
+ */
108
+
109
+ private static void logWritter(String userId, String result, String trunDate) throws IOException {
110
+
111
+
112
+
113
+ // ログ出力内容を編集する
114
+
115
+ StringBuilder sb = new StringBuilder();
116
+
117
+ sb.append(userId);
118
+
119
+ sb.append(result);
120
+
121
+ sb.append(trunDate);
122
+
123
+ sb.append(System.getProperty("line.separator")); // 改行コード
124
+
125
+
126
+
127
+ File file = new File("C:/work/log/test.log");
128
+
129
+ FileOutputStream fs = null;
130
+
131
+ int retryCount = 0;
132
+
133
+ try {
134
+
135
+ while (true) {
136
+
137
+ if (retryCount > MAX_RETRY_COUNT) {
138
+
139
+ break;
140
+
141
+ }
142
+
143
+ fs = new FileOutputStream(file, true);
144
+
145
+ FileChannel ch = fs.getChannel();
146
+
147
+ FileLock lock = null;
148
+
149
+ try {
150
+
151
+ lock = ch.tryLock(); //ロックを取得
152
+
153
+
154
+
155
+ // 他プロセスがロック取得してない場合、ログ出力処理を行う。
156
+
157
+ // ロックがかかっていた場合、1秒待機後にリトライを行う。
158
+
159
+ if (lock != null) {
160
+
161
+ fs.write(new String(sb).getBytes("UTF-8"));
162
+
163
+ break;
164
+
165
+ } else {
166
+
167
+ Thread.sleep(RETRY_INTERVAL);
168
+
169
+ retryCount++;
170
+
171
+ }
172
+
173
+
174
+
175
+ } catch (InterruptedException e) {
176
+
177
+ System.out.println("Thread.sleepで例外発生");
178
+
179
+ e.printStackTrace();
180
+
181
+ break;
182
+
183
+ } finally {
184
+
185
+ if (lock != null) {
186
+
187
+ System.out.println("排他ロックの開放");
188
+
189
+ lock.release();
190
+
191
+ }
192
+
193
+ }
194
+
195
+ }
196
+
197
+ } finally {
198
+
199
+ if (fs != null)
200
+
201
+ System.out.println("ファイルストリームのクローズ");
202
+
203
+ fs.close();
204
+
205
+ }
206
+
207
+ }
208
+
209
+ }