长轮询实施

时间:2016-01-19 02:22:15

标签: java long-polling

我实现了一个长轮询实现。发生的事情是,当请求到来时,我检查一些数据是否可用,如果没有睡眠线程,则递归调用方法直到数据可用。

int time = 0;
String data;

public void checkme() {    
    time++;
    if (data == null && time < 100) {
        System.out.println("recursive call "+time);
        try {
           Thread.sleep(5000);
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
        checkme();
        } else {
           System.out.println("end recursive call. data available");
        }
}

但即使我在邮递员中取消请求,仍然会在后台进行递归调用。

所以我认为我的长轮询实现是错误的,我可能需要稍后从服务跟踪请求或使用类似数据结构的队列。

2 个答案:

答案 0 :(得分:0)

我认为发生的事情是,当您取消请求时,您无法破坏该代码或关闭应用程序。

您是否有任何方法可以知道该代码中是否取消了请求?如果是,只需将其添加到条件中即可。当然代码将被卡住,直到线程唤醒,但仍然会做你想要的。

修改

你应该从递归换一个简单的循环,或者做......同时。

答案 1 :(得分:0)

好的,好老等待/通知。

public void waitForData ()
{
  synchronized( this )
  {
    while( data == null )
    {
      wait(5000L);
    }
  }
}

public void provideData ( String dataParam )
{
  synchronized(this)
  {
    data = dataParam;

    // This wakes the waitForData
    notifyAll();
  }
}