上面一篇作者讲解了简单时间轮的概念和应用,不懂可以参考:简单时间轮
简单时间轮可以对多个任务进行周期性的执行,可以定制化周期进行任务执行。
本篇内容讲解redis消息队列和时间轮的搭配应用。
声明:redis消息队列采用生产消费者模式
大概应用流程:
下面附上redis消息队列-消费订阅者模式的事例代码,时间轮模块代码请参考时间轮
spring-redis配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:redis="http://www.springframework.org/schema/redis" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis.xsd"> <description>spring-redis配置</description> //redis链接制造工厂 <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.server.host}"></property> <property name="port" value="${redis.server.port}"></property> <property name="usePool" value="true"></property> </bean> //基于spring封装的redis常用的操作 <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="redisConnectionFactory"></property> </bean> //一般我们向Redis发送一个消息定义的Java对象,这个对象需要序列化。这里使用JdkSerializationRedisSerializer <bean id="jdkSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> //消息发送 <bean id="sendMessage" class="com.bosssoft.itfinance.payqrcode.messageCenter.common.redisqueue.SendMessage"> <property name="redisTemplate" ref="redisTemplate"/> </bean> //消息监听 <bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter"> <property name="delegate" ref="messageDelegateListener" /> <property name="serializer" ref="jdkSerializer" /> </bean> //定义消息监听,method:监听消息执行的方法,serializer:序列化,topic:监听主题(可以理解为队列名称) <redis:listener-container> <redis:listener ref="messageListener" method="handleMessage" serializer="jdkSerializer" topic="messageCenterRedisQueue" /> </redis:listener-container> </beans>消息生产者类
import org.springframework.data.redis.core.RedisTemplate; import java.io.Serializable; /** * redis队列 生产者 * created by 魏霖涛 on 2017/9/6 0006 */ public class SendMessage { private RedisTemplate<String, Object> redisTemplate; public RedisTemplate<String, Object> getRedisTemplate() { return redisTemplate; } public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } public void sendMessage(String channel, Serializable message) { redisTemplate.convertAndSend(channel, message); } }消息消费者类(监听)
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.management.timer.TimerMBean; import java.io.Serializable; import java.sql.Time; /** * created by 魏霖涛 on 2017/9/6 0006 */ @Component("messageDelegateListener") public class MessageDelegateListener { @Autowired private IDistributeService distributeService; private Logger logger = LoggerFactory.getLogger("redis-comsumer for message"); //监听Redis消息 public void handleMessage(Serializable message){ //生产者存进队列的消息对象只要是Serializable类型,那么取出来的还是对象,不用做强转成对象操作 if(message instanceof TimeWheelBean){ TimeWheelBean timeWheelBean = (TimeWheelBean) message; logger.info("请求对象信息:"+timeWheelBean.toString()); //业务逻辑处理 ... } } }