Spring MVC 异步请求结合 Redis 发布订阅功能
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-cli
向 news
频道发布消息:
127.0.0.1:6379> publish news hello
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论