forum.bitel.ru http://forum.bitel.ru/ |
|
Запуск глобальных скриптов по таймеру http://forum.bitel.ru/viewtopic.php?f=19&t=6773 |
Страница 1 из 1 |
Автор: | Phricker [ 12 май 2012, 18:32 ] |
Заголовок сообщения: | Запуск глобальных скриптов по таймеру |
Собственно вот такой вот скрипт Код: import bitel.billing.common.TimeUtils.*; import bitel.billing.server.util.*; public void main( setup, con, conSlave ) { //получаем установленную дату закрытого периода ClosedDateChecker cdc = new ClosedDateChecker(); closeDate = cdc.getClosePeriodDate(); //получаем последнее число предыдущего месяца Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, -1); int lastDay = calendar.getActualMaximum(Calendar.DATE); calendar.set(Calendar.DATE, lastDay); //если установленная дата ранее чем полученная - выставляем в закрытом периоде полученную дату if( TimeUtils.dateBefore(closeDate, calendar) ){ print("Дата закрытого периода ранее конца предыдущего месяца. Устанавливаю дату закрытия"); cdc.setClosePeriodDate(calendar.getTime()); } } При запуске его вручную через кнопку Выполнить скрипт - все выполняется. Если дата закрытого периода раньше, чем последнее число предыдущего месяца - выставляется последнее число предыдущего месяца. Однако если добавить задачу в планировщик, в которой прописать tids=<ID_этого_скрипта> и поставить ее на выполнение каждые 10 минут - ничего не происходит. Точнее как. Первый запуск задачи через планировщик пишет следующее Код: GENERATE_TIME: 12.05.12 16:10:03 EXECUTION_STOP_TIME: 12.05.12 16:10:03 PROCESS_TIME: 28 OUT: Дата закрытого периода ранее конца предыдущего месяца. Устанавливаю дату закрытия Но главное, что только пишет. Дату не выставляет. Все остальные запуски (даже вручную через Выполнить сейчас) тупо пусто Код: GENERATE_TIME: 12.05.12 16:30:43 EXECUTION_STOP_TIME: 12.05.12 16:30:43 PROCESS_TIME: 13 OUT: В логах на последнее действие пусто Код: 05-12/16:30:43 INFO [Thread-13] TaskRunProcessor - Running Task: bitel.billing.server.script.global.bean.GlobalScriptTimer
05-12/16:30:43 INFO [pool-1-thread-2] GlobalScriptTimer - start task id => 24 at time 12.05.2012 16 05-12/16:30:43 INFO [pool-1-thread-2] ScriptInstance - Invoke method Установка закрытого периода : main 05-12/16:30:43 INFO [pool-1-thread-2] GlobalScriptTimer - Task finished time=18 ms. 05-12/16:30:43 INFO [pool-1-thread-2] GlobalScriptTimer - task time : 0 d 00:00:00 05-12/16:30:43 INFO [pool-1-thread-2] GlobalScriptTimer - RunTask finished time=19 ms. |
Автор: | Phricker [ 12 май 2012, 18:40 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
А да. билды на которых проверялось Рабочая машинка Код: Сервер: вер. 5.2 сборка 1141 от 01.04.2012 00:13:46 os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_31 Тестовая машинка Код: Сервер: вер. 5.2 сборка 1185 от 11.05.2012 19:35:19
os: Linux; java: Java HotSpot(TM) Client VM, v.1.6.0_31 |
Автор: | Cromeshnic [ 14 май 2012, 06:44 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Похоже, дата закрытого периода хранится и в базе (таблица setup) и в памяти, у сервера и шедулера в памяти разные даты -> ![]() |
Автор: | Phricker [ 14 май 2012, 11:04 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Cromeshnic писал(а): у сервера и шедулера в памяти разные даты -> ![]() ![]() |
Автор: | Phricker [ 14 май 2012, 13:18 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Разработчики, скажите вы обратили внимание на эту тему, или нужно каждый день писать "АП"? ) |
Автор: | skyb [ 14 май 2012, 13:20 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Phricker писал(а): Разработчики, скажите вы обратили внимание на эту тему, или нужно каждый день писать "АП"? ) Phricker писал(а): dimOn писал(а): повторяю: => хелпдеск => $$ => доработка => профит Fixed ![]() бгггг |
Автор: | Phricker [ 14 май 2012, 13:28 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Смейся смейся. Ты у себя проверил то? Я на форум написал потому, что засомневался правильно ли делаю, т.к. раньше не добавлял глобальные скрипты в планировщик. |
Автор: | skyb [ 14 май 2012, 13:30 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
не, мне покачто ненада такого, вроде все работает =) могу проверить |
Автор: | dimOn [ 14 май 2012, 13:37 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Я обратил внимание, но не понял. Какая ещё память? Какие разные даты? |
Автор: | Phricker [ 14 май 2012, 13:41 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
В общем этот скрипт делает следующее Получает дату закрытого периода ![]() И если установленная дата раньше чем последнее число предыдущего месяца - меняет дату закрытого периода на последнее число предыдущего месяца. была тема с просьбой сделать, чтобы можно было задавать определенные группы пользователей которым разрешено делать изменения в закрытом периоде, но на нее благополучно забили, вследствии чего приходится постоянно открывать период, и бывает что про него забываешь И, собственно, дело в том, что этот скрипт НЕ РАБОТАЕТ если он запускается через планировщик задач, задачей "Выполнение глобальных скриптов по таймеру". И этот скрип РАБОТАЕТ если этот же скрипт запускается из глобальных скриптов вручную. |
Автор: | dimOn [ 14 май 2012, 14:07 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
А как дата берётся в скрипте? |
Автор: | dimOn [ 14 май 2012, 14:08 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
А какая дата получается? Что не работает? Не берётся, не ставится? Дата левая? |
Автор: | dimOn [ 14 май 2012, 17:15 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Ну так даты то почему разные? ![]() Дата кеширутся при изменении и записывается в БД. О какой памяти речь? |
Автор: | dimOn [ 14 май 2012, 17:21 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Ну да, если вы поменяете в сервере дату, то она запишется в БД и закешируется в памяти. При последующей попытке взятия она поглядится - в памяти есть, ага, из БД не пересчётся. Если при этом была переустановлена дата в шедулере, то она также запишется в БД и в память. Но память другая. В итоге сервер не понимает что дата изменилась, он то видит закешированную дату в своём серверском сетапе. Выход какой- читать вам тока из БД ддату и всё, и никогда не из памяти (сетапа). Но всё равно дата то установится но сервер её не подхватит. выхода я не вижу, кроме убирания кеширования, что есть плохо. Ну или обновлять дату по событиям меж приложениями. |
Автор: | Phricker [ 14 май 2012, 17:28 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Мммммм... А как дата закрытого периода меняется вручную? Ну т.е. что при этом происходит? Может я в скрипте повторю это и всего то делов ![]() |
Автор: | dimOn [ 15 май 2012, 12:11 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Дело в том, что любое изменение в шедулере базы данных не отразится в сервере, потому там что значение из БД уже было прочитано и закешировано. И пока в сервере кто-либо не дёрнет дату на изменение (=>не перечитается там кеш из БД) в сервере будет браться та же самая дата, которая уже в памяти, хотя в БД другая. Код там такой: Код: public Calendar getClosePeriodDate() { Calendar dt = null; String dateStr = Setup.getSetup().get( "closed.date", null ); if ( Utils.isBlankString( dateStr ) ) { Connection con = Setup.getSetup().getDBConnectionFromPool(); dt = TimeUtils.convertStringToCalendar( ServerUtils.getSetupValue( con, "1" ) ); ServerUtils.closeConnection( con ); Setup.getSetup().set( "closed.date", TimeUtils.formatDate( dt ) ); ... Код: public void setClosePeriodDate( Date dt )
{ Setup.getSetup().set( "closed.date", TimeUtils.formatDate( dt ) ); Connection con = Setup.getSetup().getDBConnectionFromPool(); ServerUtils.setSetupValue( con, "1", TimeUtils.formatDate( dt ) ); ServerUtils.closeConnection( con ); } |
Автор: | dimOn [ 15 май 2012, 12:11 ] |
Заголовок сообщения: | Re: Запуск глобальных скриптов по таймеру |
Дело в том, что любое изменение в шедулере базы данных не отразится в сервере, потому там что значение из БД уже было прочитано и закешировано. И пока в сервере кто-либо не дёрнет дату на изменение (=>не перечитается там кеш из БД) в сервере будет браться та же самая дата, которая уже в памяти, хотя в БД другая. Код там такой: Код: public Calendar getClosePeriodDate() { Calendar dt = null; String dateStr = Setup.getSetup().get( "closed.date", null ); if ( Utils.isBlankString( dateStr ) ) { Connection con = Setup.getSetup().getDBConnectionFromPool(); dt = TimeUtils.convertStringToCalendar( ServerUtils.getSetupValue( con, "1" ) ); ServerUtils.closeConnection( con ); Setup.getSetup().set( "closed.date", TimeUtils.formatDate( dt ) ); ... Код: public void setClosePeriodDate( Date dt )
{ Setup.getSetup().set( "closed.date", TimeUtils.formatDate( dt ) ); Connection con = Setup.getSetup().getDBConnectionFromPool(); ServerUtils.setSetupValue( con, "1", TimeUtils.formatDate( dt ) ); ServerUtils.closeConnection( con ); } |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |