【发布时间】: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/…