繁体   English   中英

Rabbitmq + Spring Boot +消费者在处理一条消息后闲置15分钟

[英]rabbitmq + spring boot + consumers idle for 15 mins after processing a single message

我们使用Spring Boot(1.5)和集成来连接到Rabbit MQ作为PCF上的服务

设置的属性-并发= 15-maxConcurrency = 25-默认预取和txSize。

消息的处理方式。

  1. 队列在不到1秒的时间内收到了26条消息。
  2. 下一分钟有15位消费者开始和完成。
  3. 每个消费者花费的平均时间约为30秒。
  4. 很少有消费者花费少于15秒的时间。
  5. 正如每个使用者确认的那样,来自就绪的新消息(第16条,第17条消息)在Rabbit MQ上未被确认。

到目前为止,由于我假设随着旧消息的确认,正在处理新消息。 但是随着新消息变得在RabbitMQ上没有得到确认,任何消费者都不会处理它们。 消费者陷入困境,无所事事。

  1. 这将继续,并且所有就绪状态消息都将变为未确认状态,并停留在此状态而没有任何活动。
  2. 它们都在大约15分钟后恢复。

我总是看到这种行为。

有指导吗?

这是执行兔子MQ接线的代码,中间的MessageHandler具有连接到大数据并进行一些查询的代码。

@Configuration
@EnableRabbit
public class RabbitMQ {

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${spring.rabbitmq.listener.concurrency:3}")
    private int concurrentConsumers;

    @Value("${spring.rabbitmq.listener.maxConcurrency:5}")
    private int maxConcurrentConsumers;

    @Value("${spring.rabbitmq.template.retry.max-attempts:3}")
    private int maxAttempts;

    @Value("${spring.rabbitmq.template.retry.initial-interval:2000}")
    private int initialInterval;

    @Value("${spring.rabbitmq.template.retry.multiplier:3}")
    private int multiplier;

    @Value("${spring.rabbitmq.template.retry.max-interval:10000}")
    private int maxInterval;

    @Autowired
    private BotQueues botQueues;

    @Autowired
    private RetryFailLogger retryRecoverer;

    @Bean
    public StatefulRetryOperationsInterceptor statefulRetryOperationsInterceptor() {
        return RetryInterceptorBuilder.stateful()
                .backOffOptions(initialInterval, multiplier, maxInterval) // initialInterval, multiplier, maxInterval
                .maxAttempts(maxAttempts)
                .messageKeyGenerator(message -> message.getMessageProperties().getMessageId())
                .recoverer(retryRecoverer)
                .build();
    }

    @Bean
    public Jackson2JsonMessageConverter defaultJsonMessageConverter() {

        Jackson2JsonMessageConverter jsonConverter = new Jackson2JsonMessageConverter();
        DefaultClassMapper classMapper = new DefaultClassMapper();
        classMapper.setDefaultType(JobDetailInfo.class);
        jsonConverter.setClassMapper(classMapper);

        return jsonConverter;
    }

    @Bean
    public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory)
            throws BeansException, ClassNotFoundException {

        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
        container.setQueues(botQueues.inputQueues());
        container.setConcurrentConsumers(concurrentConsumers);
        container.setMaxConcurrentConsumers(maxConcurrentConsumers);
        container.setChannelTransacted(true);
        container.setAdviceChain(new Advice[] {statefulRetryOperationsInterceptor()});
        return container;
    }

    @Bean
    public AmqpInboundChannelAdapter inbound(SimpleMessageListenerContainer container,
            @Qualifier("commonInputChannel") MessageChannel amqpInputChannel) {
        AmqpInboundChannelAdapter adapter = new AmqpInboundChannelAdapter(container);
        adapter.setMessageConverter(defaultJsonMessageConverter());
        adapter.setOutputChannel(amqpInputChannel);
        return adapter;
    }

    @Bean
    @ServiceActivator(inputChannel = "commonInputChannel", outputChannel = "commonOutputChannel")
    public MessageHandler messageHandler() {
        return new MessageHandler();
    }

    @Router(inputChannel = "commonOutputChannel")
    public String resolveJobChannel(JobDetailInfo jobDetailInfo) {

        String returnChannel = "";

        if (jobDetailInfo != null) {
            switch (jobDetailInfo.getJobStatus()) {
                case Scheduled:
                    returnChannel = "collectorChannel";
                    break;

                default:
                    break;
            }
        }

        return returnChannel;
    }
}

