Java while循环一定时间

时间:2018-10-16 14:16:20

标签: java time while-loop timer

我使用使用者从队列中取出商品并将其发送到外部API

public void run(){
    try {
        while(true){
             //will peek() an item from a queue and send it to an external API
             sendRequest(item);
             thread.sleep(100);
        }
    } catch(InterruptedException e){
        Thread.currentThread().interrupt();
    }
}

还有另一种发送请求的方法

public void sendRequest(JSONibject item){
     // send request

    if(response.getStatus() == 200){
        //will remove the item from the queue
    }
    if(response.getStatus() == 500){
        //keep the item in the queue and set time for resending
    }
}

所以我想做的是当我收到500响应时,这意味着服务器没有启动。我会将项目保留在队列中,并尝试每5分钟重新发送一次。在那种情况下我该如何控制while循环?

3 个答案:

答案 0 :(得分:0)

sendRequest成功返回true,失败则返回false
然后在while循环中,创建第二个循环:

while (!sendRequest(item)) {
    thread.sleep(1000*60*5);
}

或者在sendRequest中是这样的:

if(response.getStatus() == 500){
    thread.sleep(1000*60*5);
    sendRequest(item);
}

答案 1 :(得分:0)

您也可以在此处使用“自定义例外”。 例如,将自定义异常类创建为

public class ServerDownException extends Exception {
      public ServerDownException(String error) {
             super(error);
      }
}

...

public void run(){
try {
    while(true){
       try {
         //will peek() an item from a queue and send it to an external API
         sendRequest(item);
         thread.sleep(100);
       } catch(ServerDownException ex) {
         thread.sleep(/*milliseconds*/ 5000);
       }
    }
} catch(InterruptedException e){
    Thread.currentThread().interrupt();
}
}

....

public void sendRequest(JSONibject item) throws ServerDownException {
 // send request

if(response.getStatus() == 200){
    //will remove the item from the queue
}
if(response.getStatus() == 500){
    //keep the item in the queue and set time for resending
    throw new ServerDownException("500 Server Down Error");
}

}

您可以使用几个自定义异常类处理不同的服务器错误。

答案 2 :(得分:0)

不确定您的整体情况,但尝试以下操作。

因此,您需要做的是在使用者方法中或在全局类型为Array中使用另一个ArrayListList<JSONibject>。在此array/arraylist/list中,添加返回code 500的那些项。使用Timer安排每5分钟运行一次,然后从该array/arraylist/list发送所有项目。

首先,通过导入创建调光器。 (还导入TimerTask)

import java.util.Timer;
import java.util.TimerTask;

然后创建一个计时器对象和ArrayList并像下面这样实现逻辑。

 public void run() {
    try {
        ArrayList<JSONibject> itemsToResend = new ArrayList<>();
        Timer timer = new Timer();
        while (true) {
            //will peek() an item from a queue and send it to an external API
            JSONibject output = sendRequest(item);
            if (output == null) {
                itemsToResend.add(output);
            }

            //This will run evey 5 minutes.
            timer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    if(itemsToResend.size() > 0){
                        //Apply a loop to send the items again,
                        //Remove those items that are returned null.
                    }
                }
            }, 5 * 60 * 1000, 5 * 60 * 1000);

            Thread.sleep(100);
        }

    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }

请仔细查看该线程,以获取有关Timer

的更多信息

您还需要将sendRequest更改为以下内容:

public JSONibject sendRequest(JSONibject item) {
    // send request

    if (response.getStatus() == 200) {
        //Means consumed
        return null;
    }
    if (response.getStatus() == 500) {
        //Means not consumed and we should retry after 5 min.
        return item;
    }
}

也许这会给您一些起点或方向。