2

我要问的问题以前在这里问过。David Ingham 背诵了这个 Microsoft Document给出了答案。Sentinel 已确认该解决方案有效。

然而,我有同样的问题。我按照微软的文档来信,但是,仍然有同样的问题。

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

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

上下文查找、连接创建、会话创建都可以正常工作。但是,当需要创建 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 Server 运行。但是我也将客户端移到了运行服务总线的服务器上,但没有解决方案。(所以这不是位置问题)
  2. 当我从信任库中取出证书时,我收到了一个适当的错误。当我把它插回去时,错误就消失了。(所以这不是证书问题)
  3. 当我故意拼错我的 Windows 用户名或密码时,我会收到身份验证错误。否则错误消失。(所以这不是用户/密码问题)
  4. 似乎我在连接字符串中显式键入端口号 5671 并不重要。在任何一种情况下,连接创建都可以正常工作。(所以这不是连接问题)
  5. 在连接字符串或队列定义中定义命名空间似乎无关紧要。在这两种情况下都失败了。
  6. 我已经下载了 Qpid-JMS-Client (0.22) 的源代码并单步调试。目标(要连接的队列的地址)在创建连接时设置正确,但在离开同步块后立即重置为 null,这会导致错误(在 MessageProducer 的情况下)

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

任何帮助将不胜感激。谢谢你,-Dogan Atay

4

2 回答 2

2

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

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

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

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

虽然它不是 Windows Server 上的服务总线,而是使用 Azure 服务总线,但我希望解决方案可能是相同的。让我知道它是否不适合你。

于 2014-06-13T12:52:06.953 回答
1

更新和回答。好吧,事实证明我们做的一切都是正确的。(几乎)

使用服务管理控制台创建服务总线时,我已将我的用户名添加为 Windows 用户。在客户端,我在连接字符串中使用了相同的用户名和密码。我会毫无问题地通过认证步骤。将创建连接。如果我将密码更改为错误的密码,我会收到身份验证错误。我当时确信安全不是这里的问题。

但是使用正确的用户名和密码,我仍然无法创建消费者或生产者。

然后,我启用了 Qpid JMS 包日志记录。日志显示

amqp:unauthorized-access 试图执行未经授权的操作

为什么会这样?事实证明(通过反复试验),当您在连接字符串中使用您的用户名时,您应该使用完全限定的用户名,因为它出现在服务管理控制台中。即用户名@域名.com。您还需要对其进行 URL 编码)

Aurvoir 在下面的答案中说,如果他们以编程方式创建队列,事情就会解决。我还没有尝试过这个解决方案。但是我可以看到如果您使用自己的凭据创建自己的队列并使用连接上的相同凭据将消息放入同一个队列中,它将如何工作。

于 2014-08-11T17:10:06.527 回答