Недавно я столкнулся на работе с необходимостью функции очереди сообщений, слышал, что Redis может реализовать эту функцию, поэтому специально резюмировал.
1. Сначала настройте Redis и введите пакет maven jar.
#redis 配置
redis:
#Redis数据库索引(默认为0)
database: 0
host: 10.168.2.160
port: 6379
lettuce:
pool:
max-active: 8 #最大连接数据库连接数,设 0 为没有限制
max-idle: 8 #最大等待连接中的数量,设 0 为没有限制
max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
min-idle: 0 #最小等待连接中的数量,设 0 为没有限制
shutdown-timeout: 100ms
#password: auMartadmin@@ 密码待定
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. Начните писать код получателя сообщения.
package com.pinemousecloudsevice.messagequeue;
import com.pinemousecloudsevice.common.constant.CommonConstant;
import com.pinemousecloudsevice.messagequeue.message.OrderInvoiceMessage;
import com.pinemousecloudsevice.task.service.AutoInvoiceStatusQueryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 消息接收者实体类
* @author
* @date 2021-03-18
*/
@Slf4j
@Component
public class RedisMessage implements MessageListener {
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Resource
private AutoInvoiceStatusQueryService autoInvoiceStatusQueryService;
/**
*实际业务代码 消息体为对象实体
*/
// @Override
// public void onMessage(Message message, byte[] pattern) {
// RedisSerializer<?> serializer = redisTemplate.getValueSerializer();
// OrderInvoiceMessage orderInvoiceMessage = (OrderInvoiceMessage) serializer.deserialize(message.getBody());
// //发票订单查询处理
// Boolean isStop = autoInvoiceStatusQueryService.invoiceOrderQueryHandle(orderInvoiceMessage);
// //不停止订单查询 加入redis list集合中
// if(!isStop){
// redisTemplate.opsForList().rightPush(CommonConstant.INVOICE_QUERY_STATUS_LIST, orderInvoiceMessage);
// }
// }
/**
* 测试代码
*/
@Override
public void onMessage(Message message, byte[] pattern) {
RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
String msg = serializer.deserialize(message.getBody());
System.out.println("接收到的消息是:" + msg);
}
}
3. Настройте подписчиков сообщений
import com.pinemousecloudsevice.messagequeue.RedisMessage;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
/**
* 消息队列 订阅者 redis配置
* @author
* @date 2021-03-18
*/
@Configuration
public class RedisSubConfig {
/**
* 创建连接工厂
*
* @param connectionFactory
* @param adapter
* @return
*/
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter adapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(adapter, new PatternTopic("topic"));
return container;
}
/**
* @param message
* @return
*/
@Bean
public MessageListenerAdapter adapter(RedisMessage message){
// onMessage 如果RedisMessage 中 没有实现接口,这个参数必须跟RedisMessage中的读取信息的方法名称一样
return new MessageListenerAdapter(message, "onMessage");
}
}
4. Проверьте код
@RestController
public class MsgController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/sendMsg")
public String sendMsg(){
stringRedisTemplate.convertAndSend("topic", "Hello world!");
return "ok";
}
}
где stringRedisTemplate также можно заменить на
@Ресурс частный RedisTemplate<String, Object> RedisШаблон;