- PR -

キュー管理について

1
投稿者投稿内容
けんしろう
会議室デビュー日: 2003/10/09
投稿数: 10
投稿日時: 2005-11-28 19:27
お世話になっております。
現在ServletからCOBOLのプログラムを呼び出す処理を作成しています。
そこでCOBOLのプログラムが1件ずつしか処理を行えないため、呼び出しもとのWebシステム(Javaプログラム)内でキュー管理を行う必要があります。
ThreadPoolExecutorクラスを用いキュー管理を試みたのですが、同時にクライアントからアクセスした場合キュー管理を行わず、同時に実行されてしまいます。
サンプルや事例などがあればご教授いただきたいと思います。
よろしくお願いいたします。

実行環境
OS:Windows Server 2000
APサーバ:Tomcat5.5
jdk:1.5

シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-11-28 23:14
ThreadPoolExecutorにプールするワーカースレッドを1個に限定して
いますか?2個以上を設定すれば,同時に動作してしまうとおもいます。
けんしろう
会議室デビュー日: 2003/10/09
投稿数: 10
投稿日時: 2005-11-29 20:04
シュンさん返信ありがとうございます。

Servletのinit()メソッド部分でThreadPoolExecutorオブジェクトを作成することでキュー管理は解決したのですが新たに問題が発生してしまいました。。。
run()メソッド内でCOBOLのdllを呼ぶメソッドを使用しているのですがCOBOLからの結果が返ってくる前に次の処理(*1)が実行されてしまいます。とりあえず今は結果が返ってくるまでsleep()をかませているのですがよい方法があればご教授いただきたいと思います。
よろしくお願いします。


コード------------------------------------------------------

Runnableインタフェース実行クラス {

String result = null;
String param = null;
COBOLTest obj = new COBOLTest();
boolean flag = false;

public void run() {
try{
// COBOL連携用メソッドの呼び出し
result = obj.getMessage(param);
flag = true;
} catch(Exception re) {
re.printStackTrace();
}
}

// Servletから呼ばれるメソッド
public String execProcess(String param ThreadPoolExecutor t){

this.param = param;
t.execute(this);
while (flag != true){
try{
Thread.sleep(500);
}catch(Exception e){}
}
return result; <- nullが返ってくる!! ..*1
}
}
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-11-29 20:30
定石としてはこんな感じですかね。コンパイルもしてないので間違ってたらすいません。

コード:
  public synchronized void run() {
    try{
      // COBOL連携用メソッドの呼び出し
      result = obj.getMessage(param);
      flag = true;
    } catch(Exception re) {
      re.printStackTrace();
    } finally {
       notifyAll();
    }
  }

  // Servletから呼ばれるメソッド
  public synchronized String execProcess(String param ThreadPoolExecutor t){

    this.param = param;
    t.execute(this);
    try {
      wait();
    } catch (InterruptedException ignored) {
    }
    return result;
  }
}

シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-12-02 02:27
???
処理結果の受信と後続処理を同期したい要求があるなら、なぜExecutorを利用
して別スレッドで非同期実行するのでしょうか?
execProcess()のなかでCOBOL連携用メソッドを呼び出して、終了までブロック
してもらえばよいと思うのですが…

execProcess()が同時に2スレッドで実行されたくないということなら、この
メソッドをsynchronizedで修飾してはいかがでしょうか。
1

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