com.watchrabbit.executor.service.CommandServiceImpl Maven / Gradle / Ivy
/*
* Copyright 2014 Mariusz.
*
* 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.watchrabbit.executor.service;
import com.watchrabbit.executor.invoker.AsynchronousInvoker;
import com.watchrabbit.executor.invoker.SynchronousInvoker;
import com.watchrabbit.executor.pool.ThreadPoolManager;
import com.watchrabbit.executor.pool.ThreadPoolManagerImpl;
import com.watchrabbit.executor.wrapper.CommandConfig;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
/**
*
* @author Mariusz
*/
public class CommandServiceImpl implements CommandService {
private final ThreadPoolManager poolManager = new ThreadPoolManagerImpl();
private final CircuitBreakerService breakerService = new CircuitBreakerServiceImpl();
private final CacheService cacheService = new CacheServiceImpl();
private final RetryService retryService = new RetryServiceImpl();
@Override
public Future executeAsynchronously(Callable callable, CommandConfig command) {
ExecutorService pool = poolManager.getPool();
Callable wrapped = wrapp(callable, pool, command);
return new AsynchronousInvoker().invoke(pool, wrapped);
}
@Override
public V executeSynchronously(Callable callable, CommandConfig command) throws Exception {
ExecutorService pool = poolManager.getPool();
Callable wrapped = wrapp(callable, pool, command);
return new SynchronousInvoker().invoke(pool, wrapped);
}
private Callable wrapp(Callable callable, ExecutorService pool, CommandConfig command) {
Callable wrapped = breakerService.addCircuitBreaker(callable, command);
if (command.getCacheConfig() != null) {
wrapped = cacheService.addCache(wrapped, command.getCacheConfig());
}
if (command.getRetryConfig() != null) {
wrapped = retryService.addRetry(wrapped, pool, command.getRetryConfig());
}
return wrapped;
}
}