/** * Copyright 2016 Hortonworks. * * 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.hortonworks.registries.cache.view.io.writer; import com.hortonworks.registries.cache.view.datastore.DataStoreWriter; import java.util.Collection; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CacheWriterAsync<K, V> implements CacheWriter<K, V> { private static final int DEFAULT_NUM_THREADS = 5; private final DataStoreWriter<K, V> dataStoreWriter; private final ExecutorService executorService; public CacheWriterAsync(DataStoreWriter<K, V> dataStoreWriter) { this(dataStoreWriter, Executors.newFixedThreadPool(DEFAULT_NUM_THREADS)); } public CacheWriterAsync(DataStoreWriter<K, V> dataStoreWriter, ExecutorService executorService) { this.dataStoreWriter = dataStoreWriter; this.executorService = executorService; } public void write(final K key, final V val) { executorService.submit(new DataStoreWriteRunnable(key, val)); } public void writeAll(Map<? extends K, ? extends V> entries) { executorService.submit(new DataStoreWriteRunnable(entries)); } public void delete(final K key) { executorService.submit(new DataStoreDeleteRunnable(key)); } public void deleteAll(Collection<? extends K> keys) { executorService.submit(new DataStoreDeleteRunnable(keys)); } private class DataStoreWriteRunnable implements Runnable { private Map<? extends K, ? extends V> entries; private K key; private V val; public DataStoreWriteRunnable(K key, V val) { this.key = key; this.val = val; } public DataStoreWriteRunnable(Map<? extends K, ? extends V> entries) { this.entries = entries; } @Override public void run() { if (entries != null) { dataStoreWriter.writeAll(entries); } else { dataStoreWriter.write(key, val); } } } private class DataStoreDeleteRunnable implements Runnable { private Collection<? extends K> keys; private K key; public DataStoreDeleteRunnable(K key) { this.key = key; } public DataStoreDeleteRunnable(Collection<? extends K> keys) { this.keys = keys; } @Override public void run() { if (keys != null) { dataStoreWriter.deleteAll(keys); } else { dataStoreWriter.delete(key); } } } }