7 votes

Exécuter le code Java après le retour d'une méthode ?

J'ai un service web qui est basé sur des classes Java. Est-il possible d'exécuter du code après le retour d'un message d'accusé de réception dans une méthode Java de l'opération appelée ?

Pour mieux comprendre, voici le déroulement des opérations :

  1. Appeler une opération (méthode) spécifique de mon service web
  2. Début du traitement
  3. Envoi d'un ack que le traitement a été lancé (ceci est fait par une valeur de retour)
  4. Continuer le traitement

Les threads ne fonctionnent pas, puisque les threads doivent être terminés avant le retour de la méthode.

Quelqu'un a-t-il une idée de la manière de mettre en œuvre ce scénario ou une alternative ?

Merci d'avance.

4voto

Elias Vasylenko Points 731

Vous devrez utiliser Threads pour cela, car vous divisez le flux du programme en deux ; le chemin de retour et le chemin de traitement sont séparés et fonctionnent l'un à côté de l'autre.

Si vous avez besoin que l'accusé de réception du début de la méthode soit envoyé par le retour de la méthode, alors pourquoi vos méthodes de fourniture de services ne peuvent-elles pas être aussi simples que ceci ?

public Acknowledgement someService() {
  new Thread(new SomeServiceRunnable()).start();
  return new Acknowledgement();
}

Le service sera lancé, puis la méthode reviendra (notifiant ainsi que le processus a démarré) tandis que le traitement se poursuivra jusqu'à la fin du fil...

Est-ce que je rate quelque chose ici sur ce que vous devez atteindre ?

J'espère que cela vous aidera.

EDIT :

Il semble que certaines réponses aient été conçues pour répondre à des problèmes qui, selon moi, n'étaient pas présentés comme faisant partie de la question. Voici quelques hypothèses que j'ai formulées lors de l'élaboration de ma réponse, afin que toute personne lisant cette réponse puisse avoir une meilleure idée des cas où elle pourrait ne pas s'appliquer à sa situation particulière :

Ceci est pour une situation où vous voulez seulement reconnaître qu'un service a conceptuellement parlant commencé son exécution. L'accusé de réception ne peut donner aucune information sur le succès d'une partie de cette exécution ou de son initialisation, mais seulement sur le fait qu'elle a conceptuellement commencé, c'est-à-dire que la Runnable associée run() sera appelée à un moment donné.

Bien sûr, si vous voulez que l'exécution commence et que l'appelant revienne, alors la signification de l'accusé de réception sera nécessairement limitée par la quantité exacte de la tâche qui a attendu d'être exécutée avant de revenir, ici aucune attente n'est faite et l'accusé de réception est retourné immédiatement, et donc aucune information supplémentaire ne peut être donnée.

2voto

Sajan Chandran Points 4482

Pourquoi ne pas invoquer une méthode de rappel au client ? Voir le flux de travail

  1. Appeler une opération (méthode) spécifique de mon service web
  2. Début du traitement
  3. Appeler une méthode sur le client, en envoyant un accusé de réception.
  4. Continuer le traitement

1voto

m0skit0 Points 10269

Les threads ne fonctionnent pas, puisque les threads doivent être terminés avant le retour de la méthode. le retour de la méthode.

Faux. Les threads partagent des variables, et peuvent donc partager des données entre les threads sans avoir besoin de revenir du thread. Prenons votre exemple :

Appeler une opération (méthode) spécifique de mon service web

Créer un nouveau fil de discussion pour cela

Envoi d'un ack que le traitement a été lancé (ceci est fait par une valeur de retour)

Non, ne le faites pas par valeur de retour. Le nouveau thread envoie un message à la classe que vous voulez (appelle une méthode, change une variable...). Avec cela, vous pouvez signaler ce que vous voulez à n'importe quel thread. Faites juste attention aux conditions de course, et utilisez le mot clé "synchronized" quand c'est nécessaire !

Continuer le traitement

Le nouveau fil continue son traitement, tout comme le fil principal.

1voto

Gilthans Points 802

La réponse à votre problème est de créer un fil de discussion :

public boolean beginWorkAndSendAck(){
    Thread t = new Thread(){ 
        public void run(){
            //Do something here
        }
    }
    t.start();
    return true;
}

Le fil de discussion se poursuivra après la disparition du fil "principal". Le problème auquel vous faites peut-être référence est que le service web arrête le processus après l'envoi de l'ack. Le fil devrait continuer, car java n'arrête pas son processus tant que tous les threads n'ont pas terminé.

Si cela ne fonctionne pas, il se peut que le service web fasse un peu de vaudou - en fermant le processus java ou autre. Je vous suggère de chercher à créer un nouveau processus avec java, ici : http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html qui nécessiterait une application distincte pour effectuer le travail dont vous avez besoin.

1voto

Shreya Sharma Points 355
Thread t = new Thread(){
    public void run(){
              //task to complete after sending acknowledge   
    }
};
t.start();
//prepare acknowledgement code and return;
return new ResponseEntity<>(HttpStatus.OK);

La tâche dans la méthode run() continuera à fonctionner même après le retour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X