Я использую redis с Akka, поэтому мне не нужно блокировать вызовы. У салата есть встроенный в него асинхронный вызов. Но Джедис - рекомендуемый клиент Редиса. Может кто-нибудь сказать мне, если я использую их оба правильно. Если да, то какой из них лучше.
Jedis Я использую статический пул соединений Jedis, чтобы получить con и использовать обратный вызов Akka для обработки результата. Меня беспокоит, когда я использую другой поток (вызываемый), чтобы получить результат, который поток в конечном итоге собирается заблокировать для результата. Хотя у Lettuce может быть более эффективный способ сделать это.
private final class OnSuccessExtension extends OnSuccess<String> {
private final ActorRef senderActorRef;
private final Object message;
@Override
public void onSuccess(String valueRedis) throws Throwable {
log.info(getContext().dispatcher().toString());
senderActorRef.tell((String) message, ActorRef.noSender());
}
public OnSuccessExtension(ActorRef senderActorRef,Object message) {
this.senderActorRef = senderActorRef;
this.message=message;
}
}
ActorRef senderActorRef = getSender(); //never close over a future
if (message instanceof String) {
Future<String> f =akka.dispatch.Futures.future(new Callable<String>() {
public String call() {
String result;
try(Jedis jedis=JedisWrapper.redisPool.getResource()) {
result = jedis.get("name");
}
return result;
}
}, ex);
f.onSuccess(new OnSuccessExtension(senderActorRef,message), ex);
}
САЛАТ
ExecutorService executorService = Executors.newFixedThreadPool(10);
public void onReceive(Object message) throws Exception {
ActorRef senderActorRef = getSender(); //never close over a future
if (message instanceof String) {
final RedisFuture<String> future = lettuce.connection.get("name");
future.addListener(new Runnable() {
final ActorRef sender = senderActorRef;
final String msg =(String) message;
@Override
public void run() {
try {
String value = future.get();
log.info(value);
sender.tell(message, ActorRef.noSender());
} catch (Exception e) {
}
}
}, executorService);
Если салат - лучший вариант для вызовов Async. Тогда какой тип исполнителя я должен использовать в производственной среде. Если возможно, я могу использовать диспетчер Akka в качестве контекста выполнения для будущего вызова Letture.