代码之家  ›  专栏  ›  技术社区  ›  Swamy g

异步Web服务,回调问题

  •  1
  • Swamy g  · 技术社区  · 16 年前

    我有一个使用axis2的异步Web服务,我使用相同的回调hanlder调用两个不同的时间,如下所示:

    stub.startGetData("Foo",callbackhandler)
     stub.startGetData("bar",callbackhanlder)
    
     ServiceCallBackhandler callbackhandler =  new ServiceCallBackhandler() { .....};
     //ServiceCallBackhanlder and stub are generated from a WSDL file
    
     Synchronized(callbackhandler){ callbackhandler.wait()}
     //remaining code to be executed
          ............
          ...........
    

    在这种情况下,问题是一旦调用在 stub.startGetData("Foo",callbackhandler) . 我希望回调等待它也完成处理 stub.startGetData("boo",callbackhandler) 语句,然后执行其余代码。有没有一种不使用两个不同的回调函数的方法,因为两个返回值的处理是相同的?谢谢。

    2 回复  |  直到 16 年前
        1
  •  2
  •   David Roussel    16 年前

    我想你想要这样的东西…

     import java.util.concurrent.CountDownLatch;
     ...
    
     // set the latch count to the nuber of callbacks to wait for
     CountDownLatch latch = new CountDownLatch(2);
    
     ServiceCallBackhandler callbackhandler =  new ServiceCallBackhandler() {
          public void handleResponse(Response response) {
               .... do real work ...
               latch.countDown();
          }
     };
    
     stub.startGetData("Foo",callbackhandler)
     stub.startGetData("bar",callbackhanlder)
    
     // wait for both callbacks to occur
     latch.await();
    

    另请参见java.util.concurrent.semaphore,但我认为CountDownloach是您所描述的内容中需要的内容。

        2
  •  0
  •   charstar    16 年前

    一般来说,如果一个人想要等到一个特定的条件容纳n个不同的对象,那么他们应该考虑使用concurrency实用程序中的cyclicbarrier(n)或countdownloach(n)。

    呼叫主体的基本结构:

    CountDownLatch my_latch = new CountDownLatch( 2 );
    
    // These objects perform some asynchronous function when
    // their start() method is called.
    AsyncObject ao1 = new AsyncObject( my_latch, ... );
    AsyncObject ao2 = new AsyncObject( my_latch, ... );
    
    ao1.start();  // asynchronous, returns immediately
    ao2.start();  // asynchronous, returns immediately
    
    // my_latch.await() blocks until the latch has counted down to 0 from 2
    my_latch.await();
    

    以及在其工作完成或条件满足时希望“发出信号”的方法中:

    {
        // ... work ...
        // work is complete
    
        the_latch_passed_in_to_this_object.countDown();
     }
    
    推荐文章