我使用使用者从队列中取出商品并将其发送到外部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循环?
答案 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
中使用另一个ArrayList
或List
或<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;
}
}
也许这会给您一些起点或方向。