關於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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章