Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Spring: уничтожение бина  [new]
Molasar
Member

Откуда:
Сообщений: 604
Всем привет!

Аннотация @PostConstruct работает отлично.

Хочу проверить работу аннотации @PreDestroy.
Какое событие или действие вызовет метод closeSession(), аннотируемый @PreDestroy?
@SpringBootApplication
public class Sendersoap02Application {

    public static void main(String[] args) {
        SpringApplication.run(Sendersoap02Application.class, args);
    }
    
    @Bean
    CommandLineRunner initSession(SmppSession smppSession) {
        return args -> {
            
        };
    }
        
}

public class SmppSession {
    
    private static final Logger logger = LogManager.getLogger(SmppSession.class);
    
    public SmppSession() {
    }
    
    @PostConstruct
    public void openSession() {
        logger.info("Try to open session ...");
        logger.info("Session opened");
    }
    
    @PreDestroy
    public void closeSession() {
        logger.info("Try to close session ...");
        logger.info("Session closed");
    }
    
}
7 мар 19, 14:54    [21827391]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
lleming
Member

Откуда:
Сообщений: 1558
"Try to close session ..."
"Session closed"
7 мар 19, 18:15    [21827638]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
lleming
Member

Откуда:
Сообщений: 1558
context = SpringApplication.run(Sendersoap02Application.class, args);

Thread.sleep(10);
context.close();
7 мар 19, 18:17    [21827639]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Molasar
Member

Откуда:
Сообщений: 604
lleming
context = SpringApplication.run(Sendersoap02Application.class, args);

Thread.sleep(10);
context.close();

Такой вариант:
@SpringBootApplication
public class Sendersoap02Application {

    public static void main(String[] args) throws InterruptedException {
        try (ConfigurableApplicationContext context = SpringApplication.run(Sendersoap02Application.class, args)) {
            SmppSession smppSession1 = context.getBean(SmppSession.class);
            Thread.sleep(10);
            context.close();
        }
    }

}

выдаёт следующее:
2019-03-11 12:39:04.920  INFO 7900 --- [  restartedMain] r.s.s.Sendersoap02Application            : Starting Sendersoap02Application on A-PC with PID 7900 (C:\Dev\Develop\SenderSoap02\target\classes started by A in C:\Dev\Develop\SenderSoap02)
2019-03-11 12:39:04.920  INFO 7900 --- [  restartedMain] r.s.s.Sendersoap02Application            : No active profile set, falling back to default profiles: default
2019-03-11 12:39:04.952  INFO 7900 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2019-03-11 12:39:05.280  INFO 7900 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2019-03-11 12:39:05.295  INFO 7900 --- [  restartedMain] r.s.s.Sendersoap02Application            : Started Sendersoap02Application in 0.578 seconds (JVM running for 0.825)
2019-03-11 12:39:05.311  INFO 7900 --- [  restartedMain] ru.signalcom.sendersoap02.SmppSession    : Try to open session ...
2019-03-11 12:39:05.311  INFO 7900 --- [  restartedMain] ru.signalcom.sendersoap02.SmppSession    : Session opened
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 4.336s
Finished at: Mon Mar 11 12:39:06 MSK 2019
Final Memory: 17M/196M

т.е. при закрытии контекста @PreDestroy не вызывается:
    @PreDestroy
    public void closeSession() {
        logger.info("Try to close session ...");
        logger.info("Session closed");
    }
11 мар 19, 12:44    [21829036]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Molasar, вызывается. И код у вас правильный. А причем тут build success?
11 мар 19, 12:59    [21829053]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Озверин
Molasar, вызывается. И код у вас правильный. А причем тут build success?


p.s. context.close() можно и не вызывать вовсе ибо "подразумевается" что оно само будет вызвыано в данном случае.
11 мар 19, 13:00    [21829055]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Molasar
Member

Откуда:
Сообщений: 604
Озверин
Озверин
Molasar, вызывается. И код у вас правильный. А причем тут build success?


p.s. context.close() можно и не вызывать вовсе ибо "подразумевается" что оно само будет вызвыано в данном случае.

