フレンド、Dateを操作する静的メソッドです。マルチスレッドの問題
私は私の生産コードの変更を抽出しています。
次のコードを実行すると、auditdate1を渡してgetDateEndOfDay
を実行していますが、「TestDateProblem:Problem with getYear method」が表示されます。
日付が正しく設定されているため、私の生産コードのキャッチブロック内のロガーでこれを見ることができたため、実際にはこの問題を解決できませんでした。私はあなたの助けがひどく必要です。
このgetDateEndOfDay
メソッドは多くのパブリックメソッドから呼び出され、複数のスレッドがこれらの静的メソッドを同時に呼び出す可能性があります。
package test;
import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
public class TestDateProblem {
public static void main(String args[]) {
/*
* This is the date format that is mostly used. Logger shows this kind
* of date during Exception.
*/
String auditdate1 = "2011-12-27";
// Rarely sent this way.
String auditdate2 = "27-12-2011";
/*
* We don't send this way but I'm sure the problem occurs if the date goes this
* way. As far as the inputs are concerned, it doesn't go like this.
*/
String auditdate3 = "27-2011-12";
try {
System.out.println("Result1:" + getDateEndOfDay(auditdate1));
System.out.println("Result2:" + getDateEndOfDay(auditdate2));
// simulating problem?
System.out.println("Result3:" + getDateEndOfDay(auditdate3));
} catch (Exception e) {
System.out.println("auditdate1:" + auditdate1);
}
}
/*
* This getDateEndOfDay(.) method is called from many public methods and it
* may be possible that multiple threads are calling these static methods at
* the same time.
*/
public static Date getDateEndOfDay(String dateparam) throws Exception {
String separator = "/";
dateparam = dateparam.replace("-", separator);
String[] strP = dateparam.split(separator);
Integer year = getYear(strP);
Integer month = getMonth(strP);
Integer day = getDay(strP);
GregorianCalendar cal = new GregorianCalendar(year, month - 1, day, 23,
59, 00);
return cal.getTime();
}
private static Integer getYear(String[] dateComponents) throws Exception {
if (dateComponents.length != 3) {
return 1900;
}
System.out
.println("dateComponents::" + Arrays.toString(dateComponents));
Integer val1 = Integer
.valueOf(dateComponents[0].startsWith("0") ? dateComponents[0]
.substring(1) : dateComponents[0]);
Integer val2 = Integer
.valueOf(dateComponents[2].startsWith("0") ? dateComponents[2]
.substring(1) : dateComponents[2]);
if (val1 > 1900) {
return val1;
} else if (val2 > 1900) {
return val2;
} else {
// Original code throws exception instead of printing to console.
System.out.println("TestDateProblem: Problem with getYear method.");
throw new Exception();
}
}
private static Integer getDay(String[] dateComponents) {
if (dateComponents.length != 3) {
return -1;
}
Integer val1 = Integer
.valueOf(dateComponents[0].startsWith("0") ? dateComponents[1]
.substring(1) : dateComponents[0]);
Integer val2 = Integer
.valueOf(dateComponents[2].startsWith("0") ? dateComponents[1]
.substring(1) : dateComponents[2]);
if (val1 <= 31) {
return val1;
} else if (val2 <= 31) {
return val2;
} else {
System.out.println("TestDateProblem: Problem with getDay method.");
return 0;
}
}
private static Integer getMonth(String[] dateComponents) {
if (dateComponents.length != 3) {
return 0;
}
Integer val1 = Integer
.valueOf(dateComponents[1].startsWith("0") ? dateComponents[1]
.substring(1) : dateComponents[1]);
if (val1 <= 12 && val1 >= 1) {
return val1;
} else {
System.out
.println("TestDateProblem:: Problem with getMonth method");
return 0;
}
}
}
確かに読みにくい無意味なコードがたくさんあります。私のお気に入りは 'Integer val1 = Integer .valueOf(dateComponents [0] .startsWith(" 0 ")?dateComponents [0] .substring(1):dateComponents [0])'ユニットテストを追加して使用することをお勧めします失敗した場合のデバッガ –
あなたの答えをありがとう。私は元のコードを書いていない。私はときどき発生する生産バグを修正しようとしています。だから、これは常に再現可能ではないので、私はいくつかのスレッドの問題を疑っていました。この問題は、新しいバッチを実行しているときに発生することがあります。 – matlapudi
無効なメッセージの完全な入力を表示するためにエラーメッセージを変更できますか?そうすることで、無効な入力を使用すると毎回同じエラーが発生することがわかります。 –