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

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

что мешает завести флаг - индикатор запущенности приложения, и не запускать его второй раз если флаг поднят? (манипуляции с флагом окружить synchronized блоком).
...
Рейтинг: 0 / 0
10.12.2013, 15:30:09
    #38495732
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шедулер
Nixic,
если таймер Вас всем устраивает и единственная проблема множественные запуски, то вариант от rfq будет работать, а еще можно все это повесить на ServletContextListener.
...
Рейтинг: 0 / 0
11.12.2013, 14:44:54
    #38497062
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шедулер
Всем спасибо! Разобрался с quartz scheduler'ом. Отличная вещь!
Особенно то что надо это его CronTrigger.
Синтаксис, конечно, непривычный, но возможности очень радуют!
...
Рейтинг: 0 / 0
11.12.2013, 14:51:16
    #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
11.12.2013, 14:54:10
    #38497079
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шедулер
Либо свой ContextListener прописать и в нем инициировать.
Либо если сервлет то прописать <load-on-startup>, чтобы инициализация сервлета была при деплойменте, а не при первом обращении.
...
Рейтинг: 0 / 0
11.12.2013, 15:40:10
    #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
11.12.2013, 15:41:09
    #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
11.12.2013, 21:19:31
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / Шедулер / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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