Sto usando redis con Akka quindi non ho bisogno di chiamate di blocco. La lattuga ha incorporato una chiamata asincrona. Ma Jedis è il cliente consigliato da Redis. Qualcuno può dirmi se sto usando entrambi nel modo giusto. Se è così quale è meglio.Jedis e Lettuce async abilità
Jedi Sto usando un pool statico collegamento Jedi per avere condizionata e utilizzando Akka futuro callback per elaborare il risultato. La mia preoccupazione qui è quando uso un altro thread (callable) per ottenere il risultato che il thread sta per bloccare il risultato. Mentre Lettuce potrebbe avere un modo più efficiente di farlo.
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);
}
LATTUGA
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);
Se lattuga è una scelta migliore per le chiamate asincrone. Quindi che tipo di esecutore dovrei andare con in ambiente di produzione. Se possibile, posso utilizzare un dispatcher Akka come contesto di esecuzione per la chiamata futura Letture.