All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.qmetric.feed.consumer.EntryConsumerImpl Maven / Gradle / Ivy

package com.qmetric.feed.consumer;

import com.github.rholder.retry.RetryException;
import com.github.rholder.retry.RetryerBuilder;
import com.qmetric.feed.consumer.store.AlreadyConsumingException;
import com.qmetric.feed.consumer.store.ConsumedStore;
import com.theoryinpractise.halbuilder.api.ReadableRepresentation;

import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;

import static com.github.rholder.retry.StopStrategies.stopAfterAttempt;
import static com.github.rholder.retry.WaitStrategies.fixedWait;
import static java.util.concurrent.TimeUnit.SECONDS;

public class EntryConsumerImpl implements EntryConsumer
{
    private static final RetryerBuilder RETRY_BUILDER = RetryerBuilder.newBuilder() //
            .retryIfException() //
            .withWaitStrategy(fixedWait(1, SECONDS)) //
            .withStopStrategy(stopAfterAttempt(60));

    private final ConsumedStore consumedStore;

    private final ConsumeAction consumeAction;

    private final Collection listeners;

    public EntryConsumerImpl(final ConsumedStore consumedStore, final ConsumeAction consumeAction, final Collection listeners)
    {
        this.consumedStore = consumedStore;
        this.consumeAction = consumeAction;
        this.listeners = listeners;
    }

    @Override
    public void consume(ReadableRepresentation feedEntry) throws Exception
    {
        markAsConsuming(feedEntry);

        process(feedEntry);

        markAsConsumed(feedEntry);

        notifyAllListeners(feedEntry);
    }

    private void markAsConsuming(final ReadableRepresentation feedEntry) throws AlreadyConsumingException
    {
        consumedStore.markAsConsuming(feedEntry);
    }

    private void process(final ReadableRepresentation feedEntry) throws Exception
    {
        try
        {
            consumeAction.consume(feedEntry);
        }
        catch (final Exception e)
        {
            consumedStore.revertConsuming(feedEntry);

            throw e;
        }
    }

    private void markAsConsumed(final ReadableRepresentation feedEntry) throws ExecutionException, RetryException
    {
        RETRY_BUILDER.build().call(new Callable()
        {
            @Override public Void call() throws Exception
            {
                consumedStore.markAsConsumed(feedEntry);
                return null;
            }
        });
    }

    private void notifyAllListeners(final ReadableRepresentation consumedEntry)
    {
        for (final EntryConsumerListener listener : listeners)
        {
            listener.consumed(consumedEntry);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy