【问题标题】:Avoid the use of while(true) in rabbitMQ?避免在rabbitMQ中使用while(true)?
【发布时间】:2015-04-09 01:26:45
【问题描述】:

我不认为在 servlet 中使用 while (true) 可能是一个好主意,所以我想知道是否应该使用带线程的 Servlet 或我有什么其他替代方案。

@Override
    public void doWork(Channel channel, QueueingConsumer queueingConsumer)
            throws Exception {
        while (true) {
            QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
            BasicProperties props = delivery.getProperties();
            BasicProperties replyProps = new BasicProperties.Builder().correlationId(props.getCorrelationId()).build();
            byte[] response = null;
            try {

                String message = ObjectCodec.deSerialize(delivery.getBody()).toString();

                response = process(message);
            } catch (Exception e) {
                LogUtils.logError("CMDBDeleteQueue process data fail.", e);
            } finally {
                channel.basicPublish("", props.getReplyTo(), replyProps,response);
                channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
            }
        }
    }

没有别的办法,不申请while(true)?谢谢。

【问题讨论】:

  • 你没有告诉我们你想要做什么,或者它在你的 servlet 中的什么位置,或者你为什么把它放在一个 servlet 中。
  • RabbitMQ 消费者不属于 servlet。 RabbitMQ 消费者消费消息并对其采取行动。 servlet 是一个请求处理器。如果您的应用程序设计良好,它们都不属于同一个类,甚至不属于同一个项目。
  • rabbitMQ prc.等待消息,使用实现。没有其他方法可以代替while(true)
  • 你的意思是 RPC。你在叫什么? servlet 和 RabbitMQ 消费者都可以是 RPC 请求服务器。你不应该两者都强硬。
  • 你应该实现 DefaultConsumer,请阅读:stackoverflow.com/questions/22840247/…

标签: java rabbitmq


【解决方案1】:

servlet 和 RabbitMQ 消费者都可以是 RPC 服务器。在伪代码中,

使用 RabbitMQ:

while isConsuming
    var message = wait message
    handler.handleAsync(message)

使用 Servlet:

void doGet()
    var message = request.getContent()
    handler.handleAsync(message)

带有 RabbitMQ 的 RPC 客户端:

var message = new()
publisher.send(message)

带有 Servlet 的 RPC 客户端:

var httpRequest = new()
httpRequest.setContent()
httpRequest.send()

【讨论】:

  • 好吧,我想你根本不明白整个事情是如何工作的,可能不是开发 rpc 服务器的好人。您不需要知道发送代码的样子。这是一个http请求。事情是当你开发一个 servlet 时,while (true) 循环是隐式的,由应用服务器给出。应用程序服务器(例如 Tomcat)将循环,侦听端口 80,等待解析 http 请求并通过管道传输到您的 servlet。
  • 是的。
    功能已实现。我的意思是没有其他方法可以替换 while (true)。优化代码。
  • 你缺乏想象力。有大约一千种方法可以消除该 while 循环。无论如何,如果您只想打补丁,只需将消费者放在专用线程上即可。
  • 呃。我是同步方式。需要返回数据。线程运行方法是 void 方法。
  • 那么显然你不知道你在做什么。您不会以同步方式运行消费者。
【解决方案2】:

鉴于您的表面知识,您应该认真考虑查看类似 spring-amqp 之类的东西,这将有助于消耗队列所需的必要资源和线程池管理,这实际上有点不重要,特别是如果您要进行 RPC。

http://projects.spring.io/spring-amqp/

【讨论】:

猜你喜欢
  • 2017-03-03
  • 1970-01-01
  • 2015-10-25
  • 2023-03-30
  • 1970-01-01
  • 2012-08-20
  • 2019-04-30
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多