- PR -

Excel取込み処理でサーバがダウンした

投稿者投稿内容
a-san
ベテラン
会議室デビュー日: 2004/06/01
投稿数: 53
投稿日時: 2007-10-09 21:02
複数同時に実行しないようにするのであれば、こんな感じでしょう。
引数や戻り値は適当に決めてください。
試してないのでマチガイがあったらゴメンナサイ。
コード:
public class MyServlet extends HttpServlet {
    public void doPost(HttpServletRequest req, HttpServletResponse resp) {

        // Excelの処理を呼ぶ
        ExcelUtilities.process(...);

    }
}
// Excelを使う処理はココにまとめる。
public class ExcelUtilities {
    public static synchronized void process(...) {
        ReleaseManager rm = new ReleaseManager();
        try {
            ExcelApplication excel = new ExcelApplication(rm);

            // ここにやりたい処理を書く。

            excel.Quit();
        } catch(Exception e) { e.printStackTrace(); }
        finally { rm.release(); }
    }
}

Java1年生
会議室デビュー日: 2007/10/08
投稿数: 12
投稿日時: 2007-10-09 21:40
a-sanさん、返答ありがとうございます。
試してみたいと思います。
Java1年生
会議室デビュー日: 2007/10/08
投稿数: 12
投稿日時: 2007-10-13 17:30
a-sanさん、
教えていただいた、
synchronized を使用して、
排他取ることができました。
ただ、レスポンスの問題はでますが、
サーバがダウンするよりはいいかと思うので、
とりあえずは、この処理で応急処置をして、
最終的にはじっくり考えたいと思います。

ありがとうございました。


ご参考までに、対処したソースです。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

//Lock用オブジェクト
private static Object lockObj = new Object();

/**
* Excel帳票を開き、すべての名前ボックス
* のデータを取得し、
* String配列で戻す
*
* @param path
* @param fileName
* @return
*/
private String[] getData(File file) throws Exception {

String[] str = null;

synchronized (lockObj) {

System.out.println("Excel取込み処理 開始");

// 定義が取得されていなければ、定義を取得する
ReleaseManager rm = new ReleaseManager();
ExcelApplication excel = null;
ExcelWorkbook book = null;
try {
// 読取り可能であれば、ファイルを開き、定義を取得する
if (file.canRead()) {
//Excelアプリケーションを作成
excel = new ExcelApplication(rm);

//Bookを開く
book = excel.Workbooks().Open(file.getCanonicalPath());
IDispatch names = (IDispatch) book.get("Names");

//名前つきセルの、名前をすべて取得する
int len = (Integer)names.get("Count");
str = new String[len];

//名前付セルのデータを取得する
for (int j = 1 ; j <= len ; j++) {
//Itemオブジェクト取得
IDispatch name =
(IDispatch) names.method("Item", new Object[]{j});
String key = (String) name.get("Name");
str[j-1] = key;

//名前付きセルのデータ取得
IDispatch temp = (IDispatch) name.get("RefersToRange");
ExcelRange range = new ExcelRange(temp);
int rowNum = ((Integer)(((IDispatch)range.get("Rows")).get("Count"))).intValue(); //行数

//単一行データ
String value ="" ;
if (rowNum == 1 && key.indexOf("itm") >= 0) {
value = range.Text().replaceAll(" ", " ").trim();
headCell.put(key, value);
hSheet.put(key, range.Worksheet().Name());
hAddress.put(key, ((String) range.get("Address")).replaceAll("\\$", ""));

//複数行データ
} else if (key.indexOf("itm") >= 0) {
String[] values1 = new String[rowNum];
String[] values2 = new String[rowNum];
String[] values3 = new String[rowNum];
for (int k = 0; k<rowNum; k++) {
ExcelRange aryRange = range.Item(k + 1, 1);
String tmp = aryRange.Text();
values1[k] = tmp;
values2[k] = aryRange.Worksheet().Name();
values3[k] = ((String) aryRange.get("Address")).replaceAll("\\$", "");
}
bodyCell.put(key, values1);
bSheet.put(key, values2);
bAddress.put(key, values3);
}

//System.out.println("key="+key+" value="+value);
}

//Bookを閉じる
book.Close(false, null, true);
book = null;
//Excel終了
excel.Quit();
excel = null;
}

} catch (Exception e) {
e.printStackTrace();
//Bookを閉じる
book.Close(false, null, true);
book = null;
//Excel終了
excel.Quit();
excel = null;
//エラーメッセージ
throw new Exception ("Excelファイルデータ取得に失敗しました。");
} catch (Throwable e) {
e.printStackTrace();
} finally {
//タスクを開放する
rm.release();
}

System.out.println("Excel取込み処理 終了");
}

return str;

}


スキルアップ/キャリアアップ(JOB@IT)