我在写一个同步任务,为了防止并发问题,我想使用分布式锁。但发现无法启作用

Blade 未结 1 1466
菲哥
菲哥 剑圣 2022-05-09 17:41

一、该问题的重现步骤是什么?

1. 我写了一个sync_api,在其中的一个同步方法上加了

@RedisLock(value="lock:kxk:sync:size")

2. 然后在一个kxk_proxy模块中,调用了sync_api里的同步方法,我在kxk_proxy的单元测试中,写了2个线程去测试。

@Test
public void testSyncForMutilThreadCase() {
   ProxyApiConfigEntity proxy_api_config = new ProxyApiConfigEntity();
   proxy_api_config.setId(1403244004836925441L);
   ProxyApiConfigEntity queryApiConfig = proxyApiConfigService.getOne(Condition.getQueryWrapper(proxy_api_config));;
   System.out.println("queryApi:[" + queryApiConfig.toString());

   try {
      //多线程执行
      TestThread t1 = new TestThread(queryApiConfig,kxkSyncService);
      TestThread t2 = new TestThread(queryApiConfig,new DefaultKxkSyncServiceImpl());
      t1.start();
      t2.start();

      //单元测试等待异步,临时加的
      Thread.sleep(600000);

   }catch (Exception ex) {
      ex.getMessage();
   }
}

3. 

在kxkSyncService里调用启动同步的方法。该方法内部有一个前置同步方法,该前置同步方法上就有

@RedisLock(value="lock:kxk:sync:size")注解,e.g.





/**
* 开始进行尺码同步 (这里用到了分布式锁,注意!!!)
* @param config 第三方配置
* @param snycIntervalMin  同步时缓存失效的间隔时间(分钟)
* @param sizeNotify  外部可以执行api操作的回调对象
* @return
*/
@RedisLock(value="lock:kxk:sync:size")
public Object startSync(ProxyApiConfigEntity config, Long snycIntervalMin,IKxkSyncSizeCallBackNotify sizeNotify,String currThreadInfo)  throws InterruptedException {

  currThreadDesc = currThreadInfo;

  /**从pms-api获取尺码组的当前字典值**/
  List<KxkProductAttributeValueDicEntity> sizeGroupLst = getSizeInfoLst(config,snycIntervalMin);
  if (sizeGroupLst == null ) {
     System.out.println("任务kxkAsyncJobForSize.getSizeInfoLst的获取看新款的尺码组任务失败!");
     return -1;
  }
  。。。
 

4.

可是,我在这个方法中设置断点,当线程运行到这里,我去redis里观察,并没发发现出现lock:kxk:sync:size的键值。我在kxk_proxy中已经配置
分布式锁打开了。为何没有作用?


lock.png

二、你期待的结果是什么?实际看到的又是什么?


三、你正在使用的是什么产品,什么版本?在什么操作系统上?


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

1条回答
  • 2022-05-09 17:51

    开关配置,我尝试在kxk_proxy的dev上配置了,也尝试在nacos上配置了,似乎都没作用。

    lockconfig.png


    另外,我也想向翼总请教下,碰见这种应用框架的自定义注解的情况,如果碰见异常和想调试底层逻辑,该怎么进行呢。。。


    后来,我发现单元测试,走的是test的yml,我也改了下。

    testconfig.png


    我还试了下,用代码加分布式锁,结果发现

    redisLockClient

    自动注入始终为空。

    codelock.png

    autto.png

    //===================================

    我后来仔细排查,发现单元测试跑的时候,分布式的日志开关是在blade-test.yaml的nacos配置的,改了下,发现配置开关打开了。但是,运行还有报错。

    error1.png

    =============================

    继续调试,发现在分布式锁注解的方法里,设置断点,然后去观察redis,已经出现了键值。似乎已经生效。但是这里的红字报错是什么呢,我查了下,说是Feign的min-request-size太小,我在blade-test下改了改。好像还是有错误

    ok01.png

    ok-config.png

    5 讨论(0)
提交回复