Używam redis z Akka, więc nie potrzebuję żadnych blokujących połączeń. Sałata ma wbudowane w nią połączenie asynchroniczne. Ale Jedis jest rekomendowanym klientem Redisa. Czy ktoś może mi powiedzieć, czy używam obu w odpowiedni sposób. Jeśli tak, który z nich jest lepszy.Jedi i asynch sałata
JEDIS Używam statycznej puli połączeń Jedis do uzyskania potwierdzenia połączenia i korzystania z przyszłego oddzwaniania Akka w celu przetworzenia wyniku. Moją obawą jest tutaj, kiedy używam innego wątku (wywoływanego), aby uzyskać wynik, który wątek ostatecznie zablokuje dla wyniku. Podczas gdy sałata może mieć bardziej efektywny sposób robienia tego.
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);
}
SAŁATA
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);
Jeśli sałata jest lepszym rozwiązaniem dla połączeń transmisji asynchronicznej. Następnie, jakiego typu executor powinienem używać w środowisku produkcyjnym. Jeśli to możliwe, mogę użyć dyspozytora Akka jako kontekstu wykonawczego dla przyszłego połączenia Letture.