2016-01-19 86 views
0

我已经实施了长期轮询实施。发生什么情况是,当请求到达时,我检查是否有一些数据可用,如果没有睡眠线程并递归调用方法直到数据可用。长轮询实施

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

这不是递归的目的。只需使用一个循环。 – Blorgbeard

+0

谢谢。但我的问题仍然存在。任何建议更好的长期民意调查实施? – Harshana

+0

@Blorgbeard循环的优点是什么,而不是递归?在这里应用递归有什么问题? – Harshana

回答

0

我认为正在发生的事情是,当您取消请求时,您没有任何操作来破坏该代码或关闭应用程序。

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

编辑

你应该从递归改变一个简单的循环如同时或做......一会儿。

+0

我如何跟踪java类的请求可用性? – Harshana

+0

我不知道您的代码...您需要提供有关您的应用程序如何工作的更多信息。 – nervousDev

+0

其弹簧启动应用程序。我放置的代码来自我的服务类方法,该方法通过其余控制器 – Harshana

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(); 
    } 
} 
+0

谢谢。这是在后端长轮询的方式吗?顺便说一下,仍然假设我已经设定了30分钟的时间。然后我提出请求并决定在2分钟内取消它,但后端线程仍然运行28分钟? – Harshana