Sommario

Introduzione

Prerequisiti

Requisiti

Componenti usati

Premesse

Problema

Risoluzione

Introduzione

In questo documento viene descritta la procedura per risolvere i problemi relativi alla pulizia della coda degli heartbeat AMQP (Advanced Message Queuing Protocol)

Ha contribuito Aswathi Surendran, Gustavo Bell Cisco TAC Engineers.

Prerequisiti

Requisiti

Cisco raccomanda la conoscenza dei seguenti argomenti:

- Interfaccia Linux

- Ambienti di macchine virtuali

- Coniglio

Componenti usati

Le informazioni di questo documento si basano sulle seguenti versioni software:

- CloudCenter versione 4.3.x - 4.6.x

- Bus messaggi CloudCenter (RabbitMQ_Server)

Le informazioni discusse in questo documento fanno riferimento a dispositivi usati in uno specifico ambiente di emulazione. Su tutti i dispositivi menzionati nel documento la configurazione è stata ripristinata ai valori predefiniti. Se la rete è operativa, valutare attentamente eventuali conseguenze derivanti dall'uso dei comandi.

Premesse

La dimensione del thread attivo del pool è 64, dove i thread inviati corrispondenti ai processi erano più di 3000, che verranno rifiutati in quanto il codice non può gestire più di 64 thread alla volta, quindi attenderà il completamento dell'attività precedente ed eseguirà l'altra attività.

Qualsiasi attività superiore a quella che può essere utilizzata da un pool di thread verrà rifiutata.

Problema

il file filecliqr-connection.log si trova in /usr/local/tomcatgua/logs/ segnala l'errore:

Caused by: org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@6737f4fb[Running, pool size = 64, active threads = 64, queued tasks = 3000, completed tasks = 413]] did not accept task: org.springframework.aop.interceptor.AsyncExecutionInterceptor$1@6b0517b3

at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.submit(ThreadPoolTaskExecutor.java:284)

at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.doSubmit(AsyncExecutionAspectSupport.java:186)

at org.springframework.aop.interceptor.AsyncExecutionInterceptor.invoke(AsyncExecutionInterceptor.java:123)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)

at com.sun.proxy.$Proxy84.processMessage(Unknown Source)

at com.osmosix.commons.messaging.listeners.impl.DefaultNodeMessageListener.handleMessage(DefaultNodeMessageListener.java:35)

at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:269)

at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:383)

... 12 more

Caused by: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@3911a213 rejected from java.util.concurrent.ThreadPoolExecutor@6737f4fb[Running, pool size = 64, active threads = 64, queued tasks = 3000, completed tasks = 413]

at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)

at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)

at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)

at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)

at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.submit(ThreadPoolTaskExecutor.java:281)

... 23 more

2016-10-19 02:32:32,205 INFO annotation.RequestMappingHandlerMapping [localhost-startStop-1] - Mapped "{[/image/service/dltargetlocal],methods=[POST]}" onto public java.util.Map<java.lang.String, ?> com.osmosix.gateway.image.transform.ImageTransformController.downloadToTargetLocal(com.osmosix.commons.image.transform.DownloadImageFileRequest)

2016-10-19 02:32:32,206 WARN listener.ConditionalRejectingErrorHandler [SimpleAsyncTaskExecutor-1] - Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'handleMessage' threw exception

at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:391)

at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:294)

at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:757)

at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:680)

at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:93)

at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:183)

at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1352)

at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:661)

at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1096)

at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1080)

at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$800(SimpleMessageListenerContainer.java:93)

at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1197)

at java.lang.Thread.run(Thread.java:745)

Risoluzione

Passaggio 1.  Accedere al server RabbitMQ tramite SSH.

Passaggio 2. Passare all'utente root.

# sudo -i

Passaggio 3. Abilitare il plugin di gestione.

# rabbitmq-plugins enable rabbitmq_management

Passaggio 4. Abilitare l'accesso al comando rabbitmqadmin.

# chmod +x `find /var/lib/rabbitmq/ -name "rabbitmqadmin"`

# ln -s `find /var/lib/rabbitmq/ -name "rabbitmqadmin"` /usr/sbin

Passaggio 5. È possibile accedere a RabbitMQ tramite GUI.

http://

:15672 (username=cliqr password=cliqr)

Nota: Sostituire RabbitMQ_Server_IP nella configurazione con l'indirizzo del server RabbitMQ

Spostarsi nella scheda code per visualizzare i dettagli

o

CLI:

# rabbitmqadmin -V /cliqr -u cliqr -p cliqr list queues

# rabbitmqadmin -V /cliqr -u cliqr -p cliqr list exchanges

# rabbitmqadmin -V /cliqr -u cliqr -p cliqr list channels

Passaggio 6. Per eliminare la coda heartbeat del gateway.

#rabbitmqadmin -V /cliqr delete queue name=cliqr.gateway.heartbeat.queue --username=cliqr --password=cliqr

Passaggio 7.  Riavviare il servizio Tomcat in RabbitServer.

#/etc/init.d/tomcatgua stop

#/etc/init.d/tomcatgua start

Nota: se cliqr.gateway.heartbeat.queue risulta mancante, riavviare il servizio CCO tomcat attenendosi alla procedura seguente:

Passaggio 8.  Accedere al server CCO tramite SSH.

Passaggio 9. Passare all'utente root.

# sudo -i

Passaggio 10. Riavviare il server Tomcat.

#/etc/init.d/tomcat stop

#/etc/init.d/tomcat start