当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Redis配置不工作

祁霖
2023-03-14

我正在开发一个带有ServletLaunalizer的Spring Boot[web]REST风格的应用程序(因为它需要部署到现有的Tomcat服务器)。它有一个@RestController,其方法在调用时需要写入Redispub-sub通道。我让Redis服务器在localhost上运行(默认端口,没有密码)。POM文件的相关部分具有所需的启动器依赖关系:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

当我部署战争并到达终点时http://localhost:8080/springBootApp/health,我得到这样的回应:

{
  "status": "DOWN",
  "diskSpace": {
    "status": "UP",
    "total": 999324516352,
    "free": 691261681664,
    "threshold": 10485760
  },
  "redis": {
    "status": "DOWN",
    "error": "org.springframework.data.redis.RedisConnectionFailureException: java.net.SocketTimeoutException: Read timed out; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out"
  }
}

我在Spring Boot应用程序类中添加了以下内容:

@Bean
JedisConnectionFactory jedisConnectionFactory() {
    return new JedisConnectionFactory();
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
    template.setConnectionFactory(jedisConnectionFactory());
    return template;
}

执行一些测试Redis代码之前,我还尝试将以下内容添加到我的@RestController,但我在堆栈跟踪中得到了与上面相同的错误:

@Autowired
private RedisTemplate<String, String> redisTemplate;

编辑(2017-05-09)我的理解是Spring Boot Redis启动器假设spring.redis.host=localhostspring.redis.port=6379的默认值,我仍然将两者添加到application.properties,但这并不能填补空白。

更新(2017-05-10)我为这个帖子添加了一个答案。

共有3个答案

戚升
2023-03-14

这是一个与代理相关的问题,甚至连对本地主机的访问都受到了某种程度的限制。一旦我禁用了代理设置,Redis health就启动了!所以问题解决了。我不需要向应用程序添加任何属性。属性,我也不必在Spring Boot应用程序类中显式配置任何内容,因为Spring Boot和Redis Starter会根据Redis默认值自动配置(在我的开发环境中适用)。我刚刚在pom中添加了以下内容。xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

下面是@RestController注释类,以及Spring Boot根据需要自动连接(棒极了!)。

@Autowired
private RedisTemplate<String, String> redisTemplate;

要将简单的消息发布到通道,这一行代码足以验证设置:

this.redisTemplate.convertAndSend(channelName, "hello world");

我感谢所有的评论,它们有助于支持我的支票。

高功
2023-03-14

您需要使用应用程序配置redis服务器信息。属性:

# REDIS (RedisProperties)
spring.redis.cluster.nodes= # Comma-separated list of "host:port"
spring.redis.database=0 # Database index
spring.redis.url= # Connection URL, 
spring.redis.host=localhost # Redis server host.
spring.redis.password= # Login password of the redis server.
spring.redis.ssl=false # Enable SSL support.
spring.redis.port=6379 # Redis server port.

Spring数据文档:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#REDIS

宋勇
2023-03-14

我用redis和spring boot做了一个简单的例子

首先我在docker上安装了redis:

$docker run——说出一些redis-d redis服务器的名字——appendonly yes

然后我将此代码用于接收器:

import java.util.concurrent.CountDownLatch;

public class Receiver {
    private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class);

    private CountDownLatch latch;

    @Autowired
    public Receiver(CountDownLatch latch) {
        this.latch = latch;
    }

    public void receiveMessage(String message) {
        LOGGER.info("Received <" + message + ">");
        latch.countDown();
    }

}

这是我的Spring启动应用程序和我的听众:

@SpringBootApplication
// after add security library then it is need to use security configuration.
@ComponentScan("omid.spring.example.springexample.security")
public class RunSpring {
    private static final Logger LOGGER = LoggerFactory.getLogger(RunSpring.class);


    public  static   void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext contex =  SpringApplication.run(RunSpring.class, args);
    }

    @Autowired
    private ApplicationContext context;

    @RestController
    public class SimpleController{

        @RequestMapping("/test")
        public String getHelloWorld(){

            StringRedisTemplate template = context.getBean(StringRedisTemplate.class);
            CountDownLatch latch = context.getBean(CountDownLatch.class);

            LOGGER.info("Sending message...");

            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0 ;  i < 100 ; i++) {
                        template.convertAndSend("chat", i + " => Hello from Redis!");
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }

                }
            });
            t.start();

            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


            return "hello world 1";
        }
    }

    ///////////////////////////////////////////////////////////////


    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("chat"));

        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    @Bean
    Receiver receiver(CountDownLatch latch) {
        return new Receiver(latch);
    }

    @Bean
    CountDownLatch latch() {
        return new CountDownLatch(1);
    }

    @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }
}

重要的一点是redis IP。如果你像我一样在docker上安装它,那么你应该像这样在application.properties中设置ip地址:spring.redis.host=172.17.0.4

我把我所有的spring示例都放在了github上

 类似资料:
  • 那是我学习Kafka的初期。我正在检查我本地机器中的每一个Kafka属性/概念。 所以我遇到了属性,下面是我的理解。如果我误解了什么,请纠正我。 将消息发送到主题后,必须将消息写入至少关注者数。 还包括引导。 如果可用活动代理的数量(间接地,在同步副本中)少于指定的,则生产者将引发发布消息失败的异常。 以下是我创建上述场景所遵循的步骤 在本地启动了3个代理,代理ID为0、1和2 创建了主题insy

  • 但就是不管用。我也试过在-d中使用这个选项,但这也不起作用。 谢谢你的帮助

  • 下面是我正在使用的配置。消息没有错误,从exchange到队列都可以正常工作,并且侦听器可以进行转换,这很好。对于错误消息,我希望发生的是,当我抛出AmqpRejectAndDontRequeueException时,“rabbitQueue”将消息转发到死信交换,并最终进入“rabbitErrorQueue”但死信交换或队列上没有任何活动。有人知道我做错了什么吗?

  • 我正试图使用两个redis节点设置哨兵。请找到内联的conf文件。 端口16371 dir“C:\程序文件\redis\16371\” loglevel通知 日志文件“C:\Program Files\redis\logs\16371.log” 哨兵监视器示例127.0.0.1 6371 *致命配置文件错误*读取配置文件,在第5行 有人能帮我把这个修好吗。蒂亚:)

  • 我的log4j2中有此配置。xml文件: 我将此文件放在src/resources中,并遵循以下指南:guide,但当我运行项目时,出现以下错误:

  • 我正在做一个Spring Boot应用程序,并试图以编程方式配置kafka,但由于某些原因,我仍然在从应用程序获取属性。yaml而不是我通过编程设置的