io.github.bucket4j.grid.hazelcast.HazelcastProxy Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bucket4j-hazelcast-3 Show documentation
Show all versions of bucket4j-hazelcast-3 Show documentation
Bucket4j integration with Hazelcast 3.x branch
/*-
* ========================LICENSE_START=================================
* Bucket4j
* %%
* Copyright (C) 2015 - 2020 Vladimir Bukhtoyarov
* %%
* 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.
* =========================LICENSE_END==================================
*/
package io.github.bucket4j.grid.hazelcast;
import com.hazelcast.core.ExecutionCallback;
import com.hazelcast.core.IMap;
import com.hazelcast.map.EntryProcessor;
import io.github.bucket4j.BucketConfiguration;
import io.github.bucket4j.Nothing;
import io.github.bucket4j.grid.CommandResult;
import io.github.bucket4j.grid.GridBucketState;
import io.github.bucket4j.grid.GridCommand;
import io.github.bucket4j.grid.GridProxy;
import io.github.bucket4j.grid.jcache.JCacheEntryProcessor;
import java.io.Serializable;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
public class HazelcastProxy implements GridProxy {
private final IMap cache;
public HazelcastProxy(IMap cache) {
this.cache = cache;
}
@Override
public CommandResult execute(K key, GridCommand command) {
JCacheEntryProcessor entryProcessor = JCacheEntryProcessor.executeProcessor(command);
return (CommandResult) cache.executeOnKey(key, adoptEntryProcessor(entryProcessor));
}
@Override
public void createInitialState(K key, BucketConfiguration configuration) {
JCacheEntryProcessor entryProcessor = JCacheEntryProcessor.initStateProcessor(configuration);
cache.executeOnKey(key, adoptEntryProcessor(entryProcessor));
}
@Override
public T createInitialStateAndExecute(K key, BucketConfiguration configuration, GridCommand command) {
JCacheEntryProcessor entryProcessor = JCacheEntryProcessor.initStateAndExecuteProcessor(command, configuration);
CommandResult result = (CommandResult) cache.executeOnKey(key, adoptEntryProcessor(entryProcessor));
return result.getData();
}
@Override
public CompletableFuture> executeAsync(K key, GridCommand command) {
JCacheEntryProcessor entryProcessor = JCacheEntryProcessor.executeProcessor(command);
return invokeAsync(key, entryProcessor);
}
@Override
public CompletableFuture createInitialStateAndExecuteAsync(K key, BucketConfiguration configuration, GridCommand command) {
JCacheEntryProcessor entryProcessor = JCacheEntryProcessor.initStateAndExecuteProcessor(command, configuration);
CompletableFuture> result = invokeAsync(key, entryProcessor);
return result.thenApply(CommandResult::getData);
}
@Override
public Optional getConfiguration(K key) {
GridBucketState state = cache.get(key);
if (state == null) {
return Optional.empty();
} else {
return Optional.of(state.getConfiguration());
}
}
@Override
public boolean isAsyncModeSupported() {
return true;
}
private EntryProcessor adoptEntryProcessor(final JCacheEntryProcessor entryProcessor) {
return new HazelcastEntryProcessorAdapter<>(entryProcessor);
}
private CompletableFuture> invokeAsync(K key, JCacheEntryProcessor entryProcessor) {
CompletableFuture> future = new CompletableFuture<>();
cache.submitToKey(key, adoptEntryProcessor(entryProcessor), new ExecutionCallback() {
@Override
public void onResponse(Object response) {
future.complete((CommandResult) response);
}
@Override
public void onFailure(Throwable t) {
future.completeExceptionally(t);
}
});
return future;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy