java - 在rabbitmq中使用factory.setUri()连接到/vhost

标签 java rabbitmq amqp

我有连接代码:

ConnectionFactory factory = new ConnectionFactory();
factory.setUri(System.getenv("CLOUDAMQP_URL"));

但我收到错误:

23:16:24 web.1    | started with pid 3098
23:16:27 web.1    | Exception in thread "main" java.io.IOException
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106)
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102)
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:124)
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:378)
23:16:27 web.1    |     at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:621)
23:16:27 web.1    |     at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:648)
23:16:27 web.1    |     at Main.run(Main.java:212)
23:16:27 web.1    |     at Main.main(Main.java:239)
23:16:27 web.1    | Caused by: com.rabbitmq.client.ShutdownSignalException: connection error
23:16:27 web.1    |     at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67)
23:16:27 web.1    |     at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33)
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:361)
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:226)
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:118)
23:16:27 web.1    |     ... 5 more
23:16:27 web.1    | Caused by: java.net.SocketException: Connection reset
23:16:27 web.1    |     at java.net.SocketInputStream.read(SocketInputStream.java:196)
23:16:27 web.1    |     at java.net.SocketInputStream.read(SocketInputStream.java:122)
23:16:27 web.1    |     at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
23:16:27 web.1    |     at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
23:16:27 web.1    |     at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288)
23:16:27 web.1    |     at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:95)
23:16:27 web.1    |     at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:139)
23:16:27 web.1    |     at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:536)
23:16:27 web.1    |     at java.lang.Thread.run(Thread.java:745)
23:16:27 web.1    | exited with code 1
23:16:27 system   | sending SIGTERM to all processes

我的兔子日志显示连接被拒绝

=ERROR REPORT==== 21-Jul-2015::23:16:27 ===
closing AMQP connection <0.9858.0> (127.0.0.1:38856 -> 127.0.0.1:5672):
{handshake_error,opening,0,
                 {amqp_error,access_refused,
                             "access to vhost '' refused for user 'guest'",
                             'connection.open'}}

如何使用 setUri 连接到默认虚拟主机 (/)? last time这个问题被问到,提问者的解决方案是不使用setUri。 uri方式是什么?

令人烦恼的是,相同的 URI 也适用于鼠兔;这两个实现(python 和 java)解析 URI 的方式有区别吗?

编辑:我正在使用的网址是

CLOUDAMQP_URL=amqp://guest:guest@localhost:5672/

最佳答案

看起来这与 the source 中 URI 的解析方式存在差异。 。特别是,URI 在/s 上分割,然后进行 URL 解码;这意味着我的 URI (amqp://guest:guest@localhost:5672/) 返回虚拟主机的空字符串(而不是默认的/like python does). 我通过使用

factory.setUri(System.getenv("CLOUDAMQP_URL"));
factory.setVirtualHost("/");

覆盖推断的错误值,但这是一个糟糕的解决方案。另一个可行的解决方案是更改 URL:

CLOUDAMQP_URL=amqp://guest:guest@localhost:5672/%2F

注意 URL 编码/通过 %2F。我将向该库提出一个问题/PR,因为 python 解决方案似乎更直观。

编辑:我与库维护人员进行了交谈。他们指出,他们是权威的实现,而 pika 正在 the spec 之外做一些事情。 (见附录A)。不幸的是,stockrabbit 实现(虚拟主机为“/”)与 stock javarabbit mq 客户端对默认 URI 的解释不兼容,但事实确实如此。使用 %2F 修复。

关于java - 在rabbitmq中使用factory.setUri()连接到/vhost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553370/

相关文章:

java - 无法从android中的远程ubuntu tomcat服务器连接mysql数据库

java - 分析驻留在队列 RabbitMQ 中的消息

java - 微服务和消息传递 : Message Content

php - 使用 brew 在 mac 上安装 amqp

java - 无法使用基于 JMS 的代码和 amqp 1.0 访问 ActiveMQ

java - getCanonicalFile 和 getAbsoluteFile 返回当前(项目)目录,而不是预期的目录

java - 如何编写需要密码才能满足某些要求的单一方法?

java - RDD 数据迭代 Apache Spark

c# - RabbitMQ 异步支持

RabbitMQ:由交换确认的消息,没有任何现有的绑定(bind)