powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Шедулер
11 сообщений из 11, страница 1 из 1
Шедулер
    #38495314
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть приложение на томкате крутится, само приложение на Vaadin.
Нужно запускать в определенное время, например в 10 утра метод.
Попробовал сделать через таймер, ну то есть запускать его раз в 2 минуты, делать проверку текущего времени и если оно равно +- 1 минута 10 часов утра, то запускаться.
Но! Привязал это дело на запуск UI интерфейса, то есть при запуске пользователем приложения, при заходе по ссылке на приложение оно начинает работу. Дык вооот... Он запускается не один раз, даже находясь в конструкторе.
Я понимаю, что это совсем неправильный подход. Вопрос - где и что использовать для решения подобной задачи?
Спасибо.
...
Рейтинг: 0 / 0
Шедулер
    #38495320
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Шедулер
    #38495335
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

то есть все же его "копать".. уже подключил к проекту, но что-то... в общем ладно, позже отпишу :)
...
Рейтинг: 0 / 0
Шедулер
    #38495514
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,

что мешает завести флаг - индикатор запущенности приложения, и не запускать его второй раз если флаг поднят? (манипуляции с флагом окружить synchronized блоком).
...
Рейтинг: 0 / 0
Шедулер
    #38495732
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixic,
если таймер Вас всем устраивает и единственная проблема множественные запуски, то вариант от rfq будет работать, а еще можно все это повесить на ServletContextListener.
...
Рейтинг: 0 / 0
Шедулер
    #38497062
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! Разобрался с quartz scheduler'ом. Отличная вещь!
Особенно то что надо это его CronTrigger.
Синтаксис, конечно, непривычный, но возможности очень радуют!
...
Рейтинг: 0 / 0
Шедулер
    #38497076
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственное, что не касается самого кварца, не могу понять как его запускать при старте приложения.
Пока сделал так, что приходится заходить на страничку сервлета, чтобы шедуллер запустился.
То есть прописал его маппинг в web.xml
Наверное это особенности Vaadin....
Просто получается, что в качестве первой страницы в маппинге у меня прописано /*
Ну то есть вот:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet
        </servlet-class>
        <init-param>
            <param-name>application</param-name>
            <param-value>nix.common.Login</param-value>
        </init-param>
        <init-param>
            <param-name>widgetset</param-name>
            <param-value>com.widgetset.MyAppWidgetSet</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>



Сервлет с кварцом прописал так же, только урл пришлось сделать таким <url-pattern>/scheduler/*</url-pattern>

То есть пока не зайдешь на страничку с этим окончанием, шедуллер не будет запущенным. А заходить каждый раз после деплоя неправильно.
Подскажите, куда его прописать, чтобы запускался сразу после старта томкат. Спасибо.
...
Рейтинг: 0 / 0
Шедулер
    #38497079
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо свой ContextListener прописать и в нем инициировать.
Либо если сервлет то прописать <load-on-startup>, чтобы инициализация сервлета была при деплойменте, а не при первом обращении.
...
Рейтинг: 0 / 0
Шедулер
    #38497184
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Отлично! Спасибо большое!
Все работает!
Код: xml
1.
2.
3.
4.
5.
   <servlet>
        <servlet-name>Schedule</servlet-name>
        <servlet-class>nix.system.scheduler.MySimpleSchedule</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>


Осталось только допилить :)
...
Рейтинг: 0 / 0
Шедулер
    #38497185
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всё правильно. Кроме того, если не хочется завязываться с дополнительными библиотеками, то можно и обычным таймером обойтись (scheduleAtFixedRate). А вто как это запускается:
web.xml
Код: xml
1.
2.
3.
4.
5.
6.
<web-app ...>
	<listener>
		<listener-class>my.package.Initializer</listener-class>
	</listener>
...
</web-app>


java:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class Initializer implements ServletContextListener {

	private Timer timer;
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
...
		timer = new Timer("myDaemonTimer", true);
		timer.scheduleAtFixedRate(task, firstTime, 24*60*60*1000);
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		if (timer != null)
			timer.cancel();
	}
}


Если в методе contextDestroyed не остановить таймер, то он переживет редеплой, и таймеры размножатся - в результате утечка + загадочные срабатывания :)
...
Рейтинг: 0 / 0
Шедулер
    #38497722
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю через анотацию

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package com.schedule;
 
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
/**
 *  Schedule Bean run according scheduling.job.cron property value.
 */
 
@Component
public class ScheduledJob {
    @Value("${scheduling.job.cron}") private String cron ;
 
    private static final Logger LOGGER = Logger.getLogger(ScheduledJob.class);
 
    @Scheduled(cron = "${scheduling.job.cron}")
 
    public void run() {
        LOGGER.info("run() = " + cron);
    }
}



В контекст апликейшин надо добавить

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
      http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
 
    <context:property-placeholder location="classpath:application.properties"
                                  ignore-resource-not-found="false" />
    <context:annotation-config />
    <context:component-scan base-package="com.schedule" />
    <task:annotation-driven />
</beans>



ну и апп пропертиез само собой

Код: java
1.
2.
3.
# Scheduling task cron fire every 15 minutes
 
scheduling.job.cron=0 0/15 * * * ?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Шедулер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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