线程转储:

{“ threadName”:“容器14”,“ threadId”:40,“ blockedTime”:-1,“ blockedCount”:45,“ waitedTime”:-1,“ waitedCount”:66654,“ lockName”:“ java。 util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@1b4302a9“,” lockOwnerId“:-1,” lockOwnerName“:null,” inNative“:false,” suspended“:false,” threadState“:” TIMED_WAITING“,” stackTrace“: [{“ methodName”:“ park”,“ fileName”:“ Unsafe.java”,“ lineNumber”:-2,“ className”:“ sun.misc.Unsafe”,“ nativeMethod”:true},{“ methodName” :“ parkNanos”,“ fileName”:“ LockSupport.java”,“ lineNumber”:215,“ className”:“ java.util.concurrent.locks.LockSupport”,“ nativeMethod”:false},{“ methodName”:“ awaitNanos“,” fileName“:” AbstractQueuedSynchronizer.java“,” lineNumber“:2078,” className“:” java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject“,” nativeMethod“:false},{” methodName“:” poll“,” fileName“:” LinkedBlockingQueue.java“,” lineNumber“:467,” className“:” java.util.concurrent.LinkedBlockingQueue“,” nativeMethod“:false},{” methodName“:” nextMessage“,” fileName“:” BlockingQueueConsumer.java“ ,“ lineNumber”:461,“ className”:“ org.springframework.amqp.rabbit.listener.BlockingQueueConsumer”,“ nativeMethod”:false},{“ methodName”:“ doReceiveAndExecute”,“ fileName”:“ SimpleMessageListenerContainer.java” ,“ lineNumber”:1214,“ className”:“ org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer”,“ nativeMethod”:false},{“ methodName”:“ receiveAndExecute”,“ fileName”:“ SimpleMessageListenerContainer.java” ,“ lineNumber”:1189,“ className”:“ org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer”,“ nativeMethod”:false},{“ methodName”:“ access $ 1500”,“ fileName”:“ SimpleMessageListenerContainer.java “,” lineNumber“:97,” className“:” org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer“,” nativeMethod“:false},{” methodName“:” run“,” fileName“:” SimpleMessageListenerContainer.java “,” lineNumber“:1421,” className“:” org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer“,” nativeMethod“:false},{” methodName“:” run“,” fileName“:” Thre ad.java“,” lineNumber“:748,” className“:” java.lang.Thread“,” nativeMethod“:false}],” lockedMonitors“:[],” lockedSynchronizers“:[],” lockInfo“:{ “ className”:“ java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject”,“ identityHashCode”:457376425}},

