2017-10-04 8 views
-1

Dans une webapp, nous avons la gestion des transactions en utilisant intercepteurs struts2intercepteurs Struts2 (après Voir Rendus Interceptor) n'est pas appelé avant que la demande de redirection revient du navigateur

code pseudo de l'intercepteur

public String intercept(ActionInvocation invocation) throws Exception { 
    TransactionService.startTransaction(); 
    invocation.invoke(); 
    TransactionService.commitTransaction(); 
} 

lorsque la action renvoie 'redirect' (302), parfois la requête redirigée arrive sur le serveur avant que 'TransactionService.commitTransaction()' soit appelée. (Qui ressemble à l'appel réseau est plus rapide que la pile déroulage)

ci-dessous un message de journal capturé explique ce

2017-10-04 09:18:37,693 [task-37] DEBUG (interceptors) TransactionInterceptor begin 
2017-10-04 09:18:37,949 [task-38] DEBUG (interceptors) TransactionInterceptor begin 
2017-10-04 09:18:37,963 [task-37] DEBUG (interceptors) TransactionInterceptor commit 
2017-10-04 09:18:37,955 [task-38] ERROR (interceptors) SecurityInterceptor: Failed to execute Action: 

dans ce qui précède log Task-37 (fil) suppose pour sauvegarder/mettre à jour des enregistrements dans DB et d'émettre un rediriger pour actualiser la vue, son intercepteur va valider la transaction. Mais le thread de redirection (tâche - 38) a atteint le serveur avant que la validation ne se produise.

Je regarde PreResultListener ou 'Chain Result'. (les deux options ont leurs propres problèmes) J'apprécie grandement toute entrée pour résoudre ce problème

Merci d'avance.

+0

vous ne devriez pas écrire votre propre intercepteur, si vous ne le pouvez pas. –

+0

son peu vieux code, donc je ne peux pas faire beaucoup là – user1919511

+0

vous ne pouvez rien faire avec ce code parce que ce code ne fonctionne pas –

Répondre

0

Voici un code de travail, un type a travaillé avec PreResultListener.

public String intercept(ActionInvocation invocation) throws Exception { 
    invocation.addPreResultListener(new PreResultListener() { 
     @Override 
     public void beforeResult(ActionInvocation invocation, String resultCode) { 
      try { 

       // commit based on the resultCode comparision 
       if (StringUtils.equals(resultCode,"302_redirect") { 
        TransactionService.commitTransaction(); 
       } 
       // or commparision based on the redirect handler 
       // Class names are from struts-default.xml 
       /* 
       String resultConfigClassName = invocation.getProxy().getConfig().getResults().get(resultCode).getClassName(); 
       if (StringUtils.equals(resultConfigClassName,"org.apache.struts2.dispatcher.ServletRedirectResult") 
         || StringUtils.equals(resultConfigClassName, "org.apache.struts2.dispatcher.ServletActionRedirectResult")) { 
        TransactionService.commitTransaction(); 
       } 
       */ 
      } 
      catch (Exception e) { 
       // Ignore don't do anything 
      } 
     } 
    }); 

    TransactionService.startTransaction(); 
    invocation.invoke(); 
    TransactionService.commitTransaction(); 
}