- - PR -
Excel取込み処理でサーバがダウンした
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-10-09 21:02
複数同時に実行しないようにするのであれば、こんな感じでしょう。
引数や戻り値は適当に決めてください。 試してないのでマチガイがあったらゴメンナサイ。
| ||||
|
投稿日時: 2007-10-09 21:40
a-sanさん、返答ありがとうございます。
試してみたいと思います。 | ||||
|
投稿日時: 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; } |