Obtenir un simple client Spring JMS reconnaître pour travailler
Juste de commencer à obtenir ma tête autour de l'obtention de JMS ActiveMQ Acknowledgements
de travail au Printemps. Pour l'instant j'ai un consommateur fonctionne parfaitement, sauf que je n'ai pas d'accuser réception du message, il est toujours pris à partir de la file d'attente (j'attends qu'il y séjourner ou à la fin dans une lettre morte de la file d'attente).
<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">
<!-- A JMS connection factory for ActiveMQ -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"
p:brokerURL="failover://(tcp://jms1:61616,tcp://jms2:61616)?randomize=false&jms.redeliveryPolicy.maximumRedeliveries=5" />
<!-- A POJO that implements the JMS message listener -->
<bean id="simpleMessageListener" class="com.company.ConsumerClass" />
<!-- A JMS namespace aware Spring configuration for the message listener container -->
<jms:listener-container
container-type="default"
connection-factory="connectionFactory"
acknowledge="client"
concurrency="10-50"
cache="consumer">
<jms:listener destination="someQueue" ref="simpleMessageListener" method="onMessage" />
</jms:listener-container>
</beans>
Dans le ConsumerClass, mon simple consommateur ressemble à quelque chose comme ceci:
@Override public final void onMessage(Message message) {
Object postedMessage = null;
try {
postedMessage = ((ObjectMessage) message).getObject();
if (postedMessage.getClass() == SomeMessageType.class) {
try {
//Some logic here
message.acknowledge();
return; //Success Here
} catch (MyException e) {
logger.error("Could not process message, but as I didn't call acknowledge I expect it to end up in the dead message queue");
}
}
} catch (JMSException e) {
logger.error("Error occurred pulling Message from Queue", e);
}
//Also worth noting, if I throw new RuntimeException("Aww Noos"); here then it won't take it from the queue, but it won't get consumed (or end up as dead letter)...
}
source d'informationauteur Scotty OB
Vous devez vous connecter pour publier un commentaire.
De lire cette documentation: Printemps JMS conteneur ne pas utiliser le
message.acknowledge()
L'auditeur conteneur propose le message suivant accusé de réception options:
J'ai trouvé la réponse à http://ourcraft.wordpress.com/2008/07/21/simple-jms-transaction-rollbacks-work/
Il semble qu'il fonctionne bien si vous modifiez reconnaissez="traitées" et assurez-vous de throw new RuntimeException("le Message n'a pas pu être consommés. Rouleau de transaction"); à la fin de la OnMessage() de la routine.
Encore aucune idée de ce que reconnaissent="client" réalise bien que
Aujourd'hui, le Printemps offre une bonne wrapper sur la plaine
JMS
message auditeurs.Voir la documentation Javadoc de AbstractMessageListenerContainer.
Donc, lorsque vous définissez un @JmsListener méthode, l'accusé de réception est envoyé automatiquement lorsqu'elle est terminée, mais vous pouvez jeter une exception pour le message de nouveau.
Dans ma pratique de client de l'accusé de réception que rarement, voire jamais utilisé. L'installation par défaut est auto reconnaissez donc, si votre code renvoie de onMessage() normalement (w/o exception), le message est automatiquement reconnu. Si votre code throws exception de onMessage() il n'y a pas d'accusé de réception de message et généralement re-livré pré-configuré nombre de fois, après quoi il serait généralement être mis au rebut ou le mettre dans un cul de file d'attente de messages.
Dans votre cas, du serveur JMS point de vue, il ressemble à la cliente demande de message, mais n'a jamais reconnu de sorte qu'il est toujours "en cours de traitement" par le client. Dans ce cas, le message serait invisible pour les autres consommateurs sur la même File d'attente de sorte que vous pourriez avoir l'impression que le message a été "prendre de la file d'attente', tout comme la question de fait, il est toujours là. Évidemment, vous ne verrez pas ce message dans les messages de la file d'attente.
Je vous suggère de lire JMS spécification pour obtenir une compréhension claire des différentes modes de reconnaissance.
Utilisez le code suivant fonctionne.
Appel reconnaître() la méthode des messages dans votre consommation.
Pour plus de détails, reportez-vous cet article
Également Vérifier cet article Sun Java System Message Queue 4.3 Guide du Développeur pour les Clients Java