2、导入依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies>
3、修改 application.yml 配置
spring: redis: host: 127.0.0.1 database: 0 port: 6379 jedis: pool: max-active: 256 max-idle: 8 min-idle: 1 server: port: 8080 tomcat: uri-encoding: utf-8
4、新建一个config包,导入Redis配置
@Configuration public class RedisConfig {
@Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; } }
5、新建一个service包,写一个接口
public interface MQService {
void produce(String string); void consume(); void blockingConsume(); }
5、写一个该接口的实现类,实现业务代码
@Service public class MQServiceImpl implements MQService {
private static Logger log = LoggerFactory.getLogger(MQServiceImpl.class); private static final String MESSAGE_KEY = "message:queue"; // blpop 是阻塞式列表的弹出原语。当给定列表内没有任何元素可供弹出的时候, 连接将被 blpop 命令阻塞。 // 直到有另一个客户端对给定的这些 key 的任意一个执行 lpush 或 rpush 命令为止。 // 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素 //brpop超时时间 Jessica 2021-11-05 private static final int TIME_OUT=10; @Resource private RedisTemplate redisTemplate; @Override public void produce(String string) {
redisTemplate.opsForList().leftPush(MESSAGE_KEY, string); } @Override public void consume() {
String string = (String) redisTemplate.opsForList().rightPop(MESSAGE_KEY); log.info("consume : {}", string); } public void blockingConsume() {
List<Object> obj = redisTemplate.executePipelined(new RedisCallback<Object>() {
@Nullable @Override public Object doInRedis(RedisConnection connection) throws DataAccessException {
//队列没有元素会阻塞操作,直到队列获取新的元素或超时 return connection.bLPop(TIME_OUT, MESSAGE_KEY.getBytes()); } },new StringRedisSerializer()); for (Object str: obj) {
log.info("blockingConsume : {}", str); } } }
5、新建一个controller包,controller调用service方法
@RestController @RequestMapping(value="/api") public class MQController {
@Resource private MQService mQService; @RequestMapping(value = "/produce", method= RequestMethod.GET) public void produce(@RequestParam(name = "key") String key) {
mQService.produce(key); } @RequestMapping(value="/consume", method=RequestMethod.GET) public void consume() throws Exception{
//第一种,没有参数的Redis 队列,会不停连接,连接失败会自动断开 Jessica 2021-11-05 // while (true) {
// mQService.consume(); // } //第二种,即使没有参数,会陷入阻塞阶段 mQService.blockingConsume(); } }
7、开启windows的Redis,没有安装包可以去官网下载一个,这里要强调一下,Redis是CS架构的,我们下载Redis安装包(必须是Windows版)后,需要先启动Redis,进入Redis安装的根目录,然后输入命令,启动服务端
E:\DevelopTools\redis>redis-server.exe redis.windows.conf
各位观众老爷们,创作不易,麻烦点赞、关注、收藏,谢谢!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216535.html原文链接:https://javaforall.net
