blob: 080d666fa1da3f563c35441f26db0452a5b175c3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.nifi.distributed.cache.client;
import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.Tags;
import java.io.IOException;
/**
* <p>This interface defines an API that can be used for interacting with a
* Distributed Cache that functions similarly to a {@link java.util.Map Map}.
*
* <p>In addition to the API defined in {@link DistributedMapCacheClient} super class,
* this class provides methods for concurrent atomic updates those are added since Map Cache protocol version 2.
*
* <p>If a remote cache server doesn't support Map Cache protocol version 2, these methods throw UnsupportedOperationException.
* @param <R> The revision type.
* If the underlying cache storage supports the concept of revision to implement optimistic locking, then a client implementation should use that.
* Otherwise set the cached value and check if the key is not updated at {@link #replace(AtomicCacheEntry, Serializer, Serializer)}
*/
@Tags({"distributed", "client", "cluster", "map", "cache"})
@CapabilityDescription("Provides the ability to communicate with a DistributedMapCacheServer. This allows "
+ "multiple nodes to coordinate state with a single remote entity.")
public interface AtomicDistributedMapCacheClient<R> extends DistributedMapCacheClient {
/**
* Fetch a CacheEntry with a key.
* @param <K> the key type
* @param <V> the value type
* @param key the key to lookup in the map
* @param keySerializer key serializer
* @param valueDeserializer value deserializer
* @return A CacheEntry instance if one exists, otherwise <cod>null</cod>.
* @throws IOException if unable to communicate with the remote instance
*/
<K, V> AtomicCacheEntry<K, V, R> fetch(K key, Serializer<K> keySerializer, Deserializer<V> valueDeserializer) throws IOException;
/**
* Replace an existing key with new value.
* @param <K> the key type
* @param <V> the value type
* @param entry should provide the new value for {@link AtomicCacheEntry#getValue()},
* and the same revision in the cache storage for {@link AtomicCacheEntry#getRevision()},
* if the revision does not match with the one in the cache storage, value will not be replaced.
* @param keySerializer key serializer
* @param valueSerializer value serializer
* @return true only if the key is replaced.
* @throws IOException if unable to communicate with the remote instance
*/
<K, V> boolean replace(AtomicCacheEntry<K, V, R> entry, Serializer<K> keySerializer, Serializer<V> valueSerializer) throws IOException;
}