Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / автостарт приложения. Tomcat, Spring, Hibernate / 11 сообщений из 11, страница 1 из 1
25.06.2012, 17:28:23
    #37853682
tepka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
Коллеги,
Есть автономное приложение которое крутиться под tomcat'ом. Управление приложением осуществляется через spring mvc в связке с hibernate (грубо говоря через базу данных).
Хочется чтобы приложением при старте tomcat'а запускалось автоматически(выполнялся метод, который в свою очередь уже запустит нужные thread)
Я знаю два способа:
1) В web.xml через параметр <load-on-startup>1</load-on-startup> это вызывает метод init(). Но данный способ как я понял из документации был придуман для сервлетов. А у меня ни разу не сервлет (приложение никому ничего не отвечает, оно крутит ряд потоков )
2) Через ServletContextListener. Но опять же запуск ContextListener происходит в сааам начале tomcat'а до того как происходит связка бинов. Что тоже не есть круто. Так как моё приложение хочет использовать бины.

Будь те добреньки, подскажите пожалуйста как все таки запускать такие приложения.
...
Рейтинг: 0 / 0
25.06.2012, 17:37:54
    #37853696
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
Как это Spring MVC и без сервлетов. :)
Чем вас не устраиваюи всякие спринговые @PostConstruct, init-method и т.п.?
...
Рейтинг: 0 / 0
25.06.2012, 17:47:29
    #37853719
tepka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
Blazkowicz,

Сервлеты то есть. Но бизнес-логика же не в сервлете) А особенность моей бизнес-логики в том, чтобы она начинала работать без вмешательства человека. Если вмешательство человека необходимо, то оно осуществляется через веб, т.е. через сервлеты)
Ща почитаю про PostConstruct)
...
Рейтинг: 0 / 0
25.06.2012, 17:47:46
    #37853720
pasha701
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
Код: java
1.
ApplicationListener, ContextStartedEvent
...
Рейтинг: 0 / 0
25.06.2012, 21:30:33
    #37853954
tepka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
Blazkowicz,

Спасибо за наводку, не знал об этой аннотация. Но она черт возьми не подходит(
Дело в том что как метод с PostConstruct аннотацией не может стартовать Hibernate Session'ию. Почему не может написано детально вот тут http://forum.springsource.org/showthread.php?58337-No-transaction-in-transactional-service-called-from-PostConstruct.

pasha701,

Тоже спасибо за наводку. Сейчас усиленно читаю доки по этому поводу. Я так понимаю надо создать класс похожий вот на это
Код: java
1.
2.
3.
4.
5.
6.
@Service
public class EventListener implements ApplicationListener<ContextStartedEvent> {  
  public void onApplicationEvent(ContextStartedEvent event) {
        System.out.println("Context '" + event.getApplicationContext().getDisplayName() + "' is started!");
  }  
}



Но в документации ( http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#context-functionality-events) сказано, что для того чтобы сработал этот эвент нужно чтобы интерфейс ApplicationContext вызвал метод start() интерфейса ConfigurableApplicationContext.
Но черт возьми) как заставить ApplicationContext вызвать этот метод?)

Пытался так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Service
public class EventPublisher implements ApplicationContextAware {
    private ApplicationContext context;
    public void setApplicationContext(ApplicationContext applicationContext){
        this.context = applicationContext;
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext)this.context;
        configurableApplicationContext.start();
    }
}


и ничего хорошего) эксепшен говорит вначале нужно вызывать метод reload(); Пробовал с reload(); старт приложения уходит в глубокий луп
...
Рейтинг: 0 / 0
25.06.2012, 21:49:35
    #37853972
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
tepkaДело в том что как метод с PostConstruct аннотацией не может стартовать Hibernate Session'ию. Почему не может написано детально вот тут http://forum.springsource.org/showthread.php?58337-No-transaction-in-transactional-service-called-from-PostConstruct.
Не особо там объясняется. Если бин использует хибер, то от зависит от SessionFactory или HibernateTemplate, которые зависят от TransactionManager. Вся эта лабуда должна быть проинициализирована. Опять же в теме написано и про TransactionTemplate, как способ решения.
...
Рейтинг: 0 / 0
25.06.2012, 22:28:57
    #37854009
tepka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
BlazkowiczНе особо там объясняется. Если бин использует хибер, то от зависит от SessionFactory или HibernateTemplate, которые зависят от TransactionManager. Вся эта лабуда должна быть проинициализирована. Опять же в теме написано и про TransactionTemplate, как способ решения.
"...no way to ensure that all the post processing is already done, so (indeed) there can be no Transactions..."
Да эта вся лабуда хибером связанная инициализируется к моменту когда выполняется метод init(). Эт я как в логах вижу, так и в дебаггере. Но вот на аннотацию @Transactional() методу init() по барабану.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Service
public class Posting {
@Autowired
     private PostingAccountDAO postingAccountDAO;

@Transactional()
     public void clearSchedule() {
        this.postingAccountDAO.clearSchedule();
     }

@PostConstruct
     public void init() {
        clearSchedule();
     }
}


workaround'ы то я нашел (как один из вариантов это TransactionTemplate). Но это все как то кривовато)
Буду дальше копать в сторону ContextStartedEvent, ведь по логике мне именно и нужен этот эвент. Но достучатся до него пока не получается.
...
Рейтинг: 0 / 0
26.06.2012, 11:52:41
    #37854596
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
tepkaХочется чтобы приложением при старте tomcat'а запускалось автоматически(выполнялся метод, который в свою очередь уже запустит нужные thread)

Эти thread'ы не реализует работу, которая должна вестись по таймеру?
...
Рейтинг: 0 / 0
26.06.2012, 11:58:36
    #37854615
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
Вот здесь сказано что проблема в том что PostConstruct вызов идёт мимо прокси.
https://jira.springsource.org/browse/SPR-6002
Можно попробовать разделить на 2 бина. Один для вызова PostConstruct, а второй для выполнения самой Transactional операции. Вот в этом случае вызов должен пойти через прокси и проблемы не будет.
...
Рейтинг: 0 / 0
26.06.2012, 12:18:58
    #37854691
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
tepka,
какой нафик Бизнес-метод, если ты привязываешь всё к старту томката. Т.е. грубо к старту АппСервера.
Это другой уровень окружения.
Если это Админское приложение, тогда другое дело.
Но IMHO кривое обоснование велосипеда.
...
Рейтинг: 0 / 0
26.06.2012, 12:54:31
    #37854777
pasha701
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автостарт приложения. Tomcat, Spring, Hibernate
tepka как заставить ApplicationContext вызвать этот метод?) Сорри, неправильный event, нужен "ContextRefreshedEvent".
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / автостарт приложения. Tomcat, Spring, Hibernate / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]