Spring MVC 异步请求结合 Redis 发布订阅功能

发布于 2025-02-19 23:47:34 字数 3129 浏览 7 评论 0

Spring Data Redis 配置

pom.xml

<!-- Spring Data Redis -->
<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-redis</artifactId>
  <version>2.2.8.RELEASE</version>
</dependency>

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.1.0</version>
</dependency>
<!-- ./Spring Data Redis -->

app-context.xml

<!-- 配置 Jedis 连接器 -->
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
  p:hostName="127.0.0.1" p:port="6379" p:usePool="true"/>

<bean class="org.springframework.data.redis.core.RedisTemplate"
  p:connection-factory-ref="jedisConnectionFactory"/>

<!-- 消息发布/订阅 -->
<redis:listener-container connection-factory="jedisConnectionFactory">
  <!-- the method attribute can be skipped as the default method name is "handleMessage" -->
  <redis:listener ref="newsListener" method="handleMessage" topic="news" />
</redis:listener-container>

<bean class="net.wuxianjie.demo.redis.NewsMessageDelegate"/>
<!-- ./消息发布/订阅 -->
<!-- ./配置 Jedis 连接器 -->
package net.wuxianjie.demo.redis;

public interface MessageDelegate {

  void handleMessage(String message);
}
package net.wuxianjie.demo.redis;

import org.springframework.web.context.request.async.DeferredResult;

public class NewsMessageDelegate implements MessageDelegate {

  private DeferredResult<String> deferredResult;

  @Override
  public void handleMessage(String message) {

    deferredResult.setResult(message);
  }

  public DeferredResult<String> getDeferredResult() {
    return deferredResult;
  }

  public void setDeferredResult(
    DeferredResult<String> deferredResult) {
    this.deferredResult = deferredResult;
  }
}

测试代码

package net.wuxianjie.demo.controller;

import net.wuxianjie.demo.redis.NewsMessageDelegate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;

@RestController
@RequestMapping("/news")
public class NewsController {

  @Autowired
  private NewsMessageDelegate newsMessageDelegate;

  @GetMapping("")
  public DeferredResult<String> getNews() {

    DeferredResult<String> deferredResult = new DeferredResult<>(3000L);

    newsMessageDelegate.setDeferredResult(deferredResult);

    deferredResult.onTimeout(() -> {
      deferredResult.setResult("请求超时");
    });

    return deferredResult;
  }
}

如果在请求的 3 秒内, news 频道有消息发布,则立即获取此消息;否则,返回 "请求超时"

GET http://localhost:8000/news

通过 redis-clinews 频道发布消息:

127.0.0.1:6379> publish news hello

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

肩上的翅膀

暂无简介

文章
评论
26 人气
更多

推荐作者

闻呓

文章 0 评论 0

深府石板幽径

文章 0 评论 0

mabiao

文章 0 评论 0

枕花眠

文章 0 评论 0

qq_CrTt6n

文章 0 评论 0

红颜悴

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文