2012-10-24 31 views
13

मैं कई कार्यकर्ता धागे चल रहा हूँ (लगभग 10) से एक संसाधन प्राप्त नहीं कर सका ।<strong>Jedis ग्राहक</strong> के लिए मैं उपयोग कर रहा हूँ infinte टाइमआउट के लिए redis प्र <br> का डेटा एक्सेस करने पूल (SocketTimeoutException :)

Jedis jedis = pool.getResource(); 
jedis.getClient().setTimeoutInfinite(); 

फिर भी मैं त्रुटि हो रही है "पूल से एक संसाधन प्राप्त नहीं कर सका"। स्टैकट्रैक नीचे दिया गया है।

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 
at redis.clients.util.Pool.getResource(Pool.java:22) 
at Workers.Worker1.met1(Worker1.java:124) 
at Workers.Worker1.work(Worker1.java:108) 
at org.gearman.impl.worker.WorkerConnectionController$3.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out 
at redis.clients.jedis.Connection.connect(Connection.java:124) 
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:54) 
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1657) 
at redis.clients.jedis.JedisPool$JedisFactory.makeObject(JedisPool.java:63) 
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1188) 
at redis.clients.util.Pool.getResource(Pool.java:20) 
... 6 more 

Caused by: java.net.SocketTimeoutException: connect timed out 
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) 
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
at java.net.PlainSocketImpl.connect(Unknown Source) 
at java.net.SocksSocketImpl.connect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at redis.clients.jedis.Connection.connect(Connection.java:119) 
... 11 more 
+0

और क्या आपका रेडिस सर्वर ज़िंदा है? क्या आप इसे Redis-cli का उपयोग कर क्लाइंट बॉक्स से कनेक्ट कर सकते हैं? –

+0

हाँ रेडिस सर्वर जीवित है और रेडिस-क्ली – Vignesh

+1

का उपयोग करके कनेक्ट करने में सक्षम है मुझे एक ही समस्या है। रेडिस चल रहा है। जेडिसपूल का उपयोग करते समय समस्या होती है, और मैं 'रिटर्न रिसोर्स' करता हूं। 'जेडिस जेडिस = नई जेडीस ("लोकलहोस्ट") के साथ कोई समस्या नहीं; '। क्या आपने इस मुद्दे को हल किया है? –

उत्तर

1

सुनिश्चित नहीं है, लेकिन हो सकता है कि आप जेडिस ऑब्जेक्ट्स को पूल में वापस न आएं, और आपके रेडिस-सर्वर की कनेक्शन सीमा है।

हर कार्यकर्ता थ्रेड पूल के लिए Jedis उदाहरणों लौटना चाहिए अपना काम पूरा होने के बाद:

Jedis jedis = jedisPool.getResource(); 
try { 
    jedis.getClient().setTimeoutInfinite(); 
    // your code here... 
    ... 
} finally { 
    jedisPool.returnResource(jedis); 
} 
+0

हाँ @ जेरेक, पहले से ही मैं संसाधन लौट रहा हूं। \t ** pool.returnResource (jedis); पूल।नष्ट करें(); ** – Vignesh

+0

मेरी जावा ऐप में मैं जेडिस 2.0.0.jar फ़ाइल का उपयोग कर रहा हूं और रेडिस सर्वर संस्करण 2.4.13 है। क्या यह समस्या पैदा कर रहा है? – Vignesh

4

मैंने देखा है कि इस अपवाद और अगर Redis नहीं चल रहा है फेंक दिया जाएगा कर सकते हैं। बिलकुल चौकन्ना।

1

अपने कोड इस तरह है:

JedisPoolConfig jedisPoolConfig = initPoolConfig();  
jedisPool = new JedisPool(jedisPoolConfig, "*.*.*.*", 6379); 

आप इस कोशिश कर सकते हैं: क्योंकि Redis के लिए डिफ़ॉल्ट टाइमआउट समय 2 सेकंड है

JedisPoolConfig jedisPoolConfig = initPoolConfig();  
jedisPool = new JedisPool(jedisPoolConfig, "*.*.*.*", 6379,10*1000); 

यह वह जगह है, लेकिन कार्यक्रम का चलना समाप्त हो सकता है इस समय में।

2

रिक हैनलॉन के उत्तर के आधार पर, स्प्रिंग बूट के साथ रेडिस का उपयोग करते हुए यह अपवाद भी फेंक दिया जाता है।

यदि आप स्प्रिंग बूट का उपयोग कर रहे हैं, तो केवल रेडिस की निर्भरता पर्याप्त नहीं है; आप मैन्युअल रूप से भी एक बैश टर्मिनल के बंद डाउनलोड करने के लिए और redis.io से आपकी मशीन पर Redis स्थापित करते हैं, तो चलाने की जरूरत:

[email protected]_pc:/path/to/redis/dir$ ./src/redis-server ./redis.conf 

सर्वर चलाने के बाद, आप अपने सभी ऐप्स में प्रासंगिक लाइनों जोड़ने की आवश्यकता होगी कि उपयोग Redis:

application.properties:

... 
spring.redis.host: <yourhost> // usually localhost, but can also be on a LAN 
spring.redis.port: <yourport> // usually 6379, but settable in redis.conf 

application.yml:

... 
spring: 
    redis: 
    host: <yourhost> // usually localhost, but can also be on a LAN 
    port: <yourport> // usually 6379, but settable in redis.conf 
0

क्या यह हमेशा या कभी-कभी होता है? यदि यह कभी-कभी होता है, तो आप अपने कनेक्शन पूल के आकार की जांच कर सकते हैं।

यदि आप JedisPoolConfig का उपयोग कर रहे हैं, तो डिफ़ॉल्ट कनेक्शन पूल आकार 8 है। यह आपके मामले के लिए बहुत छोटा हो सकता है।

JedisPoolConfig poolConfig = new JedisPoolConfig(); 
poolConfig.setMaxTotal(128); 
jedisPool = new JedisPool(poolConfig, HOST, PORT, ...);