Почему тогда лог не выводится в консоль?:
    @PreDestroy
    public void closeSession() {
        logger.info("Try to close session ...");
        logger.info("Session closed");
    }
11 мар 19, 13:08    [21829072]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Molasar, попробуйте из зависимостей убрать dev tools. А потом перезапустите...я думаю там у все порылось.
11 мар 19, 13:20    [21829093]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Molasar
Member

Откуда:
Сообщений: 604
Озверин
Molasar, попробуйте из зависимостей убрать dev tools. А потом перезапустите...я думаю там у все порылось.

Убрал dev tools, не помогает.
11 мар 19, 13:32    [21829116]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 13443
А чего он должен дестроиться? Дефолтный скоуп - синглтон. Он инстанциировался однажды и будет внедрен во все места.
11 мар 19, 13:48    [21829141]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 13443
Озверин
Molasar, попробуйте из зависимостей убрать dev tools. А потом перезапустите...я думаю там у все порылось.

Как это связано с жизненным циклом бинов?
11 мар 19, 13:49    [21829144]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Molasar
Member

Откуда:
Сообщений: 604
Hett
А чего он должен дестроиться? Дефолтный скоуп - синглтон. Он инстанциировался однажды и будет внедрен во все места.

Scope("prototype")
@Configuration
public class AppConfig {

    @Bean
    @Scope("prototype")
    public SmppSession getSmppSession() {
        return new SmppSession();
    }
    
}
11 мар 19, 13:54    [21829157]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Hett
А чего он должен дестроиться? Дефолтный скоуп - синглтон. Он инстанциировался однажды и будет внедрен во все места.


может потому, что контекст закрывается?
11 мар 19, 13:59    [21829168]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Hett
Озверин
Molasar, попробуйте из зависимостей убрать dev tools. А потом перезапустите...я думаю там у все порылось.

Как это связано с жизненным циклом бинов?


dev tools`ы связаны с тем, что делают "слишком много магии" при хот релоаде кода и при этом имеют незакрытые баги.
11 мар 19, 14:03    [21829175]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Molasar, а где в логе информация о том, что контекст уничтожен? Что за лог? Откуда он?
11 мар 19, 14:05    [21829182]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
А чтобы всем проще жить, всегда можно набросать проект на гитхабе и предоставить всем ссылку:

https://github.com/cudu/predestroy-working-example

вот тут все работает.
11 мар 19, 14:09    [21829185]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Molasar
Member

Откуда:
Сообщений: 604
Озверин
А чтобы всем проще жить, всегда можно набросать проект на гитхабе и предоставить всем ссылку:

https://github.com/cudu/predestroy-working-example

вот тут все работает.

Спасибо за пример, но есть момент:
Запускаю работает, добавляю код в метод openSession(), например sout, сохраняюсь, запускаю снова, ошибка:
Exception in thread "main" java.lang.NoClassDefFoundError: org/sql/ru/predestroy/SmppSession
	at org.sql.ru.predestroy.Sendersoap02Application.main(Sendersoap02Application.java:12)
Caused by: java.lang.ClassNotFoundException: org.sql.ru.predestroy.SmppSession
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 1 more

После этого делаю Clean and Build, потом запускаю, всё работает.

Почему так?
11 мар 19, 15:29    [21829298]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Molasar, потому что вы не знаете, что нажимаете или не знаете, что за скрипты стоят за кнопками в той среде, где нажимаете. То, что вы нажимаете, должны изучить.
11 мар 19, 15:39    [21829313]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Molasar
Member

Откуда:
Сообщений: 604
Озверин
А чтобы всем проще жить, всегда можно набросать проект на гитхабе и предоставить всем ссылку:

https://github.com/cudu/predestroy-working-example

вот тут все работает.

Разницу нашёл только в использовании @Component вместо класса с конфигурированием бинов AppConfig
11 мар 19, 16:04    [21829353]     Ответить | Цитировать Сообщить модератору
 Re: Spring: уничтожение бина  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5066
Molasar, а мне сравнить сложно с вашим проектом..ибо я его в глаза не видел.
11 мар 19, 16:15    [21829377]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить