BoundedQueueController.java 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package com.ruoyi.demo.controller.queue;
  2. import com.ruoyi.common.core.domain.R;
  3. import com.ruoyi.common.utils.redis.QueueUtils;
  4. import lombok.RequiredArgsConstructor;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. /**
  10. * 有界队列 演示案例
  11. * <p>
  12. * 轻量级队列 重量级数据量 请使用 MQ
  13. * <p>
  14. * 集群测试通过 同一个数据只会被消费一次 做好事务补偿
  15. * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条
  16. *
  17. * @author Lion Li
  18. * @version 3.6.0
  19. */
  20. @Slf4j
  21. @RequiredArgsConstructor
  22. @RestController
  23. @RequestMapping("/demo/queue/bounded")
  24. public class BoundedQueueController {
  25. /**
  26. * 添加队列数据
  27. *
  28. * @param queueName 队列名
  29. * @param capacity 容量
  30. */
  31. @GetMapping("/add")
  32. public R<Void> add(String queueName, int capacity) {
  33. // 用完了一定要销毁 否则会一直存在
  34. boolean b = QueueUtils.destroyQueue(queueName);
  35. log.info("通道: {} , 删除: {}", queueName, b);
  36. // 初始化设置一次即可
  37. if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) {
  38. log.info("通道: {} , 设置容量: {}", queueName, capacity);
  39. } else {
  40. log.info("通道: {} , 设置容量失败", queueName);
  41. return R.fail("操作失败");
  42. }
  43. for (int i = 0; i < 11; i++) {
  44. String data = "data-" + i;
  45. boolean flag = QueueUtils.addBoundedQueueObject(queueName, data);
  46. if (flag == false) {
  47. log.info("通道: {} , 发送数据: {} 失败, 通道已满", queueName, data);
  48. } else {
  49. log.info("通道: {} , 发送数据: {}", queueName, data);
  50. }
  51. }
  52. return R.ok("操作成功");
  53. }
  54. /**
  55. * 删除队列数据
  56. *
  57. * @param queueName 队列名
  58. */
  59. @GetMapping("/remove")
  60. public R<Void> remove(String queueName) {
  61. String data = "data-" + 5;
  62. if (QueueUtils.removeQueueObject(queueName, data)) {
  63. log.info("通道: {} , 删除数据: {}", queueName, data);
  64. } else {
  65. return R.fail("操作失败");
  66. }
  67. return R.ok("操作成功");
  68. }
  69. /**
  70. * 获取队列数据
  71. *
  72. * @param queueName 队列名
  73. */
  74. @GetMapping("/get")
  75. public R<Void> get(String queueName) {
  76. String data;
  77. do {
  78. data = QueueUtils.getQueueObject(queueName);
  79. log.info("通道: {} , 获取数据: {}", queueName, data);
  80. } while (data != null);
  81. return R.ok("操作成功");
  82. }
  83. }