RabbitMQ Java API:我想使用 basicGet() 进行 RPC 调用。可以做屏蔽吗?可以中断吗?

俏皮话

我是 RabbitMQ 的新手,并且开始了一个以相当老式的“RPC”模式使用 RabbitMQ 的项目。所以我在“服务器”端尝试这样的事情:

ConnectionFactory factory = new ConnectionFactory();
factory.setUri(uri);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(queueName, false, false, false, null);
while (!shutdown) {
   GetResponse gr = channel.basicGet(queueName, true);
   ... build reply ...
   channel.basicPublish("", gr.getProps().getReplyTo(), replyProps, response);
}

我的问题是:在 basicGet() 上等待的线程可以被中断吗?如果是这样,会发生什么(未声明 InterruptedException)。它意识到这不是一个很好的模式,但我只是想要一些方法来干净地关闭服务。

更新:一条评论表明 basicGet() 根本不会阻塞,如果队列为空,则立即返回。如果是这种情况,让我更精确地修改我的问题:如何在超时的情况下等待队列中的消息并检索它?

UPDATE2:在rabbitmq邮件列表上进行试验和提问后,我得出结论,这不能直接完成。这根本不是你在 RabbitMQ 中做事的方式。相反,您使用 Channel.basicConsume() 启动消费者线程池并等待您的处理程序方法被调用。它可以通过让您的消费者发布到 SynchronizedQueue 或类似的东西并让您的前台线程等待它来间接完成,但请注意,这会破坏 basicConsume() 提供的自动缩放,并且也使其更难正确确认所有请求,并且还会创建额外的消息缓冲,这使得难以遵守由 basicQos() 调用设置的 QOS 语义。

还应该注意的是,一旦你沿着 basicConsume() 路线走下去,消费者可能会被中断。这是这样做的:

// This starts a background thread pool
String consumerTag = channel.basicConsume(consumer);
...
// Shutdown the consumer thread pool
channel.basicCancel(consumerTag);

UPDATE3:见最后一个答案。RabbitMQ 附带了一个运行良好的 RpcClient 类。

Arnaud Cogoluègnes

basicGet不会阻塞,它会立即返回(好吧,就在网络往返之后),如果队列中没有消息,则返回 null。所以没有必要中断线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

RabbitMQ basicGet

来自分类Dev

是否可以使用WAMP进行流式RPC调用?

来自分类Dev

我可以使用 Elastic Search Java API 按多个字段进行搜索吗?

来自分类Dev

我可以在Clojure中部分进行Java方法调用吗?

来自分类Dev

我可以在Clojure中部分进行Java方法调用吗?

来自分类Dev

RabbitMQ中不同线程中的basicGet和basicAck

来自分类Dev

Java:您可以使用变量进行转换吗?

来自分类Dev

Java:您可以使用变量进行转换吗?

来自分类Dev

我需要Rabbitmq绑定进行直接交换吗?

来自分类Dev

使用C#进行JSON-RPC HTTP调用

来自分类Dev

使用C#进行JSON-RPC HTTP调用

来自分类Dev

我可以使用方法在Java中进行类强制转换吗?

来自分类Dev

我可以在Java程序中使用Google+帐户进行身份识别吗?

来自分类Dev

我可以使用Java对instagram关注者/以下Windows进行向下滚动操作吗?

来自分类Dev

我可以在Java程序中使用Google+帐户进行身份识别吗?

来自分类Dev

我可以同时在Java文件和xml中使用带有注释的SI进行配置吗?

来自分类Dev

可以使用Piqi RPC服务OCaml功能吗?

来自分类Dev

使用Gorilla RPC进行批处理JSON-RPC

来自分类Dev

RabbitMQ RPC以异步方式?

来自分类Dev

如何从Clojure进行json-rpc调用?

来自分类Dev

如何从Clojure进行json-rpc调用?

来自分类Dev

我可以对嵌入式设备进行普通的Java编程吗?

来自分类Dev

我可以像在Java中那样在c ++中进行类型转换/促销吗?

来自分类Dev

Java GAE:我可以通过比较实体的属性进行过滤吗?

来自分类Dev

使用RabbitMQ RPC和ServiceStack时如何通知响应消息

来自分类Dev

如何使用ServiceStack RabbitMQ RPC从异常中恢复

来自分类Dev

我可以使用JavaScript从客户端进行eBay API调用吗,还是违反了同源政策?

来自分类Dev

我可以在node.js中指定RabbitMQ凭证吗?

来自分类Dev

我可以让RabbitMQ对任务有唯一的约束吗?

Related 相关文章

  1. 1

    RabbitMQ basicGet

  2. 2

    是否可以使用WAMP进行流式RPC调用?

  3. 3

    我可以使用 Elastic Search Java API 按多个字段进行搜索吗?

  4. 4

    我可以在Clojure中部分进行Java方法调用吗?

  5. 5

    我可以在Clojure中部分进行Java方法调用吗?

  6. 6

    RabbitMQ中不同线程中的basicGet和basicAck

  7. 7

    Java:您可以使用变量进行转换吗?

  8. 8

    Java:您可以使用变量进行转换吗?

  9. 9

    我需要Rabbitmq绑定进行直接交换吗?

  10. 10

    使用C#进行JSON-RPC HTTP调用

  11. 11

    使用C#进行JSON-RPC HTTP调用

  12. 12

    我可以使用方法在Java中进行类强制转换吗?

  13. 13

    我可以在Java程序中使用Google+帐户进行身份识别吗?

  14. 14

    我可以使用Java对instagram关注者/以下Windows进行向下滚动操作吗?

  15. 15

    我可以在Java程序中使用Google+帐户进行身份识别吗?

  16. 16

    我可以同时在Java文件和xml中使用带有注释的SI进行配置吗?

  17. 17

    可以使用Piqi RPC服务OCaml功能吗?

  18. 18

    使用Gorilla RPC进行批处理JSON-RPC

  19. 19

    RabbitMQ RPC以异步方式?

  20. 20

    如何从Clojure进行json-rpc调用?

  21. 21

    如何从Clojure进行json-rpc调用?

  22. 22

    我可以对嵌入式设备进行普通的Java编程吗?

  23. 23

    我可以像在Java中那样在c ++中进行类型转换/促销吗?

  24. 24

    Java GAE:我可以通过比较实体的属性进行过滤吗?

  25. 25

    使用RabbitMQ RPC和ServiceStack时如何通知响应消息

  26. 26

    如何使用ServiceStack RabbitMQ RPC从异常中恢复

  27. 27

    我可以使用JavaScript从客户端进行eBay API调用吗,还是违反了同源政策?

  28. 28

    我可以在node.js中指定RabbitMQ凭证吗?

  29. 29

    我可以让RabbitMQ对任务有唯一的约束吗?

热门标签

归档