package com.netflix.schlep; import java.io.IOException; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.apache.commons.configuration.AbstractConfiguration; import org.apache.commons.configuration.PropertiesConfiguration; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.io.Closeables; import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Scopes; import com.netflix.governator.guice.LifecycleInjector; import com.netflix.governator.lifecycle.LifecycleManager; import com.netflix.schlep.exception.ConsumerException; import com.netflix.schlep.guice.SchlepModule; import com.netflix.schlep.reader.IncomingMessage; import com.netflix.schlep.reader.MessageCallback; import com.netflix.schlep.reader.MessageReader; import com.netflix.schlep.reader.MessageReaderFactory; import com.netflix.schlep.sim.SimSchlepModule; import com.netflix.schlep.sqs.SqsSchlepModule; import com.netflix.schlep.writer.MessageProducer; import com.netflix.schlep.writer.MessageWriterFactory; public class SchlepTest { private static final Logger LOG = LoggerFactory.getLogger(SchlepTest.class); public static class Message1 { private String str; public Message1(String str) { this.str = str; } @Override public String toString() { return "Message1 [str=" + str + "]"; } } public static class Message2 { @Override public String toString() { return "Message2 []"; } } public static class MyService { private final MessageReaderFactory consumerProvider; private final MessageWriterFactory producerProvider; private MessageReader<Message1> message1Consumer; private MessageReader<Message2> message2Consumer; private MessageProducer<Message1> message1Producer; @Inject public MyService(MessageReaderFactory consumerProvider, MessageWriterFactory producerProvider) { this.consumerProvider = consumerProvider; this.producerProvider = producerProvider; } @PostConstruct public void init() throws Exception { message1Consumer = this.consumerProvider.createConsumer(EndpointKey.of("foo", Message1.class), null, new MessageCallback<Message1>() { @Override public void consume(IncomingMessage<Message1> message) throws ConsumerException { LOG.info("Consume: " + message.getEntity()); } }); message2Consumer = this.consumerProvider.createConsumer(EndpointKey.of("bar", Message2.class), null, new MessageCallback<Message2>() { @Override public void consume(IncomingMessage<Message2> message) throws ConsumerException { LOG.info("Consume: " + message.getEntity()); } }); message1Producer = this.producerProvider.createProducer(EndpointKey.of("foo", Message1.class), null); } @PreDestroy public void shutdown() throws Exception { message1Consumer.stop(); message2Consumer.stop(); } public void produce(Message1 message) throws Exception { message1Producer.produce(message); } } @Test public void test() throws Exception { // Boostrap Injector injector = LifecycleInjector.builder() .withModules( new SimSchlepModule(), new SqsSchlepModule(), new SchlepModule(), new AbstractModule() { @Override protected void configure() { PropertiesConfiguration config = new PropertiesConfiguration(); config.addProperty("com.netflix.schlep.consumer.foo.type", "sim"); config.addProperty("com.netflix.schlep.consumer.bar.type", "sim"); config.addProperty("com.netflix.schlep.producer.foo.type", "sim"); bind(AbstractConfiguration.class).toInstance(config); bind(MyService.class).in(Scopes.SINGLETON); } } ) .createInjector(); LifecycleManager manager = injector.getInstance(LifecycleManager.class); manager.start(); try { MyService service = injector.getInstance(MyService.class); service.produce(new Message1("Hello world")); } finally { manager.close(); } } }