JFinal使用Redis实现订阅发布

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);//处理业务
		}
	}
}

Jfinal官网Test类例子链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值