We apologize for untranslated text, you can use the Google Translation button to get an automatic translation of the web page in the language of your choice.

JcmsToastr dans un contexte de thread

Thomas LEGAT · on 6/21/20 at 11:41 PM

Bonjour,

Je pense rencontrer une limitation d'utilisation de Toastr dans le contexte JPlatform.

J'effectue un traitement pouvant être long dans un Thread. J'aimerai à la fin de ce traitement lancé un Toastr permettant de prévenir l'utilisateur.

Malheureusement je rencontre un exception produit.

J'essaye de lancer le Toastr avec addToastr ou addToastrSession mais j'ai toujours la même problématique.

Je rencontre cette exception:

Exception in thread "Thread-18" java.lang.NullPointerException
at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1555)
at org.apache.catalina.connector.Request.setAttribute(Request.java:1541)
at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:540)
at com.jalios.jcms.context.JcmsContext.updateToastrCollection(JcmsContext.java:1145)
at com.jalios.jcms.context.JcmsContext.addToastr(JcmsContext.java:1266)
at ......ImportThread.run(ImportThread.java:50)
at java.lang.Thread.run(Thread.java:748)

J'ai essayé de passer en paramètre de mon Thread:

  • le context
  • la request

, mais rien en change.

Savez-vous si nous pouvons utiliser cette fonctionnalité d'un contexte de Thread?

Merci d'avance,

4 pts
Kevin Bransard · on 6/22/20 at 2:30 PM

Vous pouvez passer la request ou la response à votre thread pour agir sur elles.

0 pts
Thomas LEGAT · on 6/22/20 at 3:51 PM

Bonjour @Kevin Bransard ,

C'est justement ce qui a été fais pensant au début que ma request était null donc ce n'est plus le cas. J'ai pu le vérifier

Une autre idée?

Merci d'avance,

#1

Malgré le fait de passer la request, vous avez toujours l'exception ? Dans le code que je peux lire il n'y a que la request justement qui peut planter une NPE. 

Si vous avez un exemple de code je suis preneur.

Par ailleurs, le toastr n'est pas en direct, il faudra attendre qu'une requête ajax soit jouée quelque part sur le site pour que l'utilisateur puisse voir le toastr affiché. Une autre approche est d'envoyer une alerte à l'utilisateur quand son traitement est fini.

Kevin Bransard · on 6/22/20 at 4:06 PM
#2
public class ImportThread implements Runnable {
private Workspace workspaceImport;
private String path;
private Category categoryImport;
private Class clazz;
private HttpServletRequest request;
private JcmsContext jcmsContext;

private static Logger logger = Logger.getLogger(ImportThread.class);

public ImportThread(Workspace workspaceImport, String path, Category categoryImport, Class clazz, JcmsContext jcmsContext, HttpServletRequest request) {
this.workspaceImport = workspaceImport;
this.path = path;
this.categoryImport = categoryImport;
this.clazz = clazz;
this.jcmsContext = jcmsContext;
this.request = request;
}

@Override
public void run() {
ImportManager mgr = ImportManager.getInstance();
mgr.execute(workspaceImport, path, categoryImport, clazz);
logger.info("Fin de la reprise");

logger.debug("request: " +request);
logger.debug("request is null: " +Util.isEmpty(request));
logger.debug("jcmsContext: " +jcmsContext));
logger.debug("jcmsContext is null: " +Util.isEmpty(jcmsContext));


Map<String, String> toastrOptionMap = new HashMap<String, String>();
toastrOptionMap.put("showDuration", "1000");
jcmsContext.addToastr(request, new JcmsToastr("Import terminé").setOptionMap(toastrOptionMap));
}

}

 

Voilà les information de logs :

[ImportThread] - request: org.apache.catalina.connector.RequestFacade@7e38f6b4
[ImportThread] - request is null: false
[ImportThread] - jcmsContext: com.jalios.jcms.context.JcmsJspContext@5ddefa26
[ImportThread] - jcmsContext is null: false

J'appelle mon Thread de cette façon à partir d'un Handler custom :

Thread t = new Thread(new ImportThread(workspaceImport, path, categoryImport, clazz, Channel.getChannel().getCurrentJcmsContext(), request));
t.start();

 

Fonctionnellement il sera plus judicieux je pense d'envoyer un alerte avec le système d'AlertBuilder que d'envoyer un Toastr. D'autant plus que je viens de tester et l'alerte est quand à elle bien envoyée 😉

Thomas

Thomas LEGAT · on 6/22/20 at 4:29 PM
0 pts