package oneapi.retriever; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import oneapi.client.impl.SMSMessagingClientImpl; import oneapi.exception.RequestException; import oneapi.listener.DeliveryReportListener; import oneapi.model.DeliveryReportList; public class DeliveryReportRetriever { private ScheduledExecutorService fScheduler; public void start(long interval, SMSMessagingClientImpl smsMessagingImpl) { this.stop(); if (interval <= 0) return; fScheduler = Executors.newScheduledThreadPool(1); // fire first dlr pull attempt after 2 sec and then each interval milliseconds Runnable poller = new PollerTask(smsMessagingImpl); fScheduler.scheduleWithFixedDelay(poller, 2000, interval, TimeUnit.MILLISECONDS); } public void stop() { if (fScheduler != null) { fScheduler.shutdown(); } } private static final class PollerTask implements Runnable { private SMSMessagingClientImpl smsMessagingImpl; public PollerTask(SMSMessagingClientImpl smsMessagingImpl) { this.smsMessagingImpl = smsMessagingImpl; } public void run() { List<DeliveryReportListener> dlrStatusListeners = this.smsMessagingImpl.getDeliveryReportPullListeners(); if ((dlrStatusListeners != null) && (dlrStatusListeners.size() > 0)) { // use pull method to gather delivery reports DeliveryReportList deliveryReportList = null;; Throwable error = null; try { deliveryReportList = smsMessagingImpl.getDeliveryReports(); } catch (RequestException e) { error = e.getCause(); } if ((deliveryReportList != null && deliveryReportList.getDeliveryReports() != null && deliveryReportList.getDeliveryReports().length > 0) || (error != null)) { this.fireReportRetrieved(deliveryReportList, dlrStatusListeners, error); } } } private void fireReportRetrieved(DeliveryReportList deliveryReportList, List<DeliveryReportListener> listeners, Throwable error) { for (DeliveryReportListener listener : listeners) { listener.onDeliveryReportReceived(deliveryReportList, error); } } } }