【问题标题】:Java ActiveMQ + STOMP + SSH: illegal reflective access operation to method sun.security.ssl.SSLSocketImpl.setHostJava ActiveMQ + STOMP + SSH:对方法 sun.security.ssl.SSLSocketImpl.setHost 的非法反射访问操作
【发布时间】:2022-02-10 23:29:44
【问题描述】:

我正在为 AmazonMQ 编写一个简单的 Java JMS QueueBrowser 客户端,它使用 stomp 协议在 ssh 上运行 ActiveMQ(因此他的传输是 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();
        }
    }
}

由于使用了传输,我得到了javax.jms.JMSException execepion(我假设是stomp+ssl

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。

【问题讨论】:

    标签: java activemq stomp amazon-mq


    【解决方案1】:

    不支持 JMS over STOMP。

    请记住,JMS 只是一个 API。大多数经纪人之间的底层有线协议是不同的。在 ActiveMQ “Classic”(这是 Amazon MQ 使用的)中,您可以通过 OpenWire 协议或通过 AMQP(需要使用 Qpid JMS 库)使用 JMS。不支持 JMS over STOMP。

    在这种情况下,您使用的是 OpenWire JMS 客户端,因为您使用的是org.apache.activemq.ActiveMQConnectionFactory。无论您在连接字符串中指定什么内容,客户端都将使用 OpenWire 协议。

    STOMP 只是不支持 JMS 公开的大部分功能。 STOMP 尤其不支持队列浏览器。

    【讨论】:

    • 非常感谢,我错过了。因此,似乎在使用stomp 时还有其他选择,除非实现消息接收器客户端(然后是观察者)并在服务器上关闭自动确认。或者 Python/NodeJS 中可能有一个替代库。确保 AWS 开发工具包不会实现 QueueBrowser
    • 谢谢我确实知道 JMS OpenWire,我想它是跨协议的。 STOMP 是服务器协议,无法更改。谢谢。
    • 是的,ActiveMQ 后端正在使用 STOMP,我无权访问它。因此,我必须弄清楚如何“管理”队列(只看消息,不处理),然后我来到了 QueueBroker 和 JMS。谢谢。
    • 添加。 STOMP 这里的问题似乎与activemq.apache.org/how-do-i-unack-the-message-with-stomp 有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2018-02-24
    • 2021-08-29
    相关资源
    最近更新 更多