Résilié Printemps de Démarrage de l'App dans Eclipse - Fermeture crochet pas appelé
J'ai un Ressort de Démarrage + Ressort des Données Redis/KeyValue projet. - Je configurer un Printemps profil pour exécuter l'application avec toutes les dépendances intégré. Donc, au démarrage, je lance un intégré Redis Serveur. Tout fonctionne bien quand je le démarre dans Eclipse, sauf que je voudrais que le serveur Redis être arrêté quand j'ai arrêter le Printemps de Démarrage de l'application. J'ai donc l'installation de plusieurs crochets d'arrêt, cependant ils ne sont pas appelés quand j'mettre fin à l'application à partir d'Eclipse.
Ils sont semblables questions, j'ai créé ce l'espoir qu'il y aurait un Redis solution. Aussi aucune de ces questions similaires sont spécifiques au Printemps de Démarrage.
J'ai essayé beaucoup de choses:
- Printemps de Démarrage du
ExitCodeGenerator
; DisposableBean
;@PreDestroy
;- J'ai essayé un ShutdownHook (après le @mp911de réponse)
Aucun d'entre eux sont appelés.
Peut-être il ya un Redis option, délai d'attente, les garder en vie.. quelque chose à l'extérieur de la boîte, je ne suis pas au courant ?
Comment puis-je m'assurer que le Redis Serveur est arrêté lors de mon Ressort de Démarrage de l'app est brusquement arrêté ?
=> j'ai vu ce Intégré Redis pour le printemps de démarrage, mais @PreDestroy
est tout simplement pas appelé quand tuer l'application inattendue.
Voici quelques unes des questions similaires:
J'ai aussi vu ce post sur eclipse.org discuter de la façon de l'arrêt du crochet n'est pas appelé lors de l'arrêt d'une application à partir d'eclipse: Un arrêt progressif des Applications Java
Voici tout mon code:
Composant pour démarrer le intégré Redis serveur au démarrage (Avec mes tentatives pour cesser de trop!!):
@Component
public class EmbeddedRedis implements ExitCodeGenerator, DisposableBean{
@Value("${spring.redis.port}")
private int redisPort;
private RedisServer redisServer;
@PostConstruct
public void startRedis() throws IOException {
redisServer = new RedisServer(redisPort);
redisServer.stop();
redisServer.start();
}
@PreDestroy
public void stopRedis() {
redisServer.stop();
}
@Override
public int getExitCode() {
redisServer.stop();
return 0;
}
@Override
public void destroy() throws Exception {
redisServer.stop();
}
}
application.propriétés:
spring.redis.port=6379
Printemps De Démarrage De L'App:
@SpringBootApplication
@EnableRedisRepositories
public class Launcher {
public static void main(String[] args){
new SpringApplicationBuilder() //
.sources(Launcher.class)//
.run(args);
}
@Bean
public RedisTemplate<String, Model> redisTemplate() {
RedisTemplate<String, Model> redisTemplate = new RedisTemplate<String, Model>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName("localhost");
return jedisConnectionFactory;
}
}
Redis serveur (~ incorporé) en cours d'exécution:
$ ps -aef | grep redis
... /var/folders/qg/../T/1472402658070-0/redis-server-2.8.19.app *:6379
L'embedded Redis maven dependency:
<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.6</version>
</dependency>
OriginalL'auteur alexbt | 2016-08-28
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de SpringBoot et Eclipse, vous pouvez installer le STS (Spring Tool Suite) plugin eclipse pour parvenir à un arrêt progressif.
Une fois installé, lancez l'application en tant que "Printemps de Démarrage de l'App" au lieu d'un "Java application" (Run/debug configurations)
S'assurer que la case "Activer la Gestion du Cycle de Vie" est cochée et lorsque vous cliquez sur le carré rouge bouton pour arrêter l'application, il va effectuer un arrêt normal au lieu d'un dur à tuer.
Edit:
Il est intéressant de remarquer qu'il y a deux "rouge bouton carré". Dans le "Lancement" de la barre d'outils et dans la "Console". L'un dans la barre de lancement effectue toujours dur de tuer mais celui de la console permet l'arrêt normal pour la saison printemps-démarrage de l'application (lancé avec la STS)
OriginalL'auteur Ghurdyl
Après enquête, il s'avère que
Eclipse
termine simplement l'application sans la possibilité d'une fermeture à crochet à exécuter.J'ai trouvé une solution de contournement/hack grâce à la façon dont
Spring-Boot
est câblé. Lorsque la méthode est exécutée, tomcat est lancé dans un autre thread, et la principale méthode continue de s'exécuter jusqu'à la fin. Cela m'a permis d'insérer un résiliation logique lorsque vous appuyez 'Entrée'.L'application se lance normalement et la console tout simplement vous attend pour une touche entrée pour exécuter
System.exit(1);
:Lors du lancement de l'application à partir d'Eclipse, au lieu de terminer l'application à partir de l'interface, j'ai maintenant, appuyez sur entrée dans la console.
Maintenant, la fermeture des crochets (
@PreDestroy
) est déclenché et le Redis serveur est arrêté!Pas ce que j'espérais, mais au moins pour le moment, l'Embedded Redis Serveur est arrêté avec l'application et je n'ai pas de continuer à tuer manuellement.
OriginalL'auteur alexbt
ExitCodeGenerator
exige l'application pour appeler leexit
méthodeVous pourriez inscrire en outre un fermeture à crochet. Les crochets seront appelés
System.exit
).Ctrl+C
,SIGINT
) ou d'un signal (SIGHUP
,SIGTERM
).Dans certaines circonstances, si la VM n'est pas fermée correctement (
SIGKILL
, interne VM erreurs, des erreurs dans les méthodes indiennes), il n'y a aucune garantie que l'arrêt crochets sont appelés ou non.Le code de votre
EmbeddedRedis
composant pourrait ressembler à:@PreDestroy
n'est pas appelé.Je viens de réaliser j'ai mixé 2 comportements, l'une à partir de la ligne de commande et à partir de l'IDE. Le problème, je suis vraiment en face est à partir de l'IDE. Je vais mettre à jour la question. Le PreDestroy et DisposableBean de détruire les œuvres de la ligne de commande.
J'ai mis à jour la question, désolé de vous induire en erreur, vous n'avez m'a fait réaliser que je devais l'appeler Système.la sortie de la ExitCodeGenerator 🙂 I +1 de votre réponse.
OriginalL'auteur mp911de
J'ai eu le même problème, mais pas avec le Redis. Je voulais un maximum de portabilité afin que d'autres développeurs de ne pas avoir à ajouter STS si ils ne veulent pas. Vous pouvez ajouter ceci à tout le Printemps de Démarrage d'application pour offrir arrêt propre. Voici ce que j'ai fait, de s'attarder sur le cas des OP propre réponse.
Ajouter à votre classe principale, ou tout
@Configuration
classe:Puis dans Eclipse (ou dans votre IDE de choix, ou même sur la ligne de commande), ajoutez l'argument
--exitListener
pour activer le code. Dans Eclipse, qui serait à Exécuter les Configurations, sur les Arguments de l'onglet, dans le Programme de la zone Arguments.OriginalL'auteur Ben Ingle