Java ActiveMQ + STOMP + SSH:对方法的非法反射访问操作sun.security.ssl.SSLSocketImpl.setHost
Java ActiveMQ + STOMP + SSH: illegal reflective access operation to method sun.security.ssl.SSLSocketImpl.setHost
我正在为 AmazonMQ 编写一个简单的 Java JMS QueueBrowser 客户端,运行 ActiveMQ stomp
基于 ssh
的协议(因此他的传输是 stomp+ssl
:
// java
import java.util.Enumeration;
// jms
import javax.jms.IllegalStateException;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
// activemq
import org.apache.activemq.ActiveMQConnectionFactory;
public class QueueBrowserExample {
public static void main(String[] args) throws Exception {
System.out.println("init");
try {
final String PORT = "61616";
final String PROTOCOL = "stomp+ssl";
final String HOST = "xxx.mq.us-east-1.amazonaws.com";
final String connectionString = PROTOCOL + "://" + HOST + ":" + PORT;
System.out.println("attempt to connect to " + connectionString);
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(connectionString);
Connection connection = connectionFactory.createConnection("admin", "admin");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("Test");
QueueBrowser queueBrowser = session.createBrowser(queue);
Enumeration msgs = queueBrowser.getEnumeration();
} catch (Exception e) {
e.printStackTrace();
}
}
}
由于使用了传输(stomp+ssl
我假设)
,我得到了一个 javax.jms.JMSException
执行
javax.jms.JMSException: Could not create Transport. Reason: java.lang.IllegalArgumentException: Invalid connect parameters: {wireFormat.host=b-02b566af-1f0d-4d48-ad24-229a813a53fb-1.mq.us-east-1.amazonaws.com}
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:319)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:332)
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:253)
at QueueBrowserExample.main(QueueBrowserExample.java:37)
Caused by: java.lang.IllegalArgumentException: Invalid connect parameters: {wireFormat.host=b-02b566af-1f0d-4d48-ad24-229a813a53fb-1.mq.us-east-1.amazonaws.com}
at org.apache.activemq.transport.TransportFactory.doConnect(TransportFactory.java:122)
at org.apache.activemq.transport.TransportFactory.connect(TransportFactory.java:64)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:317)
... 3 more
ActiveMQ 后端正在使用 STOMP,我没有任何访问权限。因此,我必须弄清楚如何“管理”队列(只看消息,不处理),然后我来到了 QueueBrowser 和 JMS。
不支持基于 STOMP 的 JMS。
请记住,JMS 只是一个 API。大多数经纪商之间的底层电汇协议是不同的。在 ActiveMQ“Classic”(这是 Amazon MQ 使用的)中,您可以通过 OpenWire 协议或通过 AMQP(需要使用 Qpid JMS 库)使用 JMS。不支持基于 STOMP 的 JMS。
在本例中,您使用的是 OpenWire JMS 客户端,因为您使用的是 org.apache.activemq.ActiveMQConnectionFactory
。无论您在连接字符串中指定什么,客户端都将使用 OpenWire 协议。
STOMP 只是不支持 JMS 公开的大部分功能。 STOMP 尤其不支持队列浏览器。
我正在为 AmazonMQ 编写一个简单的 Java JMS QueueBrowser 客户端,运行 ActiveMQ stomp
基于 ssh
的协议(因此他的传输是 stomp+ssl
:
// java
import java.util.Enumeration;
// jms
import javax.jms.IllegalStateException;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
// activemq
import org.apache.activemq.ActiveMQConnectionFactory;
public class QueueBrowserExample {
public static void main(String[] args) throws Exception {
System.out.println("init");
try {
final String PORT = "61616";
final String PROTOCOL = "stomp+ssl";
final String HOST = "xxx.mq.us-east-1.amazonaws.com";
final String connectionString = PROTOCOL + "://" + HOST + ":" + PORT;
System.out.println("attempt to connect to " + connectionString);
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(connectionString);
Connection connection = connectionFactory.createConnection("admin", "admin");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("Test");
QueueBrowser queueBrowser = session.createBrowser(queue);
Enumeration msgs = queueBrowser.getEnumeration();
} catch (Exception e) {
e.printStackTrace();
}
}
}
由于使用了传输(stomp+ssl
我假设)
javax.jms.JMSException
执行
javax.jms.JMSException: Could not create Transport. Reason: java.lang.IllegalArgumentException: Invalid connect parameters: {wireFormat.host=b-02b566af-1f0d-4d48-ad24-229a813a53fb-1.mq.us-east-1.amazonaws.com}
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:319)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:332)
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:253)
at QueueBrowserExample.main(QueueBrowserExample.java:37)
Caused by: java.lang.IllegalArgumentException: Invalid connect parameters: {wireFormat.host=b-02b566af-1f0d-4d48-ad24-229a813a53fb-1.mq.us-east-1.amazonaws.com}
at org.apache.activemq.transport.TransportFactory.doConnect(TransportFactory.java:122)
at org.apache.activemq.transport.TransportFactory.connect(TransportFactory.java:64)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:317)
... 3 more
ActiveMQ 后端正在使用 STOMP,我没有任何访问权限。因此,我必须弄清楚如何“管理”队列(只看消息,不处理),然后我来到了 QueueBrowser 和 JMS。
不支持基于 STOMP 的 JMS。
请记住,JMS 只是一个 API。大多数经纪商之间的底层电汇协议是不同的。在 ActiveMQ“Classic”(这是 Amazon MQ 使用的)中,您可以通过 OpenWire 协议或通过 AMQP(需要使用 Qpid JMS 库)使用 JMS。不支持基于 STOMP 的 JMS。
在本例中,您使用的是 OpenWire JMS 客户端,因为您使用的是 org.apache.activemq.ActiveMQConnectionFactory
。无论您在连接字符串中指定什么,客户端都将使用 OpenWire 协议。
STOMP 只是不支持 JMS 公开的大部分功能。 STOMP 尤其不支持队列浏览器。