Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre régulier
    Inscrit en
    juillet 2007
    Messages
    355
    Détails du profil
    Informations forums :
    Inscription : juillet 2007
    Messages : 355
    Points : 87
    Points
    87

    Par défaut AOP Dans un block try catch

    Bonjour,

    J'ai plusieurs méthodes qui redéfinisse onMessage de la classe javax.jms.MessageListener

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    public void onMessage(Message msg) {
          TextMessage message = (TextMessage) msg;
          int JMSXDeliveryCount = 0;
     
            try {
     
          	JMSXDeliveryCount = message.getIntProperty("JMSXDeliveryCount");
    	//ici méthode qui traite le message
    	}
           catch (Exception e) {
               //j'aimerai injecter le code sql ici pour insérer en base le message
               //mais uniquement si le nombre de tentative est supérieur à N.
            }
    J'ai un block try catch (Exception e) dans chaque méthode onMessage.

    J'aimerai injecter un bout de code avec l'aop dans le block Exception.

    Dans cette méthode, si au bout de n tentatives, le message n'a pas pu être traité, je dois insérer en base le message et le consommer pour éviter de bloquer la file.

    J'aimerai le faire en AOP, comment faire ? je n'arrive pas à voir comment ?

    Juste pour info, c'est pas au niveau de la mise en place de l'AOP qui me gène pb, mais plus au niveau du pointcut, je ne sais pas comment faire pour lui indiquer que c'est au niveau du catch

    merci d'avance.

  2. #2
    Membre régulier
    Inscrit en
    juillet 2007
    Messages
    355
    Détails du profil
    Informations forums :
    Inscription : juillet 2007
    Messages : 355
    Points : 87
    Points
    87

    Par défaut

    en fait, j'ai modifié mon code en ajoutant un throw Exception dans la signature de la méthode onMessage.

    ça fonctionne bien pour le moment.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @MessageDriven(name = "ServiceMetier", messageListenerInterface = MessageListener.class, activationConfig = {
    	@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    	@ActivationConfigProperty(propertyName = "destinationName", propertyValue = "jms/nomQueue) })
    public class ServiceMetier{
    	@Resource
    	private MessageDrivenContext context;
     
    	public MessageDrivenContext getContext() {
    		return this.context;
    	}
     
     
    	public void onMessage(Message message) throws Exception {
                        JaxbService.unmarshall() etc...
     
    	}
    }
    Ensuite dans mon code AOP, dans la méthode afterThrowingMethod, je récupère bien le message et le contexte.

    Or ce que j'aimerai aussi (en plus de l'enregistrement en base du message, c'est consommer le message... et j'ai utilisé context.getUserTransaction().commit, mais j'obtiens une erreur :
    Code :
    1
    2
     
    Method Not Allowed Exception: See Message-drive Bean Component Contract section of the applicable EJB Specification.
    .

    Sauriez-vous comment faire pour consommer ce message et qu'il ne soit plus dans la file d'attente.

    Pour info, j'injecte un message bidon "ex toto" pour obtenir une exception et ainsi enregistrer ce message en base. Mais mon problème est la consommation du message. Je ne veux plus qu'il apparaisse dans la file d'attente.

    Merci d'avance.

  3. #3
    Membre régulier
    Inscrit en
    juillet 2007
    Messages
    355
    Détails du profil
    Informations forums :
    Inscription : juillet 2007
    Messages : 355
    Points : 87
    Points
    87

    Par défaut

    finalement, j'ai rajouté un try catch dans la méthode onMessage.

    Puis dans l'aop, je teste si j'ai une exception, si oui, j'enregistre en base.

    et à la fin le commit est effectué automatiquement et le message est donc consommé.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •