package com.widowcrawler.fetch; import com.fasterxml.jackson.databind.ObjectMapper; import com.widowcrawler.core.model.FetchInput; import com.widowcrawler.core.queue.Message; import com.widowcrawler.core.worker.NoOpWorkerProvider; import com.widowcrawler.core.worker.QueueCleanupCallback; import com.widowcrawler.core.worker.Worker; import com.widowcrawler.core.worker.WorkerProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import java.io.IOException; /** * @author Scott Mansfield */ @Singleton public class FetchWorkerProvider extends WorkerProvider { private static final Logger logger = LoggerFactory.getLogger(FetchWorkerProvider.class); @Inject ObjectMapper objectMapper; @Inject NoOpWorkerProvider noOpWorkerProvider; @Inject Provider<FetchWorker> seed; /** * Gets the next worker to fetch page content * * @return the next {@link com.widowcrawler.fetch.FetchWorker} that will fetch content */ @Override public Worker get() { try { String pullQueue = config.getString(QUEUE_NAME_CONFIG_KEY); Message message = queueClient.nextMessage(pullQueue); logger.info("Received message: " + message.getBody()); FetchInput fetchInput = objectMapper.readValue(message.getBody(), FetchInput.class); return seed.get().withInput(fetchInput) .withCallback(new QueueCleanupCallback(queueClient, pullQueue, message.getReceiptHandle())); } catch(InterruptedException ex) { logger.info("Thread interrupted", ex); Thread.currentThread().interrupt(); } catch (IOException ex) { logger.error("Error parsing JSON", ex); } return noOpWorkerProvider.get(); } }