上面一篇作者讲解了简单时间轮的概念和应用,不懂可以参考:简单时间轮
简单时间轮可以对多个任务进行周期性的执行,可以定制化周期进行任务执行。
本篇内容讲解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());
//业务逻辑处理
...
}
}
}