问题
I am facing exception while publishing some data in rabbitMQ with java code.
In case of high load when we are trying to publish too many concurrent data in rabbit.
Following trace is printing.
java.lang.Error: Maximum permit count exceeded
at java.util.concurrent.Semaphore$Sync.tryReleaseShared(Semaphore.java:192)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared(AbstractQueuedSynchronizer.java:1341)
at java.util.concurrent.Semaphore.release(Semaphore.java:426)
at com.rabbitmq.client.impl.WorkPool.increaseUnlimited(WorkPool.java:158)
at com.rabbitmq.client.impl.WorkPool.access$200(WorkPool.java:70)
at com.rabbitmq.client.impl.WorkPool$WorkQueue.setUnlimited(WorkPool.java:122)
at com.rabbitmq.client.impl.WorkPool.unlimit(WorkPool.java:184)
at com.rabbitmq.client.impl.ConsumerWorkService.unlimit(ConsumerWorkService.java:68)
at com.rabbitmq.client.impl.ConsumerDispatcher.setUnlimited(ConsumerDispatcher.java:66)
at com.rabbitmq.client.impl.ChannelN.enqueueRpc(ChannelN.java:1193)
at com.rabbitmq.client.impl.AMQChannel.quiescingRpc(AMQChannel.java:232)
at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:224)
at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:209)
at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:118)
at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:833)
at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:61)
at ProcessRawReport.feedToRabbit(ProcessRawReport.java:89)
at ProcessRawReport.doGet(ProcessRawReport.java:78)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
回答1:
I bet you have RabbitMQ amqp-client of version 3.4.2 or something close to that. From just reading the code of the WorkPool / WorkQueue classes it looks like they can easily be releasing semaphore more often than acquiring it. So the number of permits grows continuously. As soon as it reaches Integer.MAX_VALUE, you will get exception like the one you provided. It probably takes a lot of time on an idle system but as load increases, that time shortens. For our RabbitMQ server it takes about 6 weeks before it falls over.
Looks like in the newer versions of the client they just removed that semaphore logic completely so I would suggest trying to upgrade your client library to 3.5.x or 3.6.x.
来源:https://stackoverflow.com/questions/38588620/maximum-permit-count-exceeded