2010-05-24 2 views
1

Aujourd'hui, j'ai vu beaucoup d'erreurs sur mon ActiveMQ 5.3.2 console:Comment configurer ActiveMQ pour supprimer un consommateur s'il arrête simplement d'accepter des données?

INFO | Limite de mémoire du gestionnaire d'utilisation atteinte. Arrêt du producteur (ID: ...) au pour éviter les inondations topic: // mytopic. Voir http://activemq.apache.org/producer-flow-control.html pour plus d'informations (blocage pour: 3422ms)

Je l'ai fait un peu de fouiner, et a déterminé que l'abonné était sorti pour le déjeuner:

Proto Recv-Q Send-Q Local Address   Foreign Address   State  
tcp6  0 130320 10.208.87.178:61613  66.31.31.216:37951  ESTABLISHED 

Dans cette situation, Je ne veux pas que le producteur bloque; Je préférerais laisser tomber le client complètement. http://activemq.apache.org/slow-consumer-handling.html explique comment limiter le nombre de messages en file d'attente, ce qui est un bon début, mais ce n'est pas vraiment ce que je veux. http://activemq.apache.org/slow-consumers.html fait allusion à pouvoir laisser tomber un consommateur lent, mais n'explique pas comment on pourrait le faire. Donc, voici ma question: est-il possible de configurer ApacheMQ pour laisser tomber complètement les consommateurs lents, et comment puis-je le faire?

Répondre

0

Je ne peux pas vous donner une réponse sur la façon de déposer le client (en fait: je ne suis pas sûr qu'il est possible tous ensemble), mais ce que vous pouvez faire est d'ajouter une politique à ne pas bloquer le producteur:

« memoryLimit = » 10MB » producerFlowControl = « false »/>

de cette façon, votre producteur ne souffrira pas de consommateurs lents

1

J'éteindrais producerFlowControl pour les sujets que vous voulez ou tous comme ceci.:

<policyEntry topic=">" producerFlowControl="false"> 

Cela a la capacité de vous faire manquer de mémoire ou d'espace disque maintenant parce que la file d'attente des messages pourrait continuer à croître. Donc, assurez-vous de mettre en place une stratégie d'éviction et de la stratégie de limite de message en attente comme ceci:

<messageEvictionStrategy> 
    <oldestMessageEvictionStrategy/> 
</messageEvictionStrategy> 

<pendingMessageLimitStrategy> 
    <constantPendingMessageLimitStrategy limit="10"/> 
</pendingMessageLimitStrategy> 

Cela commencera jeter des messages après une limite de 10 a été atteint. Les messages les plus anciens seront jetés en premier.

1

AbortSlowConsumerStrategy qui a été amélioré dans Active MQ 5.9.0 devrait aider dans cet aspect. Je n'ai pas eu l'occasion de le tester à fond pour différentes configurations. Mais je pense que c'est ce que vous cherchez, en particulier ignoreIdleConsumers = true.

http://java.dzone.com/articles/coming-activemq-59-new-way

1

Vous pouvez configurer la propriété ci-dessous - « sendFailIfNoSpaceAfterTimeout » pour lancer erreur au producteur, au lieu de bloquer.

<systemUsage> 
<systemUsage sendFailIfNoSpaceAfterTimeout="3000"> 
      <memoryUsage> 
       <memoryUsage limit="256 mb"/> 
      </memoryUsage> 
</systemUsage> 
</systemUsage> 
Questions connexes