【问题标题】:Maximum permit count exceeded超出最大许可计数
【发布时间】:2016-07-26 11:26:02
【问题描述】:

我在使用 java 代码在 rabbitMQ 中发布一些数据时遇到异常。

当我们试图在rabbit中发布太多并发数据时,负载很高。

正在打印以下跟踪。

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)

【问题讨论】:

    标签: java rabbitmq tomcat8


    【解决方案1】:

    我敢打赌你有 RabbitMQ amqp-client 版本 3.4.2 或类似的版本。从仅阅读 WorkPool / WorkQueue 类的代码来看,它们似乎可以轻松地释放信号量而不是获取信号量。所以许可证的数量不断增长。一旦达到 Integer.MAX_VALUE,您将获得与您提供的一样的异常。在空闲系统上可能需要很多时间,但随着负载的增加,时间会缩短。对于我们的 RabbitMQ 服务器,大约需要 6 周时间才会崩溃。

    看起来在较新版本的客户端中,他们刚刚完全删除了信号量逻辑,所以我建议尝试将您的客户端库升级到 3.5.x 或 3.6.x。

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2018-01-23
      相关资源
      最近更新 更多