2012-10-24 20 views
13

Tôi đang chạy nhiều đề người lao động (khoảng 10) để truy cập dữ liệu từ redis Q.
Đối với thời gian chờ infinte Tôi đang sử dụng cho Jedis Khách hàng .Không thể lấy một nguồn tài nguyên từ hồ bơi (SocketTimeoutException :)

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

Tôi vẫn gặp lỗi "Không thể nhận tài nguyên từ hồ bơi". Stacktrace được đưa ra dưới đây.

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

Và máy chủ Redis của bạn có còn sống không? Bạn có thể kết nối với nó từ hộp máy khách bằng redis-cli không? –

+0

Có Máy chủ Redis vẫn còn hoạt động và có thể kết nối bằng redis-cli – Vignesh

+1

Tôi gặp vấn đề tương tự. Redis đang chạy. Vấn đề xảy ra khi sử dụng JedisPool, và tôi làm 'returnResource'. Không có vấn đề gì với 'Jedis jedis = new Jedis (" localhost ");'. Bạn đã giải quyết vấn đề này chưa? –

Trả lời

1

Không chắc chắn, nhưng có thể bạn không trả lại các đối tượng Jedis vào hồ bơi và máy chủ redis của bạn có giới hạn kết nối.

Mỗi sợi nhân nên trở lại trường Jedis đến hồ bơi sau giờ làm việc của nó là hoàn toàn:

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

yes @Jarek, tôi đã trả lại tài nguyên rồi. \t ** pool.returnResource (jedis); hồ bơi.destroy(); ** – Vignesh

+0

Trong ứng dụng Java của tôi, tôi đang sử dụng tệp Jedis2.0.0.jar và phiên bản máy chủ redis là 2.4.13. Nó có gây ra vấn đề không? – Vignesh

4

tôi nhận thấy rằng ngoại lệ này có thể và sẽ được ném ra nếu Redis không chạy. Chỉ cần một đầu lên.

1

Nếu mã của bạn là như thế này:

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

Bạn có thể thử này:

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

Đây là bởi vì đối với Redis thời gian timeout mặc định là 2 giây, nhưng chương trình có thể hoàn thành chạy vào thời gian này.

2

Dựa trên câu trả lời của Rick Hanlon, ngoại lệ này cũng bị hủy nếu sử dụng Redis với Spring Boot.

Nếu bạn đang sử dụng Khởi động mùa xuân, chỉ phụ thuộc vào Redis là chưa đủ; bạn cũng cần phải tự tải về và cài đặt Redis trên máy tính của bạn từ redis.io, sau đó chạy nó tắt của một thiết bị đầu cuối Bash:

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

Sau khi chạy máy chủ, bạn sẽ cần phải thêm các dòng có liên quan trong tất cả các ứng dụng của bạn mà sử dụng 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

Điều đó có xảy ra luôn hay thỉnh thoảng? Nếu thỉnh thoảng, bạn có thể muốn kiểm tra kích thước của nhóm kết nối.

Kích thước nhóm kết nối mặc định, nếu bạn đang sử dụng JedisPoolConfig, là 8. Điều này có thể quá nhỏ đối với trường hợp của bạn.

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