序
redis提供了簡單的發(fā)布訂閱功能,對于一些合適的場景(比如不要求消費者不在線時也能收到離線消息),比起專業(yè)的MQ來說,用起來更簡單些。本文主要是記錄下怎么在SpringBoot里頭使用redis的發(fā)布訂閱功能。
定義生產(chǎn)者
配置
@Bean ????MyPublisher?redisPublisher(RedisConnectionFactory?factory)?{ ????????return?new?MyPublisher(?redisTemplate(factory),?topic()?); ????} ????@Bean ????ChannelTopic?topic()?{ ????????return?new?ChannelTopic(?"pubsub:queue"?); ????}
生產(chǎn)者實例
public?class?MyPublisher?{ ????private?final?RedisTemplate?template; ????private?final?ChannelTopic?topic; ????private?final?AtomicLong?counter?=?new?AtomicLong(?0?); ????public?MyPublisher(?final?RedisTemplate?template, ???????????????????????????????final?ChannelTopic?topic?)?{ ????????this.template?=?template; ????????this.topic?=?topic; ????} ????@Scheduled(?fixedDelay?=?100?) ????public?void?publish()?{ ????????template.convertAndSend(?topic.getTopic(),?"Message?"?+?counter.incrementAndGet()?+ ????????????????",?"?+?Thread.currentThread().getName()?); ????} }
定義消費者
配置
//subscribe ????@Bean ????MessageListenerAdapter?messageListener()?{ ????????return?new?MessageListenerAdapter(?new?MyMessageListener()?); ????} ????@Bean ????RedisMessageListenerContainer?redisContainer(RedisConnectionFactory?factory)?{ ????????final?RedisMessageListenerContainer?container?=?new?RedisMessageListenerContainer(); ????????container.setConnectionFactory(factory); ????????container.addMessageListener(messageListener(),?topic()); ????????return?container; ????}
消費者實例
public?class?MyMessageListener?implements?MessageListener?{ ????@Override ????public?void?onMessage(?final?Message?message,?final?byte[]?pattern?)?{ ????????System.out.println(?"Message?received:?"?+?message.toString()?); ????} }
運行
??.???____??????????_????????????__?_?_ ?/?/?___'_?__?_?_(_)_?__??__?_???? (?(?)___?|?'_?|?'_|?|?'_?/?_`?|???? ?/??___)|?|_)|?|?|?|?|?||?(_|?|??)?)?)?) ??'??|____|?.__|_|?|_|_|?|___,?|?/?/?/?/ ?=========|_|==============|___/=/_/_/_/ ?::?Spring?Boot?::????????(v1.3.2.RELEASE) 2016-02-16?00:14:08.190??INFO?1481?---?[???????????main]?com.codecraft.RedisdemoApplication??????:?Starting?RedisdemoApplication?on?Jupiter.local?with?PID?1481?(/Users/codecraft/workspace/redisdemo/target/classes?started?by?codecraft?in?/Users/codecraft/workspace/redisdemo) 2016-02-16?00:14:08.193??INFO?1481?---?[???????????main]?com.codecraft.RedisdemoApplication??????:?No?active?profile?set,?falling?back?to?default?profiles:?default 2016-02-16?00:14:08.242??INFO?1481?---?[???????????main]?s.c.a.AnnotationConfigApplicationContext?:?Refreshing?org.springframework.context.annotation.AnnotationConfigApplicationContext@140e5a13:?startup?date?[Tue?Feb?16?00:14:08?CST?2016];?root?of?context?hierarchy 2016-02-16?00:14:09.756??INFO?1481?---?[???????????main]?o.s.j.e.a.AnnotationMBeanExporter????????:?Registering?beans?for?JMX?exposure?on?startup 2016-02-16?00:14:09.763??INFO?1481?---?[???????????main]?o.s.c.support.DefaultLifecycleProcessor??:?Starting?beans?in?phase?0 2016-02-16?00:14:09.807??INFO?1481?---?[???????????main]?o.s.c.support.DefaultLifecycleProcessor??:?Starting?beans?in?phase?2147483647 2016-02-16?00:14:09.897??INFO?1481?---?[???????????main]?com.codecraft.RedisdemoApplication??????:?Started?RedisdemoApplication?in?2.215?seconds?(JVM?running?for?2.589) Message?received:?"Message?1,?pool-1-thread-1" Message?received:?"Message?2,?pool-1-thread-1" Message?received:?"Message?3,?pool-1-thread-1" Message?received:?"Message?4,?pool-1-thread-1" Message?received:?"Message?5,?pool-1-thread-1" Message?received:?"Message?6,?pool-1-thread-1" Message?received:?"Message?7,?pool-1-thread-1" Message?received:?"Message?8,?pool-1-thread-1" Message?received:?"Message?9,?pool-1-thread-1" Message?received:?"Message?10,?pool-1-thread-1"
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END