当前位置: 首页 > 知识库问答 >
问题:

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

程树
2023-03-14

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

然而,我也有同样的问题。我严格遵守Microsoft文档,但仍然存在相同的问题。

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

  1. 生成RootCA证书并将其应用于Java信任库
  2. 使用您的Windows登录用户/密码
  3. 使用amqps://[user]:[pwd]@FQDN/[命名空间]连接工厂字符串
  4. 使用[命名空间]/[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服务器上。我的客户端正在另一台Windows 2012服务器上运行。但我也将客户机移动到了服务器上,服务总线在那里运行,没有解决方案。(所以这不是位置问题)
  2. 当我将证书从信任库中取出时,我会得到一个适当的错误。当我把它插回去时,错误就消失了。(所以这不是证书问题)
  3. 当我故意拼错Windows用户名或密码时,会出现身份验证错误。否则错误就会消失。(因此这不是用户/pwd问题)
  4. 在连接字符串中显式键入端口号5671似乎无关紧要。无论哪种情况,连接创建都可以正常工作。(因此这不是连接问题)
  5. 在连接字符串或队列定义中定义名称空间似乎无关紧要。这两种情况都失败了
  6. 我已经下载了Qpid JMS客户端(0.22)的源代码,并逐步完成了调试器。目标(要连接的队列的地址)在创建连接时设置正确,但在离开同步块后立即重置为null,这会导致错误(对于MessageProducer)

我错过了Microsoft原始文档中的哪些内容(已由名为Sentinel的用户确认其有效)?

任何帮助都将不胜感激。谢谢-多根·阿泰

共有2个答案

齐嘉庆
2023-03-14

更新并回答。事实证明我们做的一切都是对的。(几乎)

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

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

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

amqp:未经授权的访问试图执行未经授权的操作

为什么会这样?当您在服务管理控制台中显示的连接字符串中使用您的用户名时,您应该使用完全限定的连接字符串。即username@domainname.com.您还需要对其进行URL编码)

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

凌远
2023-03-14

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

事实证明,问题是,如果我们使用Azure管理门户创建队列/主题,那么AMQP客户端无法正确连接,我们会不断得到“对等…”例外但是,如果我们使用Microsoft专有api以编程方式创建队列/主题,请参阅

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

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

虽然它不是Windows Server上的服务总线,而是Azure服务总线,但我希望解决方案可能是相同的。如果对你不起作用,请告诉我。

 类似资料:
  • 我正在使用新的Windows Server Service Bus 1.0测试版开始一个新项目的工作。我正在尝试在AWS EC2虚拟机上设置测试环境。 我已经在AWS EC2上运行的Windows Server 2008 R2实例上安装了服务总线,并根据MSDN文档中的示例设置了新的服务器场、容器和主机。我在服务器上打开了所有正确的端口(4443和9354)。我还按照[本页][1]中的说明将自行生

  • 我需要使用SAS令牌连接到Azure服务总线(生成并连接)。 我没有看到任何关于python实现的东西。 此链接提供Eventhubs的实现- https://docs.microsoft.com/en-us/rest/api/eventhub/generate-sas-token#python 不确定在哪里可以找到servicebus的python实现。

  • 另一个用户'sJohnston'问了一个与我的问题相关的问题: 在进行了您建议的更改后,我得到了以下错误: 连接到Azure服务总线:log4j:warn找不到记录器(com.microsoft.windowsazure.services.servicebus.ServiceBusContract)的追加器。log4j:警告请正确初始化log4j系统。log4j:警告有关详细信息,请参阅http:

  • 我有一个场景,每当Azure Service bus的队列/主题中有消息时,Azure ServiceBus就会将事件发送到事件网格。那么,我如何在Java/Spring中建立连接,使用事件网格接收事件,并使用服务总线提取消息。要在Java/Spring中建立与事件网格和Azure服务总线的连接,需要进行哪些配置?另外,在应用程序端(application.yml或properties文件)必须进

  • 我们使用下面的AMQP JAR将消息从java发送到windows server(1.1)上service bus中的队列设置。发送小消息时没有问题,但无法发送pre-prod中大小超过45kb、prod中大小超过160kb的消息。消息根本没有进入队列,java端也没有异常。 geronimo-jms\u 1.1\u spec-1.0.1。jar qpid-amqp-1-0-client-0.22

  • 我需要将一条消息从运行在SQL Server2014下的SSIS包放入Azure ServiceBus队列中。正如本文所建议的:从ssis连接到azure服务总线队列,我编写了一个引用“azure SDK2.9”的脚本任务。这种方法适用于Azure存储帐户处理Blob(引用Microsoft.WindowsAzure.Storage程序集),但不适用于Azure存储总线(引用Microsoft.S