使用Java和AMQP 1.0连接到Windows Server(1.1)上的Service Bus

时间:2014-05-30 21:14:46

标签: java amqp servicebus qpid

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

然而,我有同样的问题。我按照Microsoft文档的说法,但仍然有同样的问题。

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

  1. 生成RootCA证书并将其应用于Java信任库
  2. 使用Windows登录用户/密码
  3. 使用amqps:// [user]:[pwd] @ FQDN / [namespace]连接工厂字符串
  4. 使用[namespace] / [queuename]作为物理队列名称。
  5. 上下文查找,连接创建,会话创建都可以正常工作。但是,当创建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运行。但我也将客户端移动到运行Service Bus但没有解决方案的服务器上。 (所以这不是位置问题)
    2. 当我从证书库中取出证书时,我得到了一个适当的错误。当我插入它时,错误消失了。 (所以这不是证书问题)
    3. 当我故意拼错我的Windows用户名或密码时,我收到身份验证错误。否则错误就会消失。 (所以这不是用户/密码问题)
    4. 似乎我在连接字符串中明确键入端口号5671并不重要。无论哪种情况,连接创建都可以。 (所以这不是连接问题)
    5. 在连接字符串或队列定义中定义名称空间似乎并不重要。它在两种情况下都失败了。
    6. 我已经下载了Qpid-JMS-Client(0.22)的源代码并逐步完成了调试器。创建连接时正确设置目标(要连接的队列的地址),但在离开同步块后立即将其重置为null,这会导致错误(在MessageProducer的情况下)
    7. 我从原始Microsoft文档(由名为Sentinel的用户确认它有效)中错过了什么?

      非常感谢任何帮助。 谢谢, -Dogan Atay

2 个答案:

答案 0 :(得分:2)

我们得到了完全相同的错误,并执行了您提到的所有相似结果的步骤。然而,我们正在云中连接到Azure Service Bus。事实证明错误信息是非常误导的,在场景认证背后从未发生过。您可以通过提供不正确的密码进行验证,您仍然需要完成所有步骤,直到需要创建生产者或消费者,然后您才会看到您提到的异常。

事实证明问题是,如果我们使用Azure管理门户创建队列/主题,那么AMQP客户端无法正常连接,我们会继续获得&#34; Peer ....&#34;例外。但是,如果我们使用Microsoft Proprietary api&#39>以编程方式创建队列/主题,请参阅

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

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

虽然它不是Windows Server上的服务总线,但是使用Azure Service Bus,我希望分辨率可能相同。如果它不适合你,请告诉我。

答案 1 :(得分:1)

更新和答案。 事实证明我们做的一切都是正确的。(差不多)

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

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

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

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

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

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