接受消息不全,漏收消息

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

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

1回答
好帮手慕小蓝 2023-07-24 15:46:43

同学你好,仅从图片中无法确认问题的原因,建议同学提供一下完整的代码,老师需要测试一下才能确定问题所在。

祝学习愉快~

  • 提问者 慕数据3515280 #1
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置RabbitMQ地址
        factory.setHost("192.168.172.130");
        factory.setUsername("admin");
        factory.setPassword("password");
        //建立连接
        Connection connection = factory.newConnection();
        //获得信道
        Channel channel = connection.createChannel();
        //声明队列
        channel.queueDeclare(TAST_QUEUE_NAME, true, false, false, null);
        System.out.println("开始接受消息");
        channel.basicConsume(TAST_QUEUE_NAME, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try {
                    String message = new String(body, "UTF-8");
                    System.out.println("收到了消息:" + message);
                    doWork(message);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    System.out.println("消息处理完成");
                }
            }
        });
    
    
    }
    private static void doWork(String task) throws InterruptedException {
        char[] chars = task.toCharArray();
        for (char ch : chars){
            if(ch == '.'){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public class NewTask {
        private final static String TAST_QUEUE_NAME = "task_queue";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            //设置RabbitMQ地址
            factory.setHost("192.168.172.130");
            factory.setUsername("admin");
            factory.setPassword("password");
            //建立连接
            Connection connection = factory.newConnection();
            //获得信道
            Channel channel = connection.createChannel();
            //声明队列
            channel.queueDeclare(TAST_QUEUE_NAME, true, false, false, null);
            for (int i = 0; i < 10; i++) {
                String message = i + "...";
                channel.basicPublish("", TAST_QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
                System.out.println("发送消息:"+ message);
            }
            channel.close();
            connection.close();
        }
    }

    我试了单个worker的也会漏消息

    2023-07-24 16:01:03
  • 好帮手慕小蓝 回复 提问者 慕数据3515280 #2

    同学你好,建议同学在Worker类的代码14行和15行之间加入下面语句再尝试一下:

    channel.basicQos(1);

    祝学习愉快~

    2023-07-24 16:31:55
  • 提问者 慕数据3515280 回复 好帮手慕小蓝 #3

    不起作用啊,这是为什么

    2023-07-24 16:39:48
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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