1. 程式人生 > >Rabbit基於Spring框架實現

Rabbit基於Spring框架實現

rabbit監聽介面層
package com.rabbit.test;

import com.rabbit.ActionInterface.RedisNoResultAction;
import com.rabbit.annotation.RedisLock;
import com.rabbit.util.RedisKeys;
import com.rabbit.util.RedisLockExecute;
import com.rabbit.util.RedisLockModel;
import com.rabbit.util.RedisTemplate;
import org.junit.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;

import java.util.concurrent.TimeUnit;

/**
 * 用於提供Rabbit監聽介面層
 * Created by Michael Zhao on 14-4-1.
 */
@Component
public class QueueOneListener{
    @Autowired
    private RedisTemplate redisTemplate;

    private static final Logger log = LoggerFactory.getLogger(QueueOneListener.class);

    @Before
    public void setUp(){
        //銷燬所有已經建立的鎖
        RedisLockExecute.destructionLocks(redisTemplate);
    }

    public void listenOne(Object foo) {
        System.out.println("listen1");
        System.out.println(foo);
    }

    public void listenTwo(Object foo) {
        System.out.println("listen2");
        System.out.println(foo);
    }

    public void listenThree(Object foo) {
        System.out.println("listen3");
        System.out.println(foo);
    }

    public void listenThree1(Object foo){
        System.out.println("listenThree->"+foo);
    }

    /**
     * 實現將資訊塞入到redis中
     * @param foo   物件資訊
     */
    public void sendRedis(final Object foo){
        //這個是針對分散式環境下的鎖機制
        RedisLockModel redisLockModel = RedisLockExecute.acquireLock(redisTemplate, RedisKeys.REDIS_TEST, 1000, (int) TimeUnit.SECONDS.toSeconds(10));

        try{
            if(RedisLockExecute.ACQUIRE_RESULT(redisLockModel)){
                redisTemplate.execute(new RedisNoResultAction() {
                    @Override
                    public void actionNoResult(Jedis jedis) {
                        jedis.lpush("sendRedis:" , foo.toString());
                    }
                });
            }else{
                log.debug("acquire lock is failed!");
            }
        } catch (Exception e){
            log.error("send Redis failed , error={}", e);
        }finally {
            //釋放鎖
            RedisLockExecute.releaseLock(redisTemplate, redisLockModel);
        }
    }

    @RedisLock(redisKeys = RedisKeys.REDIS_TEST , maxWait = 10, expiredTime = 1000)
    public void testRedisAnnotation(final Object foo){
        try{
            redisTemplate.execute(new RedisNoResultAction() {
                @Override
                public void actionNoResult(Jedis jedis) {
                    jedis.lpush("sendRedis:" , foo.toString());
                }
            });
        } catch (Exception e){
            log.error("send Redis failed , error={}", e);
        }
    }
}