{“ threadName”:“ container-13”,“ threadId”:39,“ blockedTime”:-1,“ blockedCount”:34,“ waitedTime”:-1,“ waitedCount”:66160,“ lockName”:null,“ lockOwnerId“:-1,” lockOwnerName“:null,” inNative“:true,” suspended“:false,” threadState“:” RUNNABLE“,” stackTrace“:[{” methodName“:” socketRead0“,” fileName“: “ SocketInputStream.java”,“ lineNumber”:-2,“ className”:“ java.net.SocketInputStream”,“ nativeMethod”:true},{“ methodName”:“ socketRead”,“ fileName”:“ SocketInputStream.java” ,“ lineNumber”:116,“ className”:“ java.net.SocketInputStream”,“ nativeMethod”:false},{“ methodName”:“ read”,“ fileName”:“ SocketInputStream.java”,“ lineNumber”:171 ,“ className”:“ java.net.SocketInputStream”,“ nativeMethod”:false},{“ methodName”:“ read”,“ fileName”:“ SocketInputStream.java”,“ lineNumber”:141,“ className”:“ java.net.SocketInputStream“,” nativeMethod“:false},{” methodName“:” readMore“,” fileName“:” VisibleBufferedInputStream.java“,” lineNumber“:140,” className“:” org.postgresql.core。 VisibleBufferedInputStream“,” nativeMethod“:false},{” methodName“:” ensureBytes“,” f ileName“:” VisibleBufferedInputStream.java“,” lineNumber“:109,” className“:” org.postgresql.core.VisibleBufferedInputStream“,” nativeMethod“:false},{” methodName“:” read“,” fileName“:” VisibleBufferedInputStream.java“,” lineNumber“:67,” className“:” org.postgresql.core.VisibleBufferedInputStream“,” nativeMethod“:false},{” methodName“:” receiveChar“,” fileName“:” PGStream.java“ ,“ lineNumber”:280,“ className”:“ org.postgresql.core.PGStream”,“ nativeMethod”:false},{“ methodName”:“ processResults”,“ fileName”:“ QueryExecutorImpl.java”,“ lineNumber” :1916,“ className”:“ org.postgresql.core.v3.QueryExecutorImpl”,“ nativeMethod”:false},{“ methodName”:“ execute”,“ fileName”:“ QueryExecutorImpl.java”,“ lineNumber”:288 ,“ className”:“ org.postgresql.core.v3.QueryExecutorImpl”,“ nativeMethod”:false},{“ methodName”:“ executeInternal”,“ fileName”:“ PgStatement.java”,“ lineNumber”:430,“ className“:” org.postgresql.jdbc.PgStatement“,” nativeMethod“:false},{” methodName“:” execute“,” fileName“:” PgStatement.java“,” lineNumber“:356,” className“:”邮局 gresql.jdbc.PgStatement“,” nativeMethod“:false},{” methodName“:” executeWithFlags“,” fileName“:” PgStatement.java“,” lineNumber“:303,” className“:” org.postgresql.jdbc。 PgStatement“,” nativeMethod“:false},{” methodName“:” executeCachedSql“,” fileName“:” PgStatement.java“,” lineNumber“:289,” className“:” org.postgresql.jdbc.PgStatement“,” nativeMethod“:false},{” methodName“:” executeWithFlags“,” fileName“:” PgStatement.java“,” lineNumber“:266,” className“:” org.postgresql.jdbc.PgStatement“,” nativeMethod“:false },{“ methodName”:“ execute”,“ fileName”:“ PgStatement.java”,“ lineNumber”:262,“ className”:“ org.postgresql.jdbc.PgStatement”,“ nativeMethod”:false},{“ methodName“:” validate“,” fileName“:” PooledConnection.java“,” lineNumber“:532,” className“:” org.apache.tomcat.jdbc.pool.PooledConnection“,” nativeMethod“:false},{” methodName“:” validate“,” fileName“:” PooledConnection.java“,” lineNumber“:443,” className“:” org.apache.tomcat.jdbc.pool.PooledConnection“,” nativeMethod“:false},{” methodName“:” borrowConnection“,” fileName“:” Connectio nPool.java“,” lineNumber“:802,” className“:” org.apache.tomcat.jdbc.pool.ConnectionPool“,” nativeMethod“:false},{” methodName“:” borrowConnection“,” fileName“:” ConnectionPool.java“,” lineNumber“:651,” className“:” org.apache.tomcat.jdbc.pool.ConnectionPool“,” nativeMethod“:false},{” methodName“:” getConnection“,” fileName“:” ConnectionPool.java“,” lineNumber“:198,” className“:” org.apache.tomcat.jdbc.pool.ConnectionPool“,” nativeMethod“:false},{” methodName“:” getConnection“,” fileName“:” DataSourceProxy.java“,” lineNumber“:132,” className“:” org.apache.tomcat.jdbc.pool.DataSourceProxy“,” nativeMethod“:false},{” methodName“:” getConnection“,” fileName“:” DatasourceConnectionProviderImpl.java“,” lineNumber“:122,” className“:” org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl“,” nativeMethod“:false},{” methodName“:” obtainConnection“,” fileName“ :“” NonContextualJdbcConnectionAccess.java“,” lineNumber“:35,” className“:” org.hibernate.internal.NonContextualJdbcConnectionAccess“,” nativeMethod“:false},{” methodName“:” acquireConnectionIfNeeded“,” fileName“:” LogicalConnectionManagedImpl.java“,” lineNumber“:99,” className“:” org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl“,” nativeMethod“:false},{” methodName“:” getPhysicalConnection“,” fileName“:” LogicalConnectionManagedImpl.java“,” lineNumber“:129,” className“:” org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl“,” nativeMethod“:false},{” methodName“:” getConnectionForTransactionManagement“,” fileName“:” LogicalConnectionManagedImpl.java“,” lineNumber“:247,” className“:” org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl“,” nativeMethod“:false},{” methodName“:” begin“,” fileName“:” LogicalConnectionManagedImpl.java“,” lineNumber“:254,” className“:” org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl“,” nativeMethod“:false},{” methodName“:”开始“,” fileName“:” JdbcResourceLocalTransactionCoordinatorImpl.java“,” lineNumber“:203,” className“:” org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResource LocalTransactionCoordinatorImpl $ TransactionDriverControlImpl“,” nativeMethod“:false},{” methodName“:” begin“,” fileName“:” TransactionImpl.java“,” lineNumber“:56,” className“:” org.hibernate.engine.transaction。 internal.TransactionImpl“,” nativeMethod“:false},{” methodName“:” beginTransaction“,” fileName“:” HibernateJpaDialect.java“,” lineNumber“:189,” className“:” org.springframework.orm.jpa。 vendor.HibernateJpaDialect“,” nativeMethod“:false},{” methodName“:” doBegin“,” fileName“:” JpaTransactionManager.java“,” lineNumber“:380,” className“:” org.springframework.orm.jpa。 JpaTransactionManager“,” nativeMethod“:false},{” methodName“:” getTransaction“,” fileName“:” AbstractPlatformTransactionManager.java“,” lineNumber“:373,” className“:” org.springframework.transaction.support.AbstractPlatformTransactionManager“ ,“ nativeMethod”:false},{“ methodName”:“ createTransactionIfNecessary”,“ fileName”:“ TransactionAspectSupport.java”,“ lineNumber”:447,“ className”:“ org.springframework.transaction.interceptor.TransactionAspectSupport”,“ t iveMethod“:false},{” methodName“:” invokeWithinTransaction“,” fileName“:” TransactionAspectSupport.java“,” lineNumber“:277,” className“:” org.springframework.transaction.interceptor.TransactionAspectSupport“,” nativeMethod“ :false},{“ methodName”:“ invoke”,“ fileName”:“ TransactionInterceptor.java”,“ lineNumber”:96,“ className”:“ org.springframework.transaction.interceptor.TransactionInterceptor”,“ nativeMethod”:false },{“ methodName”:“已处理”,“ fileName”:“ ReflectiveMethodInvocation.java”,“ lineNumber”:179,“ className”:“ org.springframework.aop.framework.ReflectiveMethodInvocation”,“ nativeMethod”:false}, {“ methodName”:“ intercept”,“ fileName”:“ CglibAopProxy.java”,“ lineNumber”:673,“ className”:“ org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor”,“ nativeMethod”:false}, {“ methodName”:“ handleMessage”,“ fileName”:“”,“ lineNumber”:-1,“ className”:“ message.handlers.MessageHandler $$ EnhancerBySpringCGLIB $$ cf53d23e”,“ nativeMethod”:false},{“ methodName“:”调用“,” fileName“:null,” lineNumber“:-1,” className “:” sun.reflect.GeneratedMethodAccessor145“,” nativeMethod“:false},{” methodName“:” invoke“,” fileName“:” DelegatingMethodAccessorImpl.java“,” lineNumber“:43,” className“:” sun.reflect .DelegatingMethodAccessorImpl“,” nativeMethod“:false},{” methodName“:”调用“,” fileName“:” Method.java“,” lineNumber“:498,” className“:” java.lang.reflect.Method“, “ nativeMethod”:false},{“ methodName”:“ execute”,“ fileName”:“ ReflectiveMethodExecutor.java”,“ lineNumber”:113,“ className”:“ org.springframework.expression.spel.support.ReflectiveMethodExecutor”, “ nativeMethod”:false},{“ methodName”:“ getValueInternal”,“ fileName”:“ MethodReference.java”,“ lineNumber”:102,“ className”:“ org.springframework.expression.spel.ast.MethodReference”, “ nativeMethod”:false},{“ methodName”:“ access $ 000”,“ fileName”:“ MethodReference.java”,“ lineNumber”:49,“ className”:“ org.springframework.expression.spel.ast.MethodReference” ,“ nativeMethod”:false},{“ methodName”:“ getValue”,“ fileName”:“ MethodReference.java”,“ lineNumber”:347,“ className”:“ org.springframework.exp ression.spel.ast.MethodReference $ MethodValueRef“,” nativeMethod“:false},{” methodName“:” getValueInternal“,” fileName“:” CompoundExpression.java“,” lineNumber“:88,” className“:” org。 springframework.expression.spel.ast.CompoundExpression“,” nativeMethod“:false},{” methodName“:” getTypedValue“,” fileName“:” SpelNodeImpl.java“,” lineNumber“:131,” className“:” org.org。 springframework.expression.spel.ast.SpelNodeImpl“,” nativeMethod“:false},{” methodName“:” getValue“,” fileName“:” SpelExpression.java“,” lineNumber“:330,” className“:” org。 springframework.expression.spel.standard.SpelExpression“,” nativeMethod“:false},{” methodName“:” evaluateExpression“,” fileName“:” AbstractExpressionEvaluator.java“,” lineNumber“:169,” className“:” org。 springframework.integration.util.AbstractExpressionEvaluator“,” nativeMethod“:false},{” methodName“:” processInternal“,” fileName“:” MessagingMethodInvokerHelper.java“,” lineNumber“:319,” className“:” org.springframework。 integration.util.MessagingMethodInvokerHelper“,” nativeMethod“:false},{” methodName“ :“进程”,“文件名”:“ MessagingMethodInvokerHelper.java”,“ lineNumber”:155,“ className”:“ org.springframework.integration.util.MessagingMethodInvokerHelper”,“ nativeMethod”:false},{“ methodName”:“ processMessage“,” fileName“:” MethodInvokingMessageProcessor.java“,” lineNumber“:93,” className“:” org.springframework.integration.handler.MethodInvokingMessageProcessor“,” nativeMethod“:false},{” methodName“:” handleRequestMessage“ ,“ fileName”:“ ServiceActivatingHandler.java”,“ lineNumber”:89,“ className”:“ org.springframework.integration.handler.ServiceActivatingHandler”,“ nativeMethod”:false},{“ methodName”:“ handleMessageInternal”,“ fileName“:” AbstractReplyProducingMessageHandler.java“,” lineNumber“:109,” className“:” org.springframework.integration.handler.AbstractReplyProducingMessageHandler“,” nativeMethod“:false},{” methodName“:” handleMessage“,” fileName“ :“ AbstractMessageHandler.java”,“ lineNumber”:127,“ className”:“ org.springframework.integration.handler.AbstractMessageHandler”,“ nativeMethod”:false},{“ methodName” :“ doDispatch”,“ fileName”:“ UnicastingDispatcher.java”,“ lineNumber”:160,“ className”:“ org.springframework.integration.dispatcher.UnicastingDispatcher”,“ nativeMethod”:false},{“ methodName”:“ dispatch“,” fileName“:” UnicastingDispatcher.java“,” lineNumber“:121,” className“:” org.springframework.integration.dispatcher.UnicastingDispatcher“,” nativeMethod“:false},{” methodName“:” doSend“ ,“ fileName”:“ AbstractSubscribableChannel.java”,“ lineNumber”:89,“ className”:“ org.springframework.integration.channel.AbstractSubscribableChannel”,“ nativeMethod”:false},{“ methodName”:“ send”,“ fileName“:” AbstractMessageChannel.java“,” lineNumber“:423,” className“:” org.springframework.integration.channel.AbstractMessageChannel“,” nativeMethod“:false},{” methodName“:” send“,” fileName“ ::“ AbstractMessageChannel.java”,“ lineNumber”:373,“ className”:“ org.springframework.integration.channel.AbstractMessageChannel”,“ nativeMethod”:false},{“ methodName”:“ doSend”,“ fileName”:“ GenericMessagingTemplate.java“,” lineNumber“:115,” className“:” org.spri ngframework.messaging.core.GenericMessagingTemplate“,” nativeMethod“:false},{” methodName“:” doSend“,” fileName“:” GenericMessagingTemplate.java“,” lineNumber“:45,” className“:” org.springframework。 messages.core.GenericMessagingTemplate“,” nativeMethod“:false},{” methodName“:”发送“,” fileName“:” AbstractMessageSendingTemplate.java“,” lineNumber“:105,” className“:” org.springframework.messaging。 core.AbstractMessageSendingTemplate“,” nativeMethod“:false},{” methodName“:” sendMessage“,” fileName“:” MessageProducerSupport.java“,” lineNumber“:188,” className“:” org.springframework.integration.endpoint。 MessageProducerSupport“,” nativeMethod“:false},{” methodName“:” access $ 1100“,” fileName“:” AmqpInboundChannelAdapter.java“,” lineNumber“:56,” className“:” org.springframework.integration.amqp.inbound .AmqpInboundChannelAdapter“,” nativeMethod“:false},{” methodName“:” processMessage“,” fileName“:” AmqpInboundChannelAdapter.java“,” lineNumber“:246,” className“:” org.springframework.integration.amqp.inbound .AmqpInboundChannelAdapter $ L istener“,” nativeMethod“:false},{” methodName“:” onMessage“,” fileName“:” AmqpInboundChannelAdapter.java“,” lineNumber“:203,” className“:” org.springframework.integration.amqp.inbound。 AmqpInboundChannelAdapter $ Listener“,” nativeMethod“:false},{” methodName“:” doInvokeListener“,” fileName“:” AbstractMessageListenerContainer.java“,” lineNumber“:822,” className“:” org.springframework.amqp.rabbit。 listener.AbstractMessageListenerContainer“,” nativeMethod“:false},{” methodName“:” invokeListener“,” fileName“:” AbstractMessageListenerContainer.java“,” lineNumber“:745,” className“:” org.springframework.amqp.rabbit。 listener.AbstractMessageListenerContainer“,” nativeMethod“:false},{” methodName“:” access $ 001“,” fileName“:” SimpleMessageListenerContainer.java“,” lineNumber“:97,” className“:” org.springframework.amqp.rabbit .listener.SimpleMessageListenerContainer“,” nativeMethod“:false},{” methodName“:” invokeListener“,” fileName“:” SimpleMessageListenerContainer.java“,” lineNumber“:189,” className“:” org.springframework.amqp.rabbit 。清单 ener.SimpleMessageListenerContainer $ 1“,” nativeMethod“:false},{” methodName“:” invoke“,” fileName“:null,” lineNumber“:-1,” className“:” sun.reflect.GeneratedMethodAccessor112“,” nativeMethod“ :false},{“ methodName”:“ invoke”,“ fileName”:“ DelegatingMethodAccessorImpl.java”,“ lineNumber”:43,“ className”:“ sun.reflect.DelegatingMethodAccessorImpl”,“ nativeMethod”:false},{“ methodName“:”调用“,” fileName“:” Method.java“,” lineNumber“:498,” className“:” java.lang.reflect.Method“,” nativeMethod“:false},{” methodName“:” invokeJoinpointUsingReflection“,” fileName“:” AopUtils.java“,” lineNumber“:333,” className“:” org.springframework.aop.support.AopUtils“,” nativeMethod“:false},{” methodName“:” invokeJoinpoint“ ,“ fileName”:“ ReflectiveMethodInvocation.java”,“ lineNumber”:190,“ className”:“ org.springframework.aop.framework.ReflectiveMethodInvocation”,“ nativeMethod”:false},{“ methodName”:“ proceded”,“ fileName“:” ReflectiveMethodInvocation.java“,” lineNumber“:157,” className“:” org.springframework.aop.framework.ReflectiveMethodInvocation“, “ nativeMethod”:false},{“ methodName”:“ doWithRetry”,“ fileName”:“ StatefulRetryOperationsInterceptor.java”,“ lineNumber”:229,“ className”:“ org.springframework.retry.interceptor.StatefulRetryOperationsInterceptor $ MethodInvocationRetryCallback”, “ nativeMethod”:false},{“ methodName”:“ doExecute”,“ fileName”:“ RetryTemplate.java”,“ lineNumber”:286,“ className”:“ org.springframework.retry.support.RetryTemplate”,“ nativeMethod “:false},{” methodName“:” execute“,” fileName“:” RetryTemplate.java“,” lineNumber“:210,” className“:” org.springframework.retry.support.RetryTemplate“,” nativeMethod“: false},{“ methodName”:“ invoke”,“ fileName”:“ StatefulRetryOperationsInterceptor.java”,“ lineNumber”:173,“ className”:“ org.springframework.retry.interceptor.StatefulRetryOperationsInterceptor”,“ nativeMethod”:false} ,{“ methodName”:“ proceded”,“ fileName”:“ ReflectiveMethodInvocation.java”,“ lineNumber”:179,“ className”:“ org.springframework.aop.framework.ReflectiveMethodInvocation”,“ nativeMethod”:false},{ “ methodName”:“调用”,“ fileName”:“ JdkDy namicAopProxy.java“,” lineNumber“:213,” className“:” org.springframework.aop.framework.JdkDynamicAopProxy“,” nativeMethod“:false},{” methodName“:” invokeListener“,” fileName“:null,” lineNumber“:-1,” className“:” com.sun.proxy。$ Proxy137“,” nativeMethod“:false},{” methodName“:” invokeListener“,” fileName“:” SimpleMessageListenerContainer.java“,” lineNumber“ :1276,“ className”:“ org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer”,“ nativeMethod”:false},{“ methodName”:“ executeListener”,“ fileName”:“ AbstractMessageListenerContainer.java”,“ lineNumber” :726,“ className”:“ org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer”,“ nativeMethod”:false},{“ methodName”:“ doReceiveAndExecute”,“ fileName”:“ SimpleMessageListenerContainer.java”,“ lineNumber” :1219,“ className”:“ org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer”,“ nativeMethod”:false},{“ methodName”:“ receiveAndExecute”,“ fileName”:“ SimpleMessageListenerContainer.java”,“ lineNumber” :1189,“ className”:“ org.spring framework.amqp.rabbit.listener.SimpleMessageListenerContainer“,” nativeMethod“:false},{” methodName“:” access $ 1500“,” fileName“:” SimpleMessageListenerContainer.java“,” lineNumber“:97,” className“:” org .springframework.amqp.rabbit.listener.SimpleMessageListenerContainer“,” nativeMethod“:false},{” methodName“:” run“,” fileName“:” SimpleMessageListenerContainer.java“,” lineNumber“:1421,” className“:” org .springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer“,” nativeMethod“:false},{” methodName“:” run“,” fileName“:” Thread.java“,” lineNumber“:748,” className“: “ java.lang.Thread”,“ nativeMethod”:false}],“ lockedMonitors”:[{“ className”:“ org.postgresql.core.v3.QueryExecutorImpl”,“ identityHashCode”:1428002949,“ lockedStackDepth”:9, “ lockedStackFrame”:{“ methodName”:“ execute”,“ fileName”:“ QueryExecutorImpl.java”,“ lineNumber”:288,“ className”:“ org.postgresql.core.v3.QueryExecutorImpl”,“ nativeMethod”:false }}],“ lockedSynchronizers”:[{“ className”:“ java.util.concurrent.locks.Reentran tReadWriteLock $ NonfairSync“,” identityHashCode“:1110565932}],” lockInfo“:null}

目前尚不清楚为什么会看到这种行为。 在大多数情况下(以我的经验),此类问题是由用户代码中的侦听器线程“卡住”引起的。 使用者线程不可能以这种方式“空闲”。 而且无论如何,它不会在15分钟后重新启动。

下一步(对我来说)将是执行线程转储以查看线程在做什么。 如果您不能使用jstack或VisualVM,则Boot提供了/dump端点来执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM