###前提・実現したいこと
Google Maps APIのKMLLayerにDBから取得したデータで作成したKMZファイルを表示させるプログラムを作成しています。
Google Maps APIで実装したWebサイトからHTTPリクエストをServletで受け
リクエストパラメータを元にDBを検索し、結果をKMZとして返却するプログラムを作成しました。
地図上で条件指定しリクエスト→Servlet→DB検索→KMZファイル作成→KMZバイナリデータ返却→地図上にKMZレイヤー表示
という流れになります。
データ取得に時間がかからない場合は問題なくGoogle Maps APIにKMLLayerとしてKMZを表示できるのですが、
DBからデータを作成する際に目安として10秒以上かかるようなデータを取得する場合、以下のエラーが発生します。
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
KMLLayerを表示する場合、Google側のサーバからアクセスされていることから
Google Maps API内でタイムアウトと判断し、接続を切断しているのではないかと推測しています。
###該当のソースコード
以下のようにKMZファイルをHttpServletResponseとして返却するプログラムを記述しています。
protected void doGet(HttpServletRequest request, HttpServletResponse response) { try { // DBを検索し、KMZファイルを作成 createKMZ(); // KMZの返却 try (InputStream in = new FileInputStream("kmzFile.kmz"); OutputStream out = response.getOutputStream()) { response.setContentType("application/vnd.google-earth.kmz"); response.setHeader("Content-Disposition", "filename=kmzFile.kmz"); byte[] buff = new byte[1024]; int len = 0; while ((len = in.read(buff, 0, buff.length)) != -1) { out.write(buff, 0, len); } out.flush(); } catch (IOException e) { } } catch (Exception e) { } }
上記プログラムの createKMZ() 内部の処理時間がかかるためタイムアウトが発生していると推測しているため
createKMZ() を非同期処理にし、HTTP接続を維持することができれば解決するのではないかと考えていますが
実装の方法がわかりません。
どなたか同じような問題に直面した経験がある方がいらっしゃれば解決方法をご教示頂きたいと思います。
よろしくお願いいたします。
###補足情報(言語/FW/ツール等のバージョンなど)
Server version: Apache Tomcat/8.0.39
OS Version: 3.10.0-514.el7.x86_64
JVM Version: 1.8.0_111-b15
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/10 04:39