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 尤其不支持队列浏览器。