【问题标题】:Returning the value from the loop从循环中返回值
【发布时间】:2010-09-21 06:10:05
【问题描述】:

我正在使用 rabbitMQ 进行 POC,并编写一个程序来添加两个数字并获得响应。
我们为从队列中检索值而编写的代码正在无限运行(在 while 循环中),并且一行(在 while 循环中)等待从队列中检索一些数据;直到它从队列中得到一些东西,它才会进入下一轮的 while 循环。
意味着我们在无限循环中获取值。 我想将此值用于下一次处理。


而(真) { QueueingConsumer.Delivery交付1; 尝试 { 交付 = 消费者.nextDelivery(); //上面的行等到delivery得到一些值 String result1 = new String(delivery1.getBody()); System.out.println("收到的结果-"+ result1); } 捕捉(InterruptedException 即) { 继续; } } // 结束而

问题是我无法从 while 循环返回值(我想无限运行它)。
我该怎么做才能让循环继续下去,我也会得到循环外的处理数据?

【问题讨论】:

    标签: java rabbitmq


    【解决方案1】:

    如果“处理结果”是一个快速完成的操作,那么只需内联执行,例如通过调用执行实际处理的单独函数:

    void mainLoop()
    {
        while (true)
        {                 
            QueueingConsumer.Delivery delivery1;
            try
            {
                delivery = consumer.nextDelivery();
                //The above line waits until delivery get some value
                String result1 = new String(delivery1.getBody());
                System.out.println("Result received-"+ result1);
                processResult(result1);
            }
            catch (InterruptedException ie)
            {
                continue;
            }
        } // end while
    }
    
    void processResult(String result)
    {
        // Do whatever needs to be done with 'result'
    }
    

    如果您需要与循环同时进行处理,那么您将需要使用多个线程,并且问题会变得更加复杂。

    【讨论】:

      【解决方案2】:

      你到底是什么意思?

      如果您想留在同一个线程中,只需调用一个函数(处理收到的一条消息,然后阅读下一条消息)。

      如果您需要并发(始终读取,无论您是否重新处理消息),请使用生产者/消费者模式。 创建一个线程,

      • 从 mq 读取
      • 发布到(线程安全)集合中
      • 发出的信号
      • 返回从 mq 读取

      至少创建一个 mor 线程

      • 等待信号
      • 从(线程安全的)集合中读取(并删除)消息
      • 处理消息
      • 回去等待信号

      马里奥

      【讨论】:

        【解决方案3】:

        让您的返回值更具可见性。 因此,您将获得它的价值

        【讨论】:

          【解决方案4】:

          听起来您指的是允许您的函数返回多个值的 yield 功能。据我所知,Java 不支持开箱即用,但有一些projects 可用,可以实现此功能。

          【讨论】:

            猜你喜欢
            • 2015-11-09
            • 2016-07-20
            • 1970-01-01
            • 2011-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多