Teknologian jakaminen

Simulaatio päällekkäisten lähetysten estämiseksi

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

mökin osoite (on noudettava itse)AopProxyn päällekkäiset lähetykset: Estä päällekkäiset lähetykset (gitee.com)

  1. @RestController
  2. public class SubmissionController {
  3. @Autowired
  4. private SubmissionService submissionService;
  5. private static Jedis jedis = new Jedis("localhost",6379);
  6. private String lock = "lock";
  7. private String lockValue = "locked";
  8. private int gqsj = 5;
  9. private String ok = "OK";
  10. @PostMapping("/submit")
  11. public void handleSubmitForm(@RequestParam String name, @RequestParam int age) {
  12. SubmissionService submissionServiceProxy = (SubmissionService) Proxy.newProxyInstance(submissionService.getClass().getClassLoader(), new Class[]{SubmissionService.class}, (proxy, method, args) -> {
  13. SetParams params = new SetParams();
  14. params.nx().ex(gqsj);
  15. String res = jedis.set(lock, lockValue,params);
  16. if (ok.equals(res)){
  17. Object invoke = method.invoke(submissionService,name,age);
  18. System.out.println("提交成功");
  19. return invoke;
  20. }else {
  21. System.out.println("不允许重复提交");
  22. return null;
  23. }
  24. });
  25. submissionServiceProxy.insert(name, age);
  26. // 存疑?第一天晚上return null后汇报一个空指针错误,奇怪的是第二天不报错了
  27. // 希望懂得大佬给小弟支个招
  28. // try{
  29. // submissionServiceProxy.insert(name, age);
  30. // }catch (NullPointerException e){
  31. // System.out.println("禁止重复提交");
  32. // }
  33. }
  34. }

Ajatuksena on käyttää välityspalvelinta menetelmän suorittamiseen, käyttää aop-ideaa sen leikkaamiseen ja lisätä hajautettu lukko ennen menetelmän suorittamista. Tässä hajautettu lukko on redis.nx, ja siihen lisätään vanhenemisaika lukkiutumisen estämiseksi. Kaiken kaikkiaan tein vain yksinkertaisen simulaation, ja kirjoittaminen on suhteellisen yksinkertaista.