2013-04-20 37 views
0
public class JedisPipeline { 
    private static JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379); 
    public static void main(String args[]){ 

     Jedis jedis = pool.getResource(); 
     Pipeline pipeline = jedis.pipelined(); 
     pipeline.multi(); 
     //pipeline.hmset("Id", new HashMap<String,String>()); 
     for(int i=0; i < 1000 ; i++){ 
      pipeline.hincrBy("Id", i+"", i); 
     } 
     pipeline.exec(); 
     pool.returnResource(jedis); 
     //pool.destroy(); 

     //pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379); 
     jedis = pool.getResource(); 
     Map<String,String> map1 = jedis.hgetAll("Id"); 
     System.out.println("map1------->"+map1); 
     pool.returnResource(jedis); 
     //pool.destroy(); 


    } 
} 

我在上面的代碼中有問題。它拋出一個ClassCastException,就像我銷燬池並創建一個新的池對象,它可以正常工作。我是否正確使用Pipeline API?誰能幫我 ?我使用Jedis 2.1.0Jedis Pipeline Multi throw ClassCastException

Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to java.util.List 
    at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:189) 
    at redis.clients.jedis.Jedis.hgetAll(Jedis.java:861) 
    at com.work.jedisex.JedisFactory.main(JedisFactory.java:59) 

修改代碼來獲得其拋出異常

Response<Map<String,String>> map1 = pipeline.hgetAll("Id"); 
pipeline.exec(); 
pipeline.sync(); 
pool.returnResource(jedis); 
Map<String,String> map2 = map1.get(); 

回答

1

貌似管道不執行exec()調用後沒有關閉映射。因此,當您嘗試在returnResource之後重用相同的Jedis對象時,它仍包含來自上一操作的pipelinedResponses。

嘗試做這樣:

pipeline.exec(); 
    pipeline.sync(); 
    pool.returnResource(jedis); 

同步()調用應該關閉管道。

+0

Thank you,That worked!。但是我已經修改了代碼來獲得如上所述的Map。我仍然得到同樣的例外。你能找到代碼中的問題嗎? – user1182253 2013-04-22 05:56:22