2016-01-19 4 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"); 
     } 
} 

Но даже когда я отменяю запрос в почтальоне, рекурсивный вызов происходит в фоновом режиме.

Таким образом, я думаю, что моя длинная реализация опроса неверна и мне может понадобиться отслеживать запрос также из службы позже или использовать структуру данных, похожую на Queue.

+2

Это не то, для чего предназначена рекурсия. Просто используйте цикл. – Blorgbeard

+0

спасибо. но все равно моя проблема будет там. Любое предложение для более эффективного проведения длительного опроса, пожалуйста? – Harshana

+0

@Blorgbeard в чем преимущество цикла вместо рекурсии? и что не так с применением рекурсии здесь? – Harshana

ответ

0

Я думаю, что, когда я отменяю запрос, вы ничего не делаете, чтобы сломать этот код или закрыть приложение.

Есть ли у вас какой-либо способ узнать, отменен ли запрос внутри этого кода? Если да, просто добавьте это условие. Конечно, код будет застревать до тех пор, пока Thread не проснется, но все равно будет делать то, что вы хотите.

EDIT

И вы должны перейти от рекурсии для простого цикла, как некоторое время или делать ... пока.

+0

Как я могу отслеживать доступность запроса из класса java? – Harshana

+0

Я не знаю вашего кода ... Вам нужно больше узнать о том, как работает ваше приложение. – nervousDev

+0

его приложение для загрузки пружин. код i находится из моего метода класса сервиса, который вызывается через контроллер останова – Harshana

0

OK, старый добрый wait/notify.

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