【问题标题】:javax.jms.JMSException: Cannot send to a non-connected transportjavax.jms.JMSException:无法发送到未连接的传输
【发布时间】:2017-07-06 08:01:25
【问题描述】:

我正在使用qpid-jms-client.jar 库与代理建立连接。

我的代码是 ::

Properties properties = new Properties();
properties.load(this.getClass().getResourceAsStream("jndi.properties"));
Context context = new InitialContext(properties);

System.setProperty("javax.net.ssl.trustStore", "C:/Users/xxxxx/qpid.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "test123");

ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup");
Destination queue = (Destination) context.lookup("myQueueLookup");
Connection connection = factory.createConnection("<my-username>", "<my-password>");
connection.setExceptionListener(new MyExceptionListener());
connection.start();

我的 jndi.properties 文件是 ::

java.naming.factory.initial=org.apache.qpid.jms.jndi.JmsInitialContextFactory
connectionfactory.myFactoryLookup=amqps://esesslx0100.se:9443
queue.myQueueLookup=emft_input
topic.myTopicLookup=topic
destination.topicExchange=amq.topic
jms.user=test

现在上面的代码给了我错误::

Connection ExceptionListener fired, exiting.
javax.jms.JMSException: Cannot send to a non-connected transport.
    at org.apache.qpid.jms.exceptions.JmsExceptionSupport.create(JmsExceptionSupport.java:66)
    at org.apache.qpid.jms.exceptions.JmsExceptionSupport.create(JmsExceptionSupport.java:88)
    at org.apache.qpid.jms.JmsConnection.onAsyncException(JmsConnection.java:1188)
    at org.apache.qpid.jms.JmsConnection.onConnectionFailure(JmsConnection.java:1104)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.fireProviderException(AmqpProvider.java:847)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.pumpToProtonTransport(AmqpProvider.java:820)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.access$300(AmqpProvider.java:90)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider$16.run(AmqpProvider.java:683)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Cannot send to a non-connected transport.
    at org.apache.qpid.jms.transports.netty.NettyTcpTransport.checkConnected(NettyTcpTransport.java:279)
    at org.apache.qpid.jms.transports.netty.NettyTcpTransport.allocateSendBuffer(NettyTcpTransport.java:176)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.pumpToProtonTransport(AmqpProvider.java:806)
    ... 9 more

由于代理配置了 SaSL,因此我还提供了我的用户名和密码。我目前不知道为什么会发生此错误。我在互联网上环顾四周,但没有明确解释为什么 qpid 会发生这种情况。任何想法为什么会发生此错误?

我的 trustStore 文件是正确的,因为我已经使用它验证了 SSL 连接。

【问题讨论】:

    标签: java jms qpid


    【解决方案1】:

    打开客户端日志记录可能会提供更多跟踪/调试信息。 “常规日志记录”和“协议跟踪日志记录”(如果它甚至达到那么远)都可能有用。详情请见http://qpid.apache.org/releases/qpid-jms-0.22.0/docs/index.html#logging

    对于这里的问题,似乎 TCP 连接被切断了,服务器日志也可能有助于说明原因。

    您在这里没有提到您使用的是哪个服务器,但在其他相关问题中提到了 ActiveMQ 和 RabbitMQ。目前还不清楚连接有多远,但如果服务器是 RabbitMQ,一个可能的解释也可能是:https://github.com/rabbitmq/rabbitmq-amqp1.0/issues/47。正如另一个答案中提到的,由于其他问题,这可能无关紧要,例如我之前使用 JMS 客户端或其他一些 AMQP 1.0 客户端针对 RabbitMQ 并没有取得多大成功,因为我报告了一个问题,该问题在创建消费者和生产者时阻止了它们:https://github.com/rabbitmq/rabbitmq-amqp1.0/issues/34

    【讨论】:

      【解决方案2】:

      感谢您的所有回复。在我的情况下,我使用的所有库/配置确实是正确的。我联系了管理经纪人的团队。原来我试图联系的用户有一些 PRIVILEGE 问题。一旦他们给了我的用户正确的权限,我就能够成功地建立连接并发送和接收消息。

      【讨论】:

        【解决方案3】:

        在我收到此错误的情况下,这仅仅是因为当我在办公室时,我们的公司代理在我以编程方式执行时过滤掉了此流量。使用服务总线资源管理器仍然有效,因为它必须选择添加代理的机器设置。

        我们使用的是公共托管的服务总线,所以我尝试在没有代理的情况下从我的家庭网络进行,一切都按预期工作。使用 Wireshark 或类似程序可能有助于更快地识别这一点。希望这对某人有所帮助。

        【讨论】:

          【解决方案4】:

          此行显示您的错误:

          Caused by: java.io.IOException: Cannot send to a non-connected transport.
          

          这表示您的连接配置不正确。我看到的一件事是您没有引用属性文件中的属性。例如, 这个:

          ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup");
          Destination queue = (Destination) context.lookup("myQueueLookup");
          

          应该是这样的:

          ConnectionFactory factory = (ConnectionFactory) context.lookup("connectionfactory.myFactoryLookup");
          Destination queue = (Destination) context.lookup("queue.myQueueLookup");
          

          【讨论】:

          • “myFactoryLookup”和“myQueueLookup”查找值实际上是正确的。 “连接工厂”。和“队列”。 InitialContextFactory 实现使用前缀来确定属性配置的资源类型,其余部分用作查找名称。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-13
          • 1970-01-01
          • 2016-09-27
          • 1970-01-01
          • 2017-12-29
          • 1970-01-01
          相关资源
          最近更新 更多