javax.jms.JMSException:无法发送到未连接的传输

时间:2017-05-11 13:58:14

标签: java jms qpid

我正在使用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

现在上面的代码给了我ERROR ::

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连接。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在我的情况下,当收到此错误时,这只是因为当我在办公室时,我的公司代理在我以编程方式执行时过滤掉了这个流量。使用Service Bus Explorer仍然有效,因为它必须已经选择了添加代理的计算机设置。

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

答案 2 :(得分:-1)

此行显示您的错误:

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");