Printemps JMS auditeur-conteneur de la simultanéité de l'attribut ne fonctionne pas

Salut, je suis en train d'apprendre le Printemps JMS avec ActiveMQ.
Dans mon exemple de scénario est Producteur application envoie autour de 50 messages dans la file d'attente, et quand je lance le Consommateur de l'application, il commence à consommer de ces messages.

Maintenant, je veux de plusieurs threads consommateurs à consommer les messages de la file d'attente.
Je suis à l'aide de JMS auditeur-conteneur. Quand j'ai cherché sur google que j'ai trouvé il y a un simultanéité attribut.

Selon Printemps JMS doc simultanéité attribut spécifie

Le nombre de sessions simultanées/consommateurs de départ pour chaque auditeur. Peut être un simple numéro indiquant le nombre maximum (par exemple, "5") ou une plage en indiquant la partie inférieure ainsi que la limite supérieure (par exemple, "3-5"). Note qu'un minimum spécifié est juste une indication et peuvent être ignorées lors de l'exécution. Valeur par défaut est 1; garder la simultanéité limitée à 1 dans le cas d'un sujet auditeur ou si la file d'attente de l'ordre est important; envisager d'augmenter il pour généraux les files d'attente.

Mais dans ma configuration, je suis à la définition de cet attribut sur 5, mais il semble qu'il ne parvient pas à démarrer 5 simultanées auditeurs.

De Configuration pour l'auditeur:

consumer-applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jms="http://www.springframework.org/schema/jms"

    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/jms
    http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">

    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="tcp://localhost:61616" />

    <bean id="listener" class="com.jms.example.MyMessageListener"></bean>

    <jms:listener-container container-type="default" concurrency="5"
        connection-factory="connectionFactory">
        <jms:listener destination="MyQueue" ref="listener"
            method="onMessage"></jms:listener>
    </jms:listener-container>

</beans>

Et Si j'ai utilisé des haricots DefaultMessageListenerContainer au lieu de jms:écouteur-conteneur avec des propriétés:

<bean id="msgListenerContainer" 
        class="org.springframework.jms.listener.DefaultMessageListenerContainer"
        p:connectionFactory-ref="connectionFactory"
        p:destination-ref="destination"
        p:messageListener-ref="listener"
        p:concurrentConsumers="10"
        p:maxConcurrentConsumers="50" />

Puis dans ActiveMQ console j'ai pu voir 10 pour les consommateurs, mais dans la réalité, il commence à 3 consommateurs simultanément ou parfois 6 ou 1 seul consommateur.

EDIT:

Code de la consommation:

public class MyMessageListener implements MessageListener{


    public void onMessage(Message m) {
        TextMessage message=(TextMessage)m;
        try{
            System.out.println("Start = " + message.getText());
            Thread.sleep(5000);
            System.out.println("End = " + message.getText());
        }catch (Exception e) {e.printStackTrace();  }
    }
}

Je suis d'impression consommé des messages sur la console dont la sortie est expliqué dans les scénarios ci-dessous:

OBSERVATION:

J'ai remarqué que le comportement bizarre.
Mon producteur et le consommateur sont deux applications indépendantes.

Scénario 1:

  1. Je commence producteur et envoyer des messages(entre-temps, le consommateur n'est PAS en cours d'exécution)
  2. Puis-je commencer consommateurs à consommer des messages.

Ici problème est qu'il ne prend pas en charge tous les 10 consommateurs. Parfois, il charge 3 OU 1.

Start = hello jms 1 //consumer 1 started 
Start = hello jms 2 //consumer 2 started 
Start = hello jms 3 //consumer 3 started 
End = hello jms 1  // consumer 1 ended
Start = hello jms 4 //consumer 4 started and hence always 3 consumers and not 10
End = hello jms 2
Start = hello jms 5
End = hello jms 3
Start = hello jms 6

