java - 使用 Java 和 AMQP 1.0 连接到 Windows Server (1.1) 上的服务总线

标签 java amqp servicebus qpid

我要问的问题已经被问过here前。 David Ingham 背诵 this Microsoft Document 给出了答案。 。 Sentinel 已确认该解决方案有效。

但是,我也有同样的问题。我严格按照微软文档进行操作,但是仍然遇到同样的问题。

存在冗余风险,问题是当使用 Qpid-JMS 客户端库(版本 0.22 或 0.26)连接到 Windows Server 上的服务总线 (1.1) (不是 Azure)并遵循 Microsoft 的所有指示,其中包括

  1. 生成 RootCA 证书并将其应用到 Java 信任库
  2. 使用您的 Windows 登录用户/密码
  3. 使用 amqps://[user]:[pwd]@FQDN/[namespace] 连接工厂字符串
  4. 使用 [namespace]/[queuename] 作为物理队列名称。

上下文查找、连接创建、 session 创建都工作正常。但是当创建 MessageProducer 或 MessageConsumer 时,我收到错误。

对于 MessageProducer 创建(无论是队列还是主题)我总是得到

Caused by: org.apache.qpid.amqp_1_0.client.Sender$SenderCreationException:
Peer did not create remote endpoint for link, target: testns/testq1
at org.apache.qpid.amqp_1_0.client.Sender.<init>(Sender.java:171)

对于 MessageConsumer 创建,我得到

javax.jms.JMSException
at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.createClientReceiver(MessageConsumerImpl.java:164)
at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.<init>(MessageConsumerImpl.java:120)

以下是我尝试过的几件事。

  1. 我的服务总线安装在 Windows 2012 Server 上。我的客户端正在从另一个 Windows 2012 服务器运行。但我也已将客户端移至运行 Service Bus 的服务器,但没有任何解决方案。 (所以这不是位置问题)
  2. 当我从信任库中取出证书时,我收到了相应的错误。当我将其插回时,错误消失了。 (所以这不是证书问题)
  3. 当我故意拼错 Windows 用户名或密码时,我会收到身份验证错误。否则错误就会消失。 (所以这不是用户/密码问题)
  4. 看来我在连接字符串中显式输入端口号 5671 并不重要。在任何一种情况下,连接创建都可以正常工作。 (所以这不是连接问题)
  5. 在连接字符串或队列定义中定义命名空间似乎并不重要。这两种情况都会失败。
  6. 我已经下载了 Qpid-JMS-Client (0.22) 的源代码并单步执行了调试器。创建连接时目标(要连接的队列的地址)设置正确,但在离开同步块(synchronized block)后立即重置为 null,这会导致错误(对于 MessageProducer)

我从原始 Microsoft 文档中遗漏了什么(该文档已由名为 Sentinel 的用户确认它有效)?

任何帮助将不胜感激。 谢谢你, -多安泰伊

最佳答案

我们遇到了完全相同的错误,并执行了您提到的所有步骤,结果相似。然而,我们正在连接到云中的 Azure 服务总线。事实证明,错误消息非常具有误导性,幕后身份验证从未发生过。您可以通过提供不正确的密码进行验证,并且您仍然会执行所有步骤,直到需要创建生产者或消费者,然后您将看到您提到的异常。

事实证明,问题是,如果我们使用 Azure 管理门户创建队列/主题,则 AMQP 客户端无法正确连接,我们会不断收到“Peer....”异常。但是,如果我们使用 Microsoft 专有 API 以编程方式创建队列/主题,请参阅

http://azure.microsoft.com/en-us/documentation/articles/service-bus-java-how-to-use-queues/

然后 AMQP 客户端就能够正确连接并发送/接收消息。

虽然它不是 Windows Server 上的服务总线,而是 Azure 服务总线,但我预计解决方案可能是相同的。如果它不适合您,请告诉我。

关于java - 使用 Java 和 AMQP 1.0 连接到 Windows Server (1.1) 上的服务总线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23963525/

相关文章:

java - 安排常规任务而不扩展TimerTask?

python - 流分析通过事件中心从 Python 反序列化 JSON

c# - Azure 托管服务总线 : "The X.509 certificate CN=servicebus.windows.net is not in the trusted people store."

node.js - RabbitMQ 与重新连接

java - JMS 连接到没有任何特定库的队列

azure - 不循环地从队列接收多条消息

c# - 使用 ServiceBus SubscriptionClient 时出现 RenewLock 错误

java - O(N!*N) 是一个可接受的大复杂度类,还是我删除常量并只说 O(N!) ?

java - 用Java将图像数据保存在 "PNG"文件中

java - 将文件编码为 base64 时内存不足