Running a job on the database to perform operations at End of Day (EOD) is a scheduled operation. If the job is scheduled we can time our calls. Typically schedulers are not ran at peak hours. The difference between polling and running a scheduler is that polling for information does not timed. Polling does not know the state of the API server, its peak hours and traffic conditions. On the contrary, polling is expected to be performed at peak hours. Polling at peak hours can lead to timeouts due to network congestions.
Polling needs to be performed at regular intervals. Polling is expensive since 98% of the API calls are wasted.
Polling a third party API is the only choice, when the API is not under our control. If the API was within clients domain i.e not third-party, the API can implement techniques like long polling, server sent events and web-sockets to push information when available.
Common error that occur during polling are
In clients like OKHttp and other we can set Timeouts as follows. We are setting connection and write timeout to 20 seconds. But setting the read timeout to 60 seconds.
new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
int statusCode = response.code();
//@TODO check the status code and log the message
}
} catch (IOException ex) {
//connection error
}
By default redirects are followed in okhttp. But they can be disabled to ssl and non-ssl urls.
new OkHttpClient().newBuilder()
.followRedirects(false)
.followSslRedirects(false)
.build();
We will demonstrate OKHttp as a client library to perform polling. Also perform error handling and retries in case of failure.
The below example uses OKHttp to send GET API poll request. The class is made Runnable
to pass it to the schedular.
The run method here gets called after every 10 minutes.
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
public class ApiPoller implements Runnable{
private static final String BASE_URL = "https://api.metamug.com";
OkHttpClient client = new OkHttpClient();
/**
* Use OKHttp to send GET API poll request.
*/
public int getCount() throws IOException {
int count = 0;
Request request = new Request.Builder().url(BASE_URL + "/covid/v1.0/india/count").build();
try (Response response = client.newCall(request).execute()) {
ResponseBody body = response.body();
JSONObject json = new JSONObject(body.string());
JSONArray array = (JSONArray) json.get("max_count");
JSONObject firstElement = (JSONObject) array.get(0);
count = (Integer) firstElement.get("total");
}
return count;
}
/**
* This method gets called after every specified duration
*/
@Override
public void run() {
try {
int count = this.getCount();
//@TODO Send the count information somewhere else.
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ApiPoller poller = new ApiPoller();
ScheduledExecutorService schedular = Executors.newScheduledThreadPool(1);
//specify the time duration
schedular.scheduleAtFixedRate(poller, 0,10, TimeUnit.MINUTES);
}
}
If server doesn't provide a callback API, clients are forced to use polling. Polling in few cases can used when callbacks dont respond in time or server requests fail. A server must provide a status API for the clients to connect to and poll for the result. There is no such thing as a polling API, unlike a callback API.