0

リスナーのイベントが発生するまでメソッドを待機させたい。どうすればこれを達成できますか? 私のプログラムでは、イベントの結果がいくつかの基準を満たすまでループしたいのですが、それ以外の場合はリクエストを際限なく送信します

public void run(double r, double sigma, double strike, double s0, String t, int d) throws JMSException, InterruptedException {
  double actureError = 0.0;
  double epsilon = 0.00001;

  // iterate until the relative error rate is less than requested (converged)
  while ((actureError < epsilon) || (actureError > ESTIMATION_ERROR)) {
    sendRequest(r, sigma, strike, s0, t, d);

    Topic topic = session.createTopic("topic");
    MessageConsumer consumer = session.createConsumer(topic); 
    OptionMessageListener listener = new OptionMessageListener(task);
    consumer.setMessageListener(listener);

    double absoluteError = y * task.getSigma()
      / Math.sqrt(task.getCount());
    actureError = absoluteError / (task.getAvg() + epsilon);
  }

  return task.getAvg() * Math.exp(-r * 252);
}

public void sendRequest(double r, double sigma, double strike, double s0, String t, int d) throws JMSException {
  // send request to the client
  MessageProducer producer = session.createProducer(queue);
  OptionRequest request = new OptionRequest(r, sigma, strike, s0, t, d, null);
  ObjectMessage requestMessage = session.createObjectMessage(request);
  producer.send(requestMessage);
}

public class OptionMessageListener implements MessageListener {
  private Task task;

  public OptionMessageListener(Task task) {
    this.task = task;
  }

  @Override
  public void onMessage(Message message) {
    if (message instanceof ObjectMessage) {
      ObjectMessage objectMessage = (ObjectMessage) message;
      try {
        Result result = (Result) objectMessage.getObject();      
        double payout = result.getPayout();
        task.addPayout(payout);
      } catch (JMSException e) {
        e.printStackTrace();
      } 
    }
  }
}

私はactiveMQを初めて使用しています。誰か助けてもらえますか? ありがとう!

4

1 に答える 1

0

1 に設定された CountDownLatch を作成し、メイン アプリで待機します。次に、条件が満たされたときに onMessage メソッドでラッチをカウントダウンさせることができます。これにより、待機呼び出しにタイムアウト値を設定して、アプリが起動し、シャットダウンする時間や他の作業などを行う時間かどうかを確認することもできます。

于 2013-04-14T10:14:26.193 に答える