2017-10-11 1 views
0

Gibt es einen vernünftigeren Weg, das folgende supereinfache set/get/close Testprogramm zu programmieren? Beachten Sie, dass ich den Redis-Close-Code duplizieren und in den Set-Error-Pfad und den Get-Complete-Pfad einbeziehen musste.vert.x verkettet asynchrone Logik?

import io.vertx.core.Vertx; 
import io.vertx.redis.RedisClient; 
import io.vertx.redis.RedisOptions; 

public class RedisTest { 
    public static void main(String[] args) throws Exception { 
     Vertx vertx = Vertx.vertx(); 

     String host = "localhost"; 

     final RedisClient client = RedisClient.create(vertx, 
       new RedisOptions().setHost(host)); 

     client.set("key", "value", r -> { 
      if (r.succeeded()) { 
       System.out.println("key stored"); 

       client.get("key", s -> { 
        if (s.succeeded()) { 
         System.out.println("Retrieved value: " + s.result()); 
        } else { 
         System.out.println("Connection or Operation Failed " + s.cause()); 
        } 

        System.out.println("Closing Redis connection"); 
        client.close(t -> { 
         if (s.succeeded()) { 
          System.out.println("Redis closed successfully."); 
         } else { 
          System.out.println("Connection or Operation Failed " + t.cause()); 
         } 

         System.out.println("Closing vertx"); 
         vertx.close(); 
        }); 
       }); 
      } else { 
       System.out.println("Connection or Operation Failed " + r.cause()); 

       System.out.println("Closing Redis connection"); 
       client.close(s -> { 
        if (s.succeeded()) { 
         System.out.println("Redis closed successfully."); 
        } else { 
         System.out.println("Connection or Operation Failed " + s.cause()); 
        } 

        System.out.println("Closing vertx"); 
        vertx.close(); 
       }); 
      } 
     }); 

     System.out.println("Exiting main"); 
    } 
} 

Antwort

2

Ich empfehle, siehe reaktive API io.vertx.rxjava.redis.RedisClient. Es ist hervorragend (seine Hauptzwecke) für die verkettete Berechnung.

Zum Beispiel (ich diesen Code nicht getestet):

client.rxSet("key", "value") 
     .flatMap(r -> client.rxGet("key")) 
     //calls on error or success 
     .doAfterTerminate(() -> { 
      client.rxClose(); 
      vertx.close(); 
     }) 
     .subscribe(
     success -> System.out.println("Chain completed"), 
     //all errors will be there 
     error -> System.out.println(error.getMessage()) 
    );