Question

J'essaie d'implémenter des tests de performance sur ActiveMQ. Par conséquent, vous devez configurer un producteur et un consommateur de base pour envoyer et recevoir des messages via une file d'attente. J'ai créé un producteur sans problème, lui demandant d'écrire un nombre spécifique de messages dans la file d'attente:

 for(int i = 0; i < numberOfMessages; i++){
                try{
                    String message = generateText(sizeOfMessage);
                    produceMessage(message);
                }
                catch (Exception e) {
                    logger.error("Caught exception while sending message", e);
                }
            }

Cela continue sans problème et je l'ai confirmé avec des vérifications sur le site Web de l'administrateur, avec le nombre correct de messages en attente.

Le problème se produit lorsque j'essaie de recevoir les messages de la file d'attente. En utilisant un simple consommateur pour lire dans la file d'attente, il lira un nombre différent de messages dans la file d'attente, puis s'arrêtera lors de la tentative de réception de l'un des messages. Je peux voir qu'il y a encore des messages dans la file d'attente à lire, mais le client ne progressera pas avec l'un des messages. J'utilise une méthode simple pour recevoir les messages:

Message message = jmsTemplate.receive();

et cela fonctionne pour certains messages (environ 20 à 30) mais alors juste verrouillé. On m'a suggéré que certains caractères du message puissent être des caractères d'échappement (j'utilisais une chaîne aléatoire de longueur variable, car il s'agissait simplement d'un test de performance et non d'un contenu), j'ai donc modifié tous les messages. à la même chaîne, qui est une répétition du caractère '2' et toujours pas de chance. J'utilise la configuration de Spring pour charger tous les composants nécessaires pour accéder à la file d'attente ActiveMQ, et la file d'attente s'exécute sur mon hôte local.

Était-ce utile?

La solution

Pas beaucoup d’opinions sur ce sujet pour le moment, mais si vous rencontrez le même problème, j’ai trouvé la solution. La configuration pour activeMQ limite la quantité de mémoire utilisée par les expéditeurs et les destinataires avant de les ralentir. Les valeurs par défaut qui me sont attribuées sont les suivantes:

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

J'ai supprimé complètement cette configuration et cela fonctionne maintenant comme un rêve. Je fais des tests de performance, alors vous voudrez peut-être mettre vos propres contraintes, mais c’est définitivement la cause de mes problèmes!

Autres conseils

C’est un problème classique en matière de messagerie; que faire avec les consommateurs lents. Les dernières versions ActiveMQ de FWIW telles que la version 5.2 vous permettent d’en spouler sur le disque plutôt que de bloquer les producteurs lorsque la mémoire est insuffisante

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top