@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);
}
}
}
RedisTemplate实现分布式锁
最新推荐文章于 2024-07-23 10:13:59 发布