ActiveMQ 与 AMQP .NET Lite 版本

ActiveMQ vs AMQP .NET Lite versions

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

AMQP .NET Lite,根据 line 411 in Connection, sends 0.1.0.0. At the same time it claims to do Full control of AMQP 1.0 protocol behavior

显然 ActiveMQ 拒绝来自 AMQP .NET Lite 与 "Connection attempt from non AMQP v1.0 client. 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。

从这里去哪里?

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

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

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

默认情况下,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 调用。