RedisTemplate实现分布式锁

@Configuration
@ImportResource("classpath*:conf/spring/ServiceAPI.xml")
public class XpriceConfiguration {

    @Bean
    public QuoteService publishDeal(//
            @Value("${lockSeconds:20}") long lockSeconds, //
            RabbitProperties rabbitProperties, //
            RabbitTemplate rabbitTemplate, //
            ObjectMapper objectMapper, //
            RedisTemplate<String, String> redisTemplate//
    ) {
        return new QuoteService(redisTemplate, lockSeconds, rabbitProperties, rabbitTemplate, objectMapper);
    }

}

class QuoteService implements InitializingBean, DisposableBean {

    private final static Logger LOGGER = LoggerFactory.getLogger(RecvQuoteService.class);

    private boolean running = true;

    private boolean selfSend;

    private RabbitTemplate rabbitTemplate;

    private ObjectMapper objectMapper;

    private RabbitProperties rabbitProperties;

    private RedisTemplate<String, String> redisTemplate;

    private long lockSeconds;


    public QuoteService(RedisTemplate<String, String> redisTemplate, long lockSeconds,             RabbitProperties rabbitProperties, RabbitTemplate rabbitTemplate, ObjectMapper objectMapper) {
        this.rabbitTemplate = rabbitTemplate;
        this.objectMapper = objectMapper;
        this.rabbitProperties = rabbitProperties;
        this.redisTemplate = redisTemplate;
        this.lockSeconds = lockSeconds;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        rabbitTemplate.execute(new ChannelCallback<DeclareOk>() {
            @Override
            public DeclareOk doInRabbit(Channel channel) throws Exception {
                return channel.exchangeDeclare(RiskMqConstant.PRICE_EXCHANGE, ExchangeTypes.FANOUT, true, false, null);
            }
        });
        String lockKey = String.join("_", "a", rabbitProperties.getAddresses(),
                rabbitProperties.getVirtualHost());
        String threadName = "data_to_mq_sender_switch";
        new Thread(() -> {
            while (running) {
                try {
                    Thread.sleep(3 * 1000l);
                    String redisLockValue = redisTemplate.opsForValue().get(lockKey);
                    if (!pe5SourceTarget.equals(redisLockValue)) {
                        selfSend = false;
                    }
                    Boolean setIfAbsent = redisTemplate.opsForValue().setIfAbsent(lockKey, pe5SourceTarget, lockSeconds,
                            TimeUnit.SECONDS);
                    if (setIfAbsent != null && setIfAbsent) {
                        // 获取到锁
                        selfSend = setIfAbsent;
                        LOGGER.info("lockKey:{},lockValue:{}", lockKey, pe5SourceTarget);
                    }
 
                }
                catch (Exception e) {
                    LOGGER.error(e.getMessage(), e);
                }
            }
            LOGGER.info("{} stoped", threadName);
        }, threadName).start();
    }

    @Override
    public void destroy() throws Exception {
        running = false;
    }

    public void publish(List<Publish> publishList) {
        if (!selfSend) {
            return;
        }
        try {
            //处理逻辑
        }
        catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值