1. 復(fù)現(xiàn)錯(cuò)誤
今天從gitlab
上下載本公司的項(xiàng)目,但在啟動時(shí)報(bào)出如下錯(cuò)誤:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisKeyExpirationListener' defined in file [D:\Software\...\RedisKeyExpirationListener.class]: Invocation of init method failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
......
Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:198)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:345)
at org.springframework.data.redis.listener.KeyspaceEventMessageListener.init(KeyspaceEventMessageListener.java:80)
at org.springframework.data.redis.listener.KeyspaceEventMessageListener.afterPropertiesSet(KeyspaceEventMessageListener.java:132)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 59 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:53)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:191)
... 64 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:207)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:49)
... 67 more
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at redis.clients.jedis.Connection.connect(Connection.java:184)
... 74 more
具體的錯(cuò)誤信息為redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
。
2. 分析錯(cuò)誤
根據(jù)上述報(bào)錯(cuò)信息可知,這是redis
出現(xiàn)了錯(cuò)誤。
- 首先,檢查我的
redis
的配置信息,如下代碼所示:
########################################
###
### 2.redis的配置
###
########################################
cache:
redis:
db: 12
enable: true
hostName: 127.0.0.1
password: test
port: 6379
據(jù)此可以看出,我的redis
配置沒有問題。
-
redis
配置既然沒有問題,則去檢查Jedis ConnectionFactory
的配置是否存在問題,如下代碼所示:
<!-- Jedis ConnectionFactory -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${cache.redis.hostName}"/>
<property name="port" value="${cache.redis.port}"/>
<property name="password" value="${cache.redis.password}"/>
<property name="database" value="${cache.redis.db}"/>
<property name="usePool" value="true"/>
<property name="poolConfig">
<!-- jedisPoolConfig -->
<bean class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100"/>
<property name="minIdle" value="20"/>
<property name="maxWaitMillis" value="10000"/>
</bean>
</property>
</bean>
由上代碼所示,Jedis ConnectionFactory
的配置也沒有問題。
- 繼續(xù)分析錯(cuò)誤信息,錯(cuò)誤信息說
Error creating bean with name 'redisKeyExpirationListener'...
,即無法創(chuàng)建redisKeyExpirationListener
的bean對象,則去檢查RedisKeyExpirationListener
類,如下代碼所示:
/**
* @author super先生
* @datetime 2023/3/12 16:30
* @desc 這是對redis key過期的監(jiān)聽器
*/
@Component
@Conditional({RedisCondition.class})
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
private Logger LOG = LoggerFactory.getLogger(this.getClass());
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private ProjectDao projectDao;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String key = message.toString();
LOG.info("{} 緩存已到期", key);
String[] split = key.split("_");
if ("timer".equals(split[1])) {
//
if (!redisTemplate.hasKey(split[0])) {
// 如果沒有key,刪除定時(shí)器key
redisTemplate.delete(key);
LOG.info("{} 對應(yīng)的數(shù)據(jù)不存在,已刪除", key);
return;
}
String value = redisTemplate.opsForValue().get(split[0]);
DashboardBoard dashboardBoard = JSONObject.parseObject(value, DashboardBoard.class);
if (dashboardBoard == null) {
// 重新設(shè)置key
redisTemplate.opsForValue().set(split[0] + "_timer", "", 5, TimeUnit.MINUTES);
LOG.info("{} 緩存重設(shè)", split[0]);
return;
}
try {
projectDao.update(dashboardBoard);
redisTemplate.delete(split[0]);
LOG.info("數(shù)據(jù)持久化, {} 緩存刪除", split[0]);
} catch (Exception e) {
e.printStackTrace();
// 重新設(shè)置key
redisTemplate.opsForValue().set(split[0] + "_timer", "", 5, TimeUnit.MINUTES);
LOG.info("{} 緩存重設(shè)", split[0]);
}
}
}
}
經(jīng)過對RedisKeyExpirationListener
類的檢查,沒有返現(xiàn)任何問題。
- 繼續(xù)分析上述錯(cuò)誤,直至看到
connect timed out
錯(cuò)誤信息。
connect timed out
表示連接超時(shí),也就是說,我的redis
沒有啟動。
我經(jīng)過反復(fù)檢查后,發(fā)現(xiàn)我的redis
確實(shí)沒有啟動。
3. 解決錯(cuò)誤
由于我沒有啟動redis
,啟動redis
即可,如下圖所示:
重新啟動項(xiàng)目,即可成功運(yùn)行,如下圖所示:
4. 解決此錯(cuò)誤的其他辦法
我的是因?yàn)闆]有啟動redis
,導(dǎo)致了這個(gè)錯(cuò)誤:Could not get a resource from the pool
。
如果你的redis
啟動了,但仍報(bào)出這個(gè)錯(cuò)誤,可以參考如下解決方法,來解決你的錯(cuò)誤:
-
檢查
redis
是否崩潰(宕機(jī))。 -
檢查
redis
的連接池
輸入如下命令,進(jìn)入redis
服務(wù)器:
./redis-cli -h 127.0.0.1 -p 6379 -a passwd
輸入如下命令,查看當(dāng)前連接數(shù):
INFO clients
- 檢查
redis
服務(wù)器的最大連接數(shù)配置,如果需要,請將其增加。
輸入如下命令,查看最大連接數(shù):
config get maxclients
-
檢查網(wǎng)絡(luò)連接是否正常,并確保防火墻未阻止連接。文章來源:http://www.zghlxwxcb.cn/news/detail-703144.html
-
檢查
redis
服務(wù)器的配置文件和協(xié)議是否正確。文章來源地址http://www.zghlxwxcb.cn/news/detail-703144.html
到了這里,關(guān)于詳細(xì)解決redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!