package org.sef4j.core.helpers.export.senders; import org.sef4j.core.api.EventSender; import org.sef4j.core.helpers.export.ExportFragmentList; import org.sef4j.core.helpers.senders.DelegateEventSender; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * retryable support for EventSender<FragmentList><br/> * when sending event fails => keep in memory map/list of data still to be sent.<br/> * (map for fragments with associated id-value, and list for fragments without id) * * <PRE> * +--------------------------------+ * | transformer: fragments->event | * | retryList | * sendEvent(FragmentList) ---> | /\ --+--> | --->sendEvents(FragmentList) * | merge per id or append | | * | | | | * | +--------onError----+ | * +--------------------------------+ * </PRE> * * @param <T> type of fragments to export (example: String for JSon fragments) */ public class RetryableFragmentListDelegateEventSender<T> extends DelegateEventSender<ExportFragmentList<T>> { private static final Logger LOG = LoggerFactory.getLogger(RetryableFragmentListDelegateEventSender.class); private RetryableFragmentsHistory<T> retryableHistory; // ------------------------------------------------------------------------ public RetryableFragmentListDelegateEventSender(EventSender<ExportFragmentList<T>> delegate, int retryHistoryLen) { super(delegate); this.retryableHistory = new RetryableFragmentsHistory<T>(retryHistoryLen); } // ------------------------------------------------------------------------ @Override public void sendEvent(ExportFragmentList<T> currFragments) { ExportFragmentList<T> retryFragments = retryableHistory.shiftAndCollectRetryFragmentsToExport(); ExportFragmentList<T> mergedFragments = new ExportFragmentList<T>(); mergedFragments.addAll(retryFragments); // may overwrite retryFragment obj? mergedFragments.addAll(currFragments); if (mergedFragments.isEmpty()) { return; // nothing to export! } ExportFragmentList<T> failedSendFragments = new ExportFragmentList<T>(); // *** do send with capture for failed send fragments *** try { super.sendEvent(mergedFragments); } catch(Exception ex) { LOG.warn("Failed to export fragments! ex:" + ex.getMessage() + " .. put in retry list"); failedSendFragments.addAll(mergedFragments); } if (! failedSendFragments.isEmpty()) { retryableHistory.addShiftedFailedRetryable(failedSendFragments); } } }