当前位置:   article > 正文

Rabbitmq消息顺序的问题以及解决方案_rabbitmq顺序消息

rabbitmq顺序消息

1.1消息顺序的场景

场景1:一个queue,多个consumer

一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。,

人话就是:我确实保证了消息是按按顺序接的。但是由于每一个消息执行的是时间不一样。如果我前面的执行消息比较长,会导致我后面的操作比前面的操作更早执行。就出现了顺序错误

 consumer多线程消费

一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。

人话:就是线程的执行是强制式的,你永远不知道下一个执行的会是哪个指令。

2.解决方案:

单消费者、单线程消费就行。

如果你非要多线程,你可以参考下,多线程输出a,b,c

 

  1. /**
  2. * @author XDarker
  3. * 2018-5-17
  4. */
  5. public class Main {
  6. public static void main(String[] args) throws InterruptedException {
  7. int num = 1;//当前正在执行线程的标记
  8. ABCPrint print = new ABCPrint(num);
  9. Thread threadA = new Thread(new RunnableA(print));
  10. Thread threadB = new Thread(new RunnableB(print));
  11. Thread threadC = new Thread(new RunnableC(print));
  12. threadA.start();
  13. Thread.sleep(500);
  14. threadB.start();
  15. Thread.sleep(500);
  16. threadC.start();
  17. }
  18. }
  19. class RunnableA implements Runnable{
  20. private ABCPrint print;
  21. public RunnableA(ABCPrint print) {
  22. super();
  23. this.print = print;
  24. }
  25. @Override
  26. public void run() {
  27. print.PrintA();
  28. }
  29. }
  30. class RunnableB implements Runnable{
  31. private ABCPrint print;
  32. public RunnableB(ABCPrint print) {
  33. super();
  34. this.print = print;
  35. }
  36. @Override
  37. public void run() {
  38. print.PrintB();
  39. }
  40. }
  41. class RunnableC implements Runnable{
  42. private ABCPrint print;
  43. public RunnableC(ABCPrint print) {
  44. super();
  45. this.print = print;
  46. }
  47. @Override
  48. public void run() {
  49. print.PrintC();
  50. }
  51. }
  52. class ABCPrint {
  53. private int num;//当前正在执行线程的标记
  54. public ABCPrint(int num) {
  55. super();
  56. this.num = num;
  57. }
  58. public void PrintA(){
  59. for (int j = 0; j < 2; j++)//表示 循环打印2
  60. synchronized(this){
  61. while(num != 1){
  62. try {
  63. this.wait();
  64. } catch (InterruptedException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. for (int i = 0; i < 3; i++) {//表示 打印3
  69. System.out.println("A");
  70. }
  71. //打印A线程执行完 ,通知打印B线程
  72. num = 2;
  73. this.notifyAll();
  74. }
  75. }
  76. public void PrintB(){
  77. for (int j = 0; j < 2; j++)//表示 循环打印2
  78. synchronized(this){
  79. while(num != 2){
  80. try {
  81. this.wait();
  82. } catch (InterruptedException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. for (int i = 0; i < 2; i++) {//表示 打印2
  87. System.out.println("B");
  88. }
  89. //打印B线程执行完 ,通知打印C线程
  90. num = 3;
  91. this.notifyAll();
  92. }
  93. }
  94. public void PrintC(){
  95. for (int j = 0; j < 2; j++)//表示 循环打印2
  96. synchronized(this){
  97. while(num != 3){
  98. try {
  99. this.wait();
  100. } catch (InterruptedException e) {
  101. e.printStackTrace();
  102. }
  103. }
  104. System.out.println("C");
  105. //打印C线程执行完 ,通知打印A线程
  106. num = 1;
  107. this.notifyAll();
  108. }
  109. }
  110. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/758952
推荐阅读
相关标签
  

闽ICP备14008679号