/* * Copyright 2013 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.netflix.suro.client; import com.google.inject.Injector; import com.netflix.governator.configuration.PropertiesConfigurationProvider; import com.netflix.governator.guice.BootstrapBinder; import com.netflix.governator.guice.BootstrapModule; import com.netflix.governator.guice.LifecycleInjector; import com.netflix.governator.lifecycle.LifecycleManager; import com.netflix.suro.ClientConfig; import com.netflix.suro.client.async.AsyncSuroClient; import com.netflix.suro.message.Message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Properties; /** * Wrapped implementation of {@link ISuroClient}. * Depending on its configuration, it will select either {@link SyncSuroClient} * or {@link AsyncSuroClient} * @author jbae */ public class SuroClient implements ISuroClient { private static final Logger log = LoggerFactory.getLogger(SuroClient.class); private final ISuroClient client; public SuroClient(Properties properties) { createInjector(properties); client = injector.getInstance(ISuroClient.class); } public void shutdown() { injector.getInstance(LifecycleManager.class).close(); } private Injector injector; private Injector createInjector(final Properties properties) { injector = LifecycleInjector .builder() .withBootstrapModule( new BootstrapModule() { @Override public void configure(BootstrapBinder binder) { binder.bindConfigurationProvider().toInstance( new PropertiesConfigurationProvider(properties)); } } ) .withModules(new SuroClientModule()) .build().createInjector(); LifecycleManager manager = injector.getInstance(LifecycleManager.class); try { manager.start(); } catch (Exception e) { throw new RuntimeException("LifecycleManager cannot start with an exception: " + e.getMessage(), e); } return injector; } @Override public void send(Message message) { client.send(message); } @Override public long getSentMessageCount() { return client.getSentMessageCount(); } @Override public long getLostMessageCount() { return client.getLostMessageCount(); } @Override public long getNumOfPendingMessages() { return client.getNumOfPendingMessages(); } public ClientConfig getConfig() { return injector.getInstance(ClientConfig.class); } }