关于ActiveMQ消息队列不消费的思考

对于某些消息队列中间件标榜自己吞吐量高一直无法理解,一直觉得,不同的消息队列实现,吞吐量不会差太多,不管是多是少总不会差一个量级上,,一丁点差距没有值得称道的地方。

直到我用了ActiveMQ,才终于明白,标榜吞吐量高,全是同行衬托的,ActiveMQ的实现上一定有一个不大的Bug。这个Bug源于我发现的一个现象,ActiveMQ管理界面上可以看队列中还有7条消息等待多时仍然迟迟没有消费。将线程Dump下来后发现,Java消费者线程却全部卡在了读取消息的位置

   java.lang.Thread.State: RUNNABLE
        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 sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
        at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593)
        at sun.security.ssl.InputRecord.read(InputRecord.java:532)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
        - locked <0x00000000d5a90800> (a java.lang.Object)
        at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940)
        at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
        - locked <0x00000000d5a90948> (a sun.security.ssl.AppInputStream)
        at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:139)
        at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:155)
        at org.apache.http.impl.io.SessionInputBufferImpl.read(SessionInputBufferImpl.java:208)
        at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:191)
        at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:137)
        at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238)
        at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
        at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
        at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:73)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x00000000d5a84118> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.Reader.read(Reader.java:140)
        at org.apache.http.util.EntityUtils.toString(EntityUtils.java:247)
        at org.apache.http.util.EntityUtils.toString(EntityUtils.java:273)

长达5分钟多钟的idle状态,直到报了多次Read timed out错误后才重新开始消费

java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_161]
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_161]
	at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[?:1.8.0_161]
	at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_161]
	at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) ~[?:1.8.0_161]
	at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593) ~[?:1.8.0_161]
	at sun.security.ssl.InputRecord.read(InputRecord.java:532) ~[?:1.8.0_161]
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983) ~[?:1.8.0_161]
	at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940) ~[?:1.8.0_161]
	at sun.security.ssl.AppInputStream.read(AppInputStream.java:105) ~[?:1.8.0_161]
	at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:139) ~[httpcore-4.4.1.jar:4.4.1]
	at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:155) ~[httpcore-4.4.1.jar:4.4.1]
	at org.apache.http.impl.io.SessionInputBufferImpl.read(SessionInputBufferImpl.java:208) ~[httpcore-4.4.1.jar:4.4.1]
	at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:191) ~[httpcore-4.4.1.jar:4.4.1]
	at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:137) ~[httpclient-4.4.1.jar:4.4.1]
	at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238) ~[?:1.8.0_161]
	at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158) ~[?:1.8.0_161]
	at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117) ~[?:1.8.0_161]
	at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:73) ~[httpclient-4.4.1.jar:4.4.1]
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_161]
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_161]
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_161]
	at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_161]
	at java.io.Reader.read(Reader.java:140) ~[?:1.8.0_161]
	at org.apache.http.util.EntityUtils.toString(EntityUtils.java:247) ~[httpcore-4.4.1.jar:4.4.1]
	at org.apache.http.util.EntityUtils.toString(EntityUtils.java:273) ~[httpcore-4.4.1.jar:4.4.1]
发布了38 篇原创文章 · 获赞 22 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Vincent_Field/article/details/103930879