Scénario 2:

  1. Je commence producteur et envoyer des messages(entre-temps, la consommation est en cours d'exécution)
  2. Car le consommateur est en cours d'exécution, il commence à consommer.

De sorte qu'il ne charge tous les 5 consommateurs correctement comme prévu. donc la sortie est:

Start = hello jms 1 //consumer 1 started 
Start = hello jms 2 //consumer 2 started 
Start = hello jms 3 //consumer 3 started 
Start = hello jms 4 //consumer 4 started 
Start = hello jms 5 //consumer 5 started 
Start = hello jms 6 //consumer 6 started 
Start = hello jms 7 //consumer 7 started 
Start = hello jms 8 //consumer 8 started 
Start = hello jms 9 //consumer 9 started 
Start = hello jms 10 //consumer 10 started. Hence all them started at same time as expected.
End = hello jms 1
Start = hello jms 11
End = hello jms 2
Start = hello jms 12
End = hello jms 3
Start = hello jms 13

Pourquoi est-ce qui se passe. Il est vraiment à manger mon cerveau.
Je ne veux pas garder les consommateurs à être en cours d'exécution pour toujours. Je veux garder les deux détaché.

S'il vous plaît aider.

  • Qu'entendez-vous par "en réalité, il commence à 3 consommateurs simultanément" ? Si vous pouvez voir 10 consommateurs dans AMQ console, alors vous avez 10 consommateurs. Essayez de lui donner charge stable au fil du temps et vous remarquerez que tous les 10 permettront aux consommateurs d'avoir la charge.
  • Je vais mettre à jour ma question d'apporter de la clarté.
  • veuillez voir mon edit. Je veux dire, dans mon code de la consommation j'ai imprimé le texte du message reçu. Donc, à partir de la sortie on dirait qu'il a commencé à 3 consommateurs simultanément et non pas 10.
  • veuillez voir mes observations dans la question ci-dessus. J'ai mis à jour ma question.
  • si vous spécifiez un seul numéro, cela signifie un "maximum" de nombre de consommateurs sera lancé. Ce qui signifie toujours moins de "maximum" est lancé, à moins que le Printemps JMS pense qu'il a besoin de plus. Essayez de spécifier une plage avec une valeur minimale et donnez à vos consommateurs une charge stable (pas de 50 messages). Et vous verrez tous les consommateurs à travailler jusqu'à la limite fixée.
  • Par le terme constant de charge de vous dire que je devrait augmenter le nombre de messages et de préciser une plage pour les consommateurs. Droit ?
  • Il suffit de commencer votre programme des consommateurs et de démarrer votre producteur pour produire des messages dans une boucle infinie, aussi vite que possible. Vous verrez tous vos consommateurs.
  • Oui de cette façon que je peux voir. Mais des consommateurs et des producteurs sont 2 applications indépendantes. Les consommateurs peuvent ne pas être disponibles au même moment où le producteur envoie des messages.
  • Et Si j'ai d'abord commencer producteur et envoyer des messages et ensuite commencer à la consommation, je peux le voir, il est à peine consommer avec 3 fils maximum et non 5
  • Eh bien.. DMLC est construit pour s'adapter à une charge donnée avec un algorithme. Je ne vois pas le problème. Ainsi, DMLC n'est pas vraiment construit à l'échelle ainsi avec start/stop comportement. Plutôt, il est généralement maintenu en marche avec une quantité donnée de max les consommateurs. Si vous voulez faire des réglages détaillés sur ce, envisager de mettre en œuvre votre propre message à l'auditeur et le filetage, ou d'étendre DMLC
  • Vos consommateurs peuvent être pré-chargement de nombreux messages à ceux de la file d'attente. Les réponses à cette question pourrait être utile: stackoverflow.com/questions/12583161/...
  • Mais je ne suis pas la fixation de l' prefetch l'attribut de l'auditeur-conteneur
  • Russell pouvez-vous donner quelques suggestions à ce sujet ? J'ai posté ma solution ci-dessous. Mais je veux juste savoir est-ce la bonne manière de procéder ?