在Cloud Foundry上使用spring-data-redis时检测到资源泄漏

时间:2019-04-16 14:14:56

标签: spring spring-boot spring-cloud-config spring-data-redis lettuce

我们开发了一个spring-boot服务,该服务提供一个rest api(spring-webflux)并通过RabbitMQ(spring-rabbit)发送数据。该服务已部署在Cloud Foundry上,我们在版本2.1.4中使用spring-boot。我们添加了spring-boot-starter-data-redis来使用Redis缓存一些数据,但出现以下错误:

SELECT 
       IF(Num_B in (select distinct Num_A from mydata) , concat(Num_A,Num_B), Null) as Comm_1,
       IF(Num_C in (select distinct Num_A from mydata) , concat(Num_A,Num_C), Null) as Comm_2
FROM mydata

此错误仅在我们在Cloud Foundry上运行服务时发生,如果在本地运行,则不会出现任何错误。

我们不对连接工厂或stringRedisTemplate进行任何配置,而仅使用由spring-autoconfiguration配置的stringRedisTemplate。 我们将以下配置用于Cloud Foundry上的Redis:

pl/sql

这就是我们使用模板的方式

[io.netty.util.ResourceLeakDetector] [] LEAK: HashedWheelTimer.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records: 
Created at:
    io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:284)
    io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:217)
    io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:196)
    io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:178)
    io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:162)
    io.lettuce.core.resource.DefaultClientResources.<init>(DefaultClientResources.java:169)
    io.lettuce.core.resource.DefaultClientResources$Builder.build(DefaultClientResources.java:532)
    io.lettuce.core.resource.DefaultClientResources.create(DefaultClientResources.java:233)
    io.lettuce.core.AbstractRedisClient.<init>(AbstractRedisClient.java:98)
    io.lettuce.core.RedisClient.<init>(RedisClient.java:87)
    io.lettuce.core.RedisClient.create(RedisClient.java:124)
    org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.lambda$createClient$7(LettuceConnectionFactory.java:971)
    java.base/java.util.Optional.orElseGet(Unknown Source)
    org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.createClient(LettuceConnectionFactory.java:971)
    org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.afterPropertiesSet(LettuceConnectionFactory.java:273)
    org.springframework.cloud.service.keyval.RedisConnectionFactoryCreator.create(RedisConnectionFactoryCreator.java:88)
    org.springframework.cloud.service.keyval.RedisConnectionFactoryCreator.create(RedisConnectionFactoryCreator.java:31)
    org.springframework.cloud.Cloud.getServiceConnector(Cloud.java:288)
    org.springframework.cloud.Cloud.getSingletonServiceConnector(Cloud.java:202)
    org.springframework.cloud.config.java.CloudServiceConnectionFactory.redisConnectionFactory(CloudServiceConnectionFactory.java:260)
    org.springframework.cloud.config.java.CloudServiceConnectionFactory.redisConnectionFactory(CloudServiceConnectionFactory.java:242)
    ...

这些是我们的Spring依赖项:

@Configuration
@Profile( "cloud" )
public class CloudSpecificConfig extends AbstractCloudConfig {

   @Bean
   public RedisConnectionFactory redisConnectionFactory() {
      return connectionFactory().redisConnectionFactory();
   }
}

由于我们并没有进行任何特定的配置,因此我们对此感到非常困惑。在我们看来,云上的弹簧配置有问题。我们做错什么了吗?我们是否需要进行其他配置?这是错误吗?

2 个答案:

答案 0 :(得分:0)

这就是我要做的

我会看看是否可以找到一种更优雅的方式

@Bean(destroyMethod = "shutdown")
public DefaultClientResources lettuceClientResources() {
    return DefaultClientResources.create();
}

@SuppressWarnings("unused")
@Bean
public RedisConnectionFactory redisConnectionFactory(DefaultClientResources dependency) {
    return connectionFactory().redisConnectionFactory("redis-pcf-service");
}

答案 1 :(得分:0)

最后,由于我们将redis客户从生菜改为jedis,问题在我们这边消失了。

生菜存在问题,我们将失去与云基础架构上的Redis服务的连接。但是,由于更改客户端的同时对redis服务进行了更新,因此我们真的不知道它是否与生菜有关。

也许自动配置与基于Cloudfoundry的云基础架构上的redis服务结合起来还是有问题的