老师,为什么我明明代码没错误,但是接收一条后就不接收了?

老师,为什么我明明代码没错误,但是接收一条后就不接收了?

package workqueues;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 描述:  任务有所耗时,多个任务
 */
public class NewTask {
    //队列名字
    private final static String TASK_QUEUE_NAME="task_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置RabbitMQ地址
        factory.setHost("192.168.70.137");
        factory.setUsername("admin");
        factory.setPassword("password");
        //建立连接
        Connection connection = factory.newConnection();
        //获得信道
        Channel channel = connection.createChannel();
        //声明队列  需要四个参数
        //第一个参数-队列名称、第二个参数-队列是否持久,若服务器重启,队列是否要存在、
        //第三个参数-是不是独有,是不是队列只供此连接使用,第四个参数-需不需要自动删除,队列没使用的时候,第五个参数-参数
        channel.queueDeclare(TASK_QUEUE_NAME,true,false,false,null);
        //发布消息
        for (int i = 0; i < 10; i++) {
            String message;
            if(i%2==0){
                message = i + "...";
            }else{
                message = String.valueOf(i);
            }
            channel.basicPublish("", TASK_QUEUE_NAME, null, message.getBytes("UTF-8"));
            System.out.println("发送了消息:"+message);
        }
        //关闭连接
        channel.close();
        connection.close();
    }
}
package workqueues;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.Random;
import java.util.concurrent.TimeoutException;

/**
 * 描述:  消费者,接受前面的批量消息
 */

public class Worker {
    private final static String TASK_QUEUE_NAME="task_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置RabbitMQ地址
        factory.setHost("192.168.70.137");
        factory.setUsername("admin");
        factory.setPassword("password");
        //建立连接
        Connection connection = factory.newConnection();
        //获得信道
        Channel channel = connection.createChannel();
        //声明队列  需要四个参数
        //第一个参数-队列名称、第二个参数-队列是否持久,若服务器重启,队列是否要存在、
        //第三个参数-是不是独有,是不是队列只供此连接使用,第四个参数-需不需要自动删除,队列没使用的时候,第五个参数-参数
        channel.queueDeclare(TASK_QUEUE_NAME,true,false,false,null);
        System.out.println("开始接收消息");
        //希望处理的数量,在处理完毕前,不接收下一个任务
        channel.basicQos(1);//!!!
        //但必须告诉我你是否处理完毕了,把第二个autoAck参数改成false!!!!
        channel.basicConsume(TASK_QUEUE_NAME, false, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body,"UTF-8");
                System.out.println("收到了消息:"+message);
                try{
                    doWork(message);
                }finally {
                    System.out.println("消息处理完成");

                    //消息处理完成,要确认消息
                    channel.basicAck(envelope.getDeliveryTag(),false);//!!!
                }
            }
        });
    }

    private static void doWork(String task){
        char[] chars = task.toCharArray();
        for(char ch:chars){
            if(ch == '.'){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        }
    }
}

https://img1.sycdn.imooc.com//climg/64d466030955f5b706680317.jpg

https://img1.sycdn.imooc.com//climg/64d4660909d530bd06020256.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小尤 2023-08-10 13:57:36

同学你好,测试同学代码是没有问题的,如下所示:在接收时睡眠时间(sleep()),同学可以等待一下,然后查看是否有全部接收。

https://img1.sycdn.imooc.com//climg/64d47c14090f0b4104180276.jpg

https://img1.sycdn.imooc.com//climg/64d47c0c09d89fc305000318.jpg

祝学习愉快!

  • 提问者 会java泰酷辣 #1

    等了很久,没有更新,电脑重启,项目invalidate caches/restart过,都没反应

    2023-08-10 14:07:20
  • 提问者 会java泰酷辣 #2

    只接收一次,不知道前面消息发哪里去了

    https://img1.sycdn.imooc.com//climg/64d47ebc0959e03105700278.jpg

    2023-08-10 14:16:32
  • 提问者 会java泰酷辣 #3

    好奇怪,是为什么,卡在这里好久了,为什么只能接收一条,其他信息去哪里了啊


    2023-08-10 14:25:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师