【问题标题】:ActiveMQ vs AMQP .NET Lite versionsActiveMQ 与 AMQP .NET Lite 版本
【发布时间】:2017-08-19 16:03:51
【问题描述】:

根据line 151 in AmqpWireFormat,ActiveMQ 拒绝与 1.0.0 以外的 AMQP 协议版本的连接。

根据line 411 in Connection,AMQP .NET Lite 发送 0.1.0.0。同时它声称做Full control of AMQP 1.0 protocol behavior

显然 ActiveMQ 拒绝来自 AMQP .NET Lite 的连接,并显示“来自非 AMQP v1.0 客户端的连接尝试。AMQP,0,1,0,0”。

客户这样做:

Address address = new Address("amqp://localhost:5672");
Connection connection = new Connection(address);
Session session = new Session(connection);

和 ActiveMQ 日志:

2017-03-28 09:11:28,403 | DEBUG | Transport Connection to: tcp://0:0:0:0:0:0:0:1:54352 failed: org.apache.activemq.transport.amqp.AmqpProtocolException: Connection from client using unsupported AMQP attempted | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///0:0:0:0:0:0:0:1:54352@5672
org.apache.activemq.transport.amqp.AmqpProtocolException: Connection from client using unsupported AMQP attempted
        at org.apache.activemq.transport.amqp.protocol.AmqpConnection.onAMQPData(AmqpConnection.java:339)[activemq-amqp-5.14.4.jar:5.14.4]
        at org.apache.activemq.transport.amqp.AmqpProtocolDiscriminator.onAMQPData(AmqpProtocolDiscriminator.java:96)[activemq-amqp-5.14.4.jar:5.14.4]
        at org.apache.activemq.transport.amqp.AmqpTransportFilter.onCommand(AmqpTransportFilter.java:107)[activemq-amqp-5.14.4.jar:5.14.4]
        at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)[activemq-client-5.14.4.jar:5.14.4]
        at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233)[activemq-client-5.14.4.jar:5.14.4]
        at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)[activemq-client-5.14.4.jar:5.14.4]
        at java.lang.Thread.run(Thread.java:745)[:1.8.0_112]

在命令行上写着:

 WARN | Connection attempt from non AMQP v1.0 client. AMQP,0,1,0,0

ActiveMQ 然后中止连接。

ActiveMQ 配置包括:

<transportConnectors>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672" />
</transportConnectors>

这一切在我看来就像 ActiveMQ 需要 1.0.0.0 版本,而 amqpnetlite 发送 0.1.0.0。

从这里到哪里?

【问题讨论】:

  • 人们一直在使用 .NET lite 客户端来对抗 ActiveMQ,您需要提供更多信息,因为代码在我看来都是正确的
  • 在问题中添加了一些信息...谢谢。

标签: activemq amqp


【解决方案1】:

默认情况下,ActiveMQ 需要身份验证。试试

string queueName = "q1";
Connection connection = new Connection(new Address("amqp://user:pwd@localhost:5672"));
Session session = new Session(connection);
SenderLink sender = new SenderLink(session, "sender", queueName);
Message message = new Message("Hello World");
sender.Send(message);
connection.Close();

用户名和密码应该在 users.properties 配置文件中。另外建议使用异步 API 以避免阻塞 I/O 调用。

【讨论】:

  • 是的,就是这样。如果 ActiveMQ 记录了问题所在,将会有所帮助。该方法在三种情况下返回 false(错误),并且不提供记录问题所在的方法。
【解决方案2】:

我的假设是,您没有关闭代理强制要求客户端通过 SASL 握手进行连接,无论是通过 SASL 匿名还是 SASL 普通,这取决于您是否配置了真正的身份验证插件。我敢打赌,如果您通过添加选项 wireFormat.allowNonSaslConnections=true 来配置代理,它可能会起作用。

根据您提供的信息,.NET 客户端未使用 SASL,因此代理拒绝了它。 SASL 标头将是“AMQP3100”

【讨论】:

【解决方案3】:

ActiveMQ 和 AMQP .NET Lite 都支持 ISO/IEC 标准 1.0 版本的 AMQP。协议头“AMQP0100”表示协议的版本 1.0。众所周知,AMQP .NET Lite 可以与 ActiveMQ 一起使用,所以我怀疑您还有其他一些配置问题。

【讨论】:

  • 谢谢,我已经在问题中添加了一些信息......在我看来,ActiveMQ 需要 1.0.0.0 版本,而 amqpnetlite 发送 0.1.0.0。我想知道我错过了什么?
猜你喜欢
  • 1970-01-01
  • 2014-07-20
  • 2016-04-01
  • 2014-07-24
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多