Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring и Task Execution and Scheduling / 16 сообщений из 16, страница 1 из 1
22.08.2013, 09:17
    #38374122
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Добрый день!

Читаю по поводу создания функций которые будут выполнять одну и ту же работу , и вот возникли вопросы : http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html


1. К примеру у меня есть метод
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    @Scheduled(fixedDelay = 3 * 1000)
     public void execute() {
       List<Object> list =  getObjectToCancel();
       if(list != null && !list.isEmpty()){
           for (Object tObjectCancel : list) {
                 cancel(tObjectCancel);
           }
       }
     }



Код: xml
1.
<bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler" p:poolSize="30" id="threadPoolScheduler" />



execute - метод должен выполняться каждые 30 секунд и подчищать базу данных - операция в методе cancel(tObjectCancel); - может занять и больше 30 секунд ( очень сложная логика проверки каждого объекта перед его удалением) .

из Этого у меня вопрос :

как поведет себя ThreadPoolTaskScheduler ?
1)он будет ждать пока завершится этот тред и после этого - запустить его снова ?
2)он создаст еще один тред из пула и будет выполнять тоже задание при этом первый тред будет выполняться ?( со временем может получиться так что все подвинет ,когда весь пул исчерпается)
3)другое поведение?

объясните какое у него поведение ?


Как в этой же ситуации поведут себя другие реализации ?
1) Кварц
2) стандартная реализация java

что будет , если указать не fixedDelay , а fixedRate и cron ?
...
Рейтинг: 0 / 0
22.08.2013, 11:15
    #38374268
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Atum1Читаю по поводу создания функций которые будут выполнять одну и ту же работу , и вот возникли вопросы : http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html

Все вопросы в стиле "прочитайте за меня документацию". По этой же ссылке что вы привели рассказывается про Concurrent и Synchronized executor-ы.

Atum1как поведет себя ThreadPoolTaskScheduler ?
1)он будет ждать пока завершится этот тред и после этого - запустить его снова ?

Зависит от executor-а. Они все описаны по ссылке выше. Если это пул, то в пуле, наверняка более одного потока. Если есть свободные потоки, то ждать никто никого не будет. Если в пуле только один поток, то запустить вторую параллельную задачу при занятоп потоке никак не выйдет.

Atum12)он создаст еще один тред из пула

Вы понимаете что такое пул? Нет такого "создать из пула". Можно создать поток, если не превышен лимит пула. Можно взять поток из пула и вернуть обратно. Нельзя "создать из пула".

Atum1и будет выполнять тоже задание при этом первый тред будет выполняться ?( со временем может получиться так что все подвинет ,когда весь пул исчерпается)

Ну, если у вас все задачи бесконечные, то да. Пул достигнет своего предела и перестанет выдавать потоки. "все подвинет" никакого отношения к происходящему не имеет. Ничего не "подвинет". Задачи, которые выполняются, так и будут выполнятся. А новые не будут запускаться, потому что все потоки заняты. Что из этого "подвинет"?

Atum1Как в этой же ситуации поведут себя другие реализации ?
1) Кварц

Как настроить так и поведет.

Atum12) стандартная реализация java

Spring Scheduler не более чем удобная обертка над "стандартной реализацией".
Обычные таймеры в Java однопоточные. Что как бы намекает на ответ. А ScheduledThreadPoolExecutor это пул потоков. Что тоже и есть ответом на вопрос.


Atum1что будет , если указать не fixedDelay , а fixedRate и cron ?
Что на этот счет говорит документация?
...
Рейтинг: 0 / 0
22.08.2013, 11:23
    #38374283
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
BlazkowiczВсе вопросы в стиле "прочитайте за меня документацию". По этой же ссылке что вы привели рассказывается про Concurrent и Synchronized executor-ы.

Есть проблемы с английским языком :)

вот поэтому и разбираюсь.

Т.е в случае когда он не будет ждать завершения, а будет еще раз вызывать метод - в начале метода нужно определить флаг признак окончания ?! так

писал его или как static boolean в классе или как AtomicBoolean и входя в метод execute - проверять выполняет его кто-то или нет в данный момент?

если он true - то устанавливать его в false до окончания цикла,а потом сбрасывать в true !? так ?
...
Рейтинг: 0 / 0
22.08.2013, 11:25
    #38374288
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Atum1Т.е в случае когда он не будет ждать завершения, а будет еще раз вызывать метод - в начале метода нужно определить флаг признак окончания ?! так

Зачем?

Atum1писал его или как static boolean в классе или как AtomicBoolean и входя в метод execute - проверять выполняет его кто-то или нет в данный момент?

Цель какая??

[quot Atum1если он true - то устанавливать его в false до окончания цикла,а потом сбрасывать в true !? так ?[/quot]
Нафига???
...
Рейтинг: 0 / 0
22.08.2013, 11:26
    #38374290
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Это не подвинет ,а подвиснет - опечатка :)

Что из этого "подвинет"? - это "подвиснет" - или когда пул полностью задействует все свои потоки - он выбросит ошибку или будет выставлять новые задания в очередь , если конечно она предусмотрена реализацией ...
...
Рейтинг: 0 / 0
22.08.2013, 11:28
    #38374295
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Atum1Есть проблемы с английским языком :)

Стыдно должно быть. Я в школе help по турбо паскалю читал со словарём Мюллера на 300К слов. Представляете, на поиск каждого слова уходят минуты. А не 3 секунды, как сейчас. А в google translate вообще можно предложениями и абзацами переводить. Так что не аргумент.
...
Рейтинг: 0 / 0
22.08.2013, 11:29
    #38374297
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Atum1Это не подвинет ,а подвиснет - опечатка :)

Что из этого "подвинет"? - это "подвиснет" - или когда пул полностью задействует все свои потоки - он выбросит ошибку или будет выставлять новые задания в очередь , если конечно она предусмотрена реализацией ...
Всё зависит от реализации executor-а. Можно задать любое нужное поведение.
...
Рейтинг: 0 / 0
22.08.2013, 11:37
    #38374317
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Вот вопросы поведения как раз меня и интересуют , первое что сделал - перевел все в гуглтранслите.

Но , провел тест - и понял что он работает последовательно - т.е. не начинает выполнять метод , а ждет завершения уже запущенного и после этого запускает его .

Просто под линуксом - ставил задачку под крон - там все просто было - каждую минуту - он вызывал процедурку ... если за 1 минуту она не отрабатывала - запускался еще один экземпляр и так до бесконечности ... чтобы этого избежать приходилось создавать в tmp файл - и по нему ориентироваться , есть файл - процесс работает , нет - запускается новый и отрабатывает итд.

тут думал будет аналогичное поведение, но кажется ошибся.
...
Рейтинг: 0 / 0
22.08.2013, 11:38
    #38374321
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Разницу между Delay и Rate словарь не раскрывает?
...
Рейтинг: 0 / 0
22.08.2013, 11:46
    #38374340
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
BlazkowiczРазницу между Delay и Rate словарь не раскрывает?

http://www.springbyexample.com.ua/2012/08/spring-task-scheduler.html

Прочитал ,Blazkowicz, спасибо за помощь :)
...
Рейтинг: 0 / 0
22.08.2013, 12:20
    #38374409
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
BlazkowiczAtum1Есть проблемы с английским языком :)

Стыдно должно быть. Я в школе help по турбо паскалю читал со словарём Мюллера на 300К слов. Представляете, на поиск каждого слова уходят минуты. А не 3 секунды, как сейчас. А в google translate вообще можно предложениями и абзацами переводить. Так что не аргумент.

Вот ведь были времена...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.08.2015, 14:16
    #39033987
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Вопрос :
я создал задачу по расписанию ,но она отрабатывает дважды !!!

как вернуть нормальное поведение ?

ps

при фиксит fixedRate такая же картинка ...
кто вызывает задачу дважды ?


spring 4.1.*

проект сконфигурирован как javaconfig + jetty 9

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@EnableScheduling
@Service
public class ScheduledTasks {
    
    
     @Scheduled(fixedDelay = 5000)
     public void currentTime()  {
          System.out.printf( "time : %s\n" ,LocalTime.now());
         }
}



в логах вижу что отрабатывает два раза :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
..
time : 14:14:06.890
time : 14:14:07.272
time : 14:14:11.891
time : 14:14:12.272
time : 14:14:16.891
time : 14:14:17.272
time : 14:14:21.891
time : 14:14:22.273
..
...
Рейтинг: 0 / 0
22.08.2015, 14:25
    #39034363
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
собственно вот тест :

14:00:32.317
14:00:32.417
14:00:35.318
14:00:35.417
14:00:38.318
14:00:38.418
14:00:41.318
14:00:41.418

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
import java.time.LocalTime;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;


@Configuration
@EnableWebMvc
@EnableScheduling
public class WebConfig extends WebMvcConfigurerAdapter{
    
    
    @Scheduled(fixedDelay = 3000)
    public void time() {
        System.out.printf("%s\n", LocalTime.now());
    }
    
    public static class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{WebConfig.class};
        }

        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }

        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};

        }

    }
    
}



вот pom.xml


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>ru.web.portal</groupId>
    <artifactId>OnlineScheduling</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>OnlineScheduling</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.1.6.RELEASE</spring.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
 <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
    
    
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            
            
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.3.2.v20150730</version>
                <configuration>
                    <scanIntervalSeconds>5</scanIntervalSeconds>
                    <contextPath>/</contextPath>
                    <stopPort>12456</stopPort>
                    <stopKey>djisjdksjk</stopKey>
                    <connectors>
                        <connector implementation="org.eclipse.jetty.nio.SelectChannelConnector">
                            <port>8080</port>
                            <minThreads>1</minThreads>
                            <maxThreads>2</maxThreads>
                            <maxIdleTime>60000</maxIdleTime>
                            <forwarded>true</forwarded>
                            <Host>0.0.0.0</Host>  
                        </connector>
                    </connectors>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>




Помогите решить проблему !

все что нашел Это ответ на

http://stackoverflow.com/questions/19777879/quartz-spring-double-execution-on-startup

Your ContextLoaderListener and DispatcherServlet are both loading the mvc-dispatcher-servlet.xml. Basically duplicating all your beans resulting in 2 executions as that is also duplicated.

Split your configuration into one that is being loaded by the ContextLoaderListener (containing your services, dao, timers etc.) and one loaded by the DispatcherServlet (containing only web related beans controllers, view resovlers etc.).

Or ditch the ContextLoaderListener altogether and only use the DispatcherServlet to load everything.
...
Рейтинг: 0 / 0
22.08.2015, 14:39
    #39034366
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
автор
Увидел нужно написать так :
Код: java
1.
2.
3.
4.
   @Override
        protected Class<?>[] getServletConfigClasses() {
            return null;
        }




тут вопрос , да все работает как часы - нет повторений , но getServletConfigClasses метод вроде как нужный?!
...
Рейтинг: 0 / 0
22.08.2015, 14:40
    #39034367
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
Хм... такое ощущение будто ты создал 2 экземпляра ScheduledTasks.
...
Рейтинг: 0 / 0
22.08.2015, 15:07
    #39034374
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring и Task Execution and Scheduling
maytonХм... такое ощущение будто ты создал 2 экземпляра ScheduledTasks.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
     @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{WebConfig.class};
        }

        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }



в Этом случае в дебаге как раз и видно что они создаются дважды - в разных потоках и отрабатывают практически одновременно ...

грабли на ровном месте ...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring и Task Execution and Scheduling / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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