ActiveMQ Java STOMP 客户端收到 SocketTimeoutException
ActiveMQ Java STOMP client receives SocketTimeoutException
CentOS 机器上有一个 ActiveMQ 服务器。我可以使用 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)
听众Class
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>
你以前遇到过类似的异常吗?
当 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 客户端。
CentOS 机器上有一个 ActiveMQ 服务器。我可以使用 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)
听众Class
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>
你以前遇到过类似的异常吗?
当 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 客户端。