當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
nodejs redis 发布订阅_太赞了:Spring boot+redis实现消息发布与订阅
生活随笔
收集整理的這篇文章主要介紹了
nodejs redis 发布订阅_太赞了:Spring boot+redis实现消息发布与订阅
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一.創(chuàng)建spring boot項(xiàng)目
org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-web com.alibaba fastjson 1.2.41二.編輯yml配置文件
server: port: 7888# 日志配置logging: config: classpath:log/logback.xml level: cn.com.dhcc: info org.springframework: info org.springframework.web: info com.alibaba.nacos.client.naming: errorspring: redis: host: localhost port: 6379 password: ********* database: 1 jedis: pool: max-idle: 8 max-active: 8 max-wait: -1 min-idle: 0 timeout: 5000三.配置Redis
@Configurationpublic class RedisConfiguration { /** * 實(shí)例化 RedisTemplate 對(duì)象 * * @return */ @Bean("RedisTemplateS") public RedisTemplate functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory); return redisTemplate; } /** * 設(shè)置數(shù)據(jù)存入 redis 的序列化方式,并開啟事務(wù) * * @param redisTemplate * @param factory */ private void initDomainRedisTemplate(@Qualifier("RedisTemplateS") RedisTemplate redisTemplate, RedisConnectionFactory factory) { // 如果不配置Serializer,那么存儲(chǔ)的時(shí)候缺省使用String,如果用User類型存儲(chǔ),那么會(huì)提示錯(cuò)誤User can't cast to // String! redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class); redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); redisTemplate.setValueSerializer(fastJsonRedisSerializer); //redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); //redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // 開啟事務(wù) redisTemplate.setEnableTransactionSupport(true); redisTemplate.setConnectionFactory(factory); } /** * 注入封裝RedisTemplate @Title: redisUtil @return RedisUtil @date * */ @Bean(name = "redisUtils") public RedisUtils redisUtil(@Qualifier("RedisTemplateS") RedisTemplate redisTemplate) { RedisUtils redisUtil = new RedisUtils(); redisUtil.setRedisTemplate(redisTemplate); return redisUtil; }四.編寫RedisUtil消息發(fā)布方法
public class RedisUtils { private static final Logger log = LoggerFactory.getLogger(RedisUtils.class); private RedisTemplate redisTemplate; public void setRedisTemplate(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } public void publish(String channal ,Object obj) { redisTemplate.convertAndSend(channal,obj ); }}五.配置消息監(jiān)聽
@Configurationpublic class RedisMessageListener { /** * 創(chuàng)建連接工廠 * @param connectionFactory * @param listenerAdapter * @return */ @Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter,MessageListenerAdapter listenerAdapter2){ RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); //接受消息的key container.addMessageListener(listenerAdapter,new PatternTopic("phone")); return container; } /** * 綁定消息監(jiān)聽者和接收監(jiān)聽的方法 * @param receiver * @return */ @Bean public MessageListenerAdapter listenerAdapter(ReceiverRedisMessage receiver){ return new MessageListenerAdapter(receiver,"receiveMessage"); } /** * 注冊(cè)訂閱者 * @param latch * @return */ @Bean ReceiverRedisMessage receiver(CountDownLatch latch) { return new ReceiverRedisMessage(latch); } /** * 計(jì)數(shù)器,用來控制線程 * @return */ @Bean public CountDownLatch latch(){ return new CountDownLatch(1);//指定了計(jì)數(shù)的次數(shù) 1 }}六.消息訂閱方法
public class ReceiverRedisMessage { private static final Logger log = LoggerFactory.getLogger(ReceiverRedisMessage.class); private CountDownLatch latch; @Autowired public ReceiverRedisMessage(CountDownLatch latch) { this.latch = latch; } /** * 隊(duì)列消息接收方法 * * @param jsonMsg */ public void receiveMessage(String jsonMsg) { log.info("[開始消費(fèi)REDIS消息隊(duì)列phone數(shù)據(jù)...]"); try { log.info("監(jiān)聽者收到消息:{}", jsonMsg); JSONObject exJson = JSONObject.parseObject(jsonMsg); User user = JSON.toJavaObject(exJson, User.class); System.out.println("轉(zhuǎn)化為對(duì)象 :"+user); log.info("[消費(fèi)REDIS消息隊(duì)列phone數(shù)據(jù)成功.]"); } catch (Exception e) { log.error("[消費(fèi)REDIS消息隊(duì)列phone數(shù)據(jù)失敗,失敗信息:{}]", e.getMessage()); } latch.countDown(); }}七.定時(shí)消息發(fā)布測(cè)試
@EnableScheduling@Componentpublic class PublisherController { private static final Logger log = LoggerFactory.getLogger(PublisherController.class); @Autowired private RedisUtils redisUtils; @Scheduled(fixedRate = 5000) public String pubMsg() { User user=new User(1, "尚***", 26,"男","陜西省xxxx市xxxxxx縣"); redisUtils.publish("phone", user); log.info("Publisher sendes Topic... "); return "success"; }}八.測(cè)試結(jié)果
九.發(fā)布對(duì)象User實(shí)體
public class User implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int id; private String name; private int age; private String sex; private String address; .....................}感謝閱讀 關(guān)注小編 獲得很多好文。
總結(jié)
以上是生活随笔為你收集整理的nodejs redis 发布订阅_太赞了:Spring boot+redis实现消息发布与订阅的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: source tree 递归子模块_多模
- 下一篇: 选举新的业委会时,投票表决用什么软件方便