jfinal已经集成了redis,但是现在还没有订阅发布相关的方法,所以就做了一个简单的实现
public class DemoConfig extends JFinalConfig {
public void configConstant(Constants me) {}
public void configRoute(Routes me) {}
public void configEngine(Engine me) {}
public void configPlugin(Plugins me) {
//jfinal已经集成了redis
RedisPlugin redisPlugin = new RedisPlugin(p.get("cacheName"), p.get("redis_host"),Integer.valueOf(p.get("redis_port")),Integer.valueOf(p.get("redis_timeout")));
//自己写插件
//RedisPlugin redisPlugin = MyRedisPlugin.config();
me.add(redisPlugin);
}
public void configInterceptor(Interceptors me) {}
public void configHandler(Handlers me) {}
@Override
public void onStart() {
//创建新的线程启动redis,进行阻塞式消费
RedisConsumer.init();
super.onStart();
}
}
自己实现RedisPlugin示例:
package com.flmall.web.redis;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.IPlugin;
import com.jfinal.plugin.redis.RedisPlugin;
public class MyRedisPlugin implements IPlugin{
private static String host = "127.0.0.1";
private static int port = 6379;
private static int timeout = 5;// 过期时间 单位 秒
private static String password;
private static int maxTotal = 600; // 设置最大实例总数
private static int maxIdle = 300; // 空闲数
private static int maxWait = 5; // 等待时间 单位 : 秒
private static String defualtCacheName = "xxx";//默认cacheName
static RedisPlugin redisPlugin ;
public static RedisPlugin config() {
try {
if (StrKit.notBlank(password) ){
redisPlugin= new RedisPlugin(defualtCacheName, host, port, timeout * 1000, password);
}else {
redisPlugin= new RedisPlugin(defualtCacheName, host, port, timeout * 1000);
}
redisPlugin.getJedisPoolConfig().setMaxTotal(maxTotal);
redisPlugin.getJedisPoolConfig().setMaxIdle(maxIdle);
redisPlugin.getJedisPoolConfig().setMaxWaitMillis(maxWait*1000);
return redisPlugin;
}catch (Exception e){
//todo
throw new RuntimeException("init RedisPlugin config exception ",e);
}
}
@Override
public boolean start() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean stop() {
// TODO Auto-generated method stub
return false;
}
}
Redis配置文件参数示例:
#redis
redis_host=127.0.0.1
redis_port=6379
redis_password=xxxxxx
cacheName=xxx
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis_maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制
redis_maxTotal=600
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。单位 秒
redis_maxWait=-1
#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
redis_testOnBorrow=true
#超时时间
redis_timeout=10000
发布消息示例:
//加入队列,处理数据
try {
Redis.use().lpush(RedisQueueKit.SYNC_DATA, id);
} catch (Exception e) {
logger.error("加入队列出现异常:", e);
}finally{
//必然处理的数据
}
消费消息示例:
package com.flmall.api.common.redis;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.flmall.api.common.kit.RedisQueueKit;
import com.flmall.api.service.system.OrderService;
import com.jfinal.aop.Aop;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.redis.Redis;
public class RedisConsumer {
private static final Logger logger = LoggerFactory.getLogger(RedisConsumer.class);
//创建新的线程消费消息
public static void init() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
//list中的值 [syncData, 1319462695329726464]
List<?> list = Redis.use().brpop(0, RedisQueueKit.SYNC_DATA);
if(list.size() > 0){
// 消费消息
consumeMessage(list.get(1).toString(),RedisQueueKit.SYNC_DATA);
}
} catch (Exception e) {
logger.error("消费事件异常(redis)", e);
}
}
}
});
thread.start();
}
public static void consumeMessage(String id,String key) {
if(StrKit.equals(key,RedisQueueKit.SYNC_DATA)){
//因为对象的创建还没有被jfinal 接管
Aop.get(OrderService.class).syncData(id);//处理业务
}
}
}