【问题标题】:ActiveMQ Java STOMP client receives SocketTimeoutExceptionActiveMQ Java STOMP 客户端收到 SocketTimeoutException
【发布时间】:2021-05-16 09:04:07
【问题描述】:

有一个 ActiveMQ 服务器在 CentOS 机器上工作。我可以使用 OpenWire JMS 客户端通过 TCP 和 HTTP 连接和使用消息。但是,当我尝试使用 ActiveMQ 测试 STOMP 客户端时,它会在 connection.receieve 上引发此异常;

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.net.SocketInputStream.read(SocketInputStream.java:224)
    at java.io.DataInputStream.readByte(DataInputStream.java:265)
    at org.apache.activemq.transport.stomp.StompWireFormat.readHeaderLine(StompWireFormat.java:174)
    at org.apache.activemq.transport.stomp.StompWireFormat.readLine(StompWireFormat.java:167)
    at org.apache.activemq.transport.stomp.StompWireFormat.parseAction(StompWireFormat.java:200)
    at org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:112)
    at org.apache.activemq.transport.stomp.StompConnection.receive(StompConnection.java:77)
    at tr.com.estherial.stomplistener.StompListener.main(StompListener.java:25)

监听类

import org.apache.activemq.transport.stomp.Stomp;
import org.apache.activemq.transport.stomp.StompConnection;
import org.apache.activemq.transport.stomp.StompFrame;
 
public class StompListener {

    public static void main(String[] args) { 

        StompConnection connection = new StompConnection();
        try {
            connection.open("host", 61613);
            connection.connect("admin", "admin", "test");
            connection.subscribe("TEST_TOPIC", Stomp.Headers.Subscribe.AckModeValues.CLIENT);
            connection.begin("test"); 

            while (true) {
                try {
                    StompFrame message = connection.receive(10000); 
                    System.out.println(String.format("%s - Receiver: received '%s'", new Date(), message.getBody()));
                } catch (SocketTimeoutException e) {
                    // ignore
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这是activemq.xml中的连接器:

<transportConnectors>
    <transportConnector name="stomp" uri="stomp://localhost:61613"/>
</transportConnectors>

你之前遇到过类似的异常吗?

【问题讨论】:

  • 鉴于您在此主题上的 other question,值得注意的是您的代码使用普通 TCP 套接字进行连接,而不是 WebSocket。

标签: java activemq stomp consumer


【解决方案1】:

当 STOMP 订阅者在指定的超时时间内未收到任何消息时,应使用 java.net.SocketTimeoutException。一旦客户创建了他的订阅,您需要向主题发送一条消息。此时客户端应该会收到消息并通过您的System.out.println 打印出来。

此外,在 ActiveMQ 5.x 中,从 STOMP 客户端订阅目的地时,您需要在目的地名称前加上 /queue//topic/ 前缀。您没有在您的应用程序中执行此操作。试试这个:

connection.subscribe("/topic/TEST_TOPIC", Stomp.Headers.Subscribe.AckModeValues.CLIENT);

最后,值得注意的是,您正在使用 ActiveMQ 代码库中的 test STOMP 客户端。 ActiveMQ 的内部测试套件使用此客户端来验证代理实现是否按预期工作。它不适合一般用途。此外,如果您使用 Java,最好使用性能更好、功能更全的客户端,例如 OpenWire JMS 客户端甚至 Qpid JMS 客户端。

【讨论】:

  • 感谢您的回答。我与生产者(每秒)向 TEST_TOPIC 发送消息。它仍然得到 SocketTimeoutException。我不能使用 Openwire TCP 客户端,客户不允许。他们给了我两个选择。 STOMP 或 WSS。
  • 我更新了我的答案以解决您的评论。希望有帮助!
  • 贾斯汀你成就了我的一天。添加“/topic/”解决了这个问题。非常感谢你的努力。周末愉快!
猜你喜欢
  • 2012-07-15
  • 2018-03-27
  • 2012-10-02
  • 2011-12-06
  • 2011-12-24
  • 2016-08-27
  • 2010-09-23
  • 2016-06-24
  • 2012-10-05
相关资源
最近更新 更多