Товарищи, поделитесь информацией.
Как можно запусить scheduled job динамически используя имя класса в виде строки
Пробую так, но что-то не сильно даже сохраняется
Type t = Type.forName(className);
System.schedule('Scheduled Job 1', '0 0 * * * ?', t.newInstance());
Товарищи, поделитесь информацией. Как можно запусить scheduled job динамически используя имя класса в виде строки Пробую так, но что-то не сильно даже сохраняется [code] Type t = Type.forName(className); System.schedule('Scheduled Job 1', '0 0 * * * ?', t.newInstance()); [/code]
Да еще вопрос!!!
Как получить название класса который запущен как Scheduled Job?
Соклю CronTriger и CronJobDetail
Но что-то там ничего не нахожу!
Я про третий параметр schedulableClass
вот тут
schedule(jobName, cronExpression, schedulableClass)
Да еще вопрос!!! Как получить название класса который запущен как Scheduled Job? Соклю [url=https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_crontrigger.htm]CronTriger[/url] и [url=https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_cronjobdetail.htm]CronJobDetail[/url] Но что-то там ничего не нахожу! Я про третий параметр [b]schedulableClass[/b] вот тут [code]schedule(jobName, cronExpression, schedulableClass)[/code]
СМЫСЛ в том что мне надо чтобы
schedulableClass был запущен только один! всегда один!
И при попытке запустить второй (особенно вручную) предыдущий запущенный job убивался.
Если смотреть по jobName - тут проблема - вручную пользователь может запустить с любым именем и я не смогу отловить запущенный job
СМЫСЛ в том что мне надо чтобы schedulableClass был запущен только один! всегда один! И при попытке запустить второй (особенно вручную) предыдущий запущенный job убивался. Если смотреть по jobName - тут проблема - вручную пользователь может запустить с любым именем и я не смогу отловить запущенный job
Храни jobId и убивай его, если необходимо.
Храни jobId и убивай его, если необходимо.
Да вариант хороший, пока пользователи не начнут сами вручную запускать scheduled jobs
Да вариант хороший, пока пользователи не начнут сами вручную запускать scheduled jobs
Может тебе поможет System.isScheduled()
Может тебе поможет System.isScheduled()
"Returns true if the currently executing code is invoked by a scheduled Apex job; false otherwise."
чет пока не улавливаю чем мне это поможет найти запущенный job для определенного класса.
[i]"Returns true if the currently executing code is invoked by a scheduled Apex job; false otherwise."[/i] чет пока не улавливаю чем мне это поможет найти запущенный job для определенного класса.
чет пока не улавливаю чем мне это поможет найти запущенный job для определенного класса.
Проверку в самом джобе сделать и не запускать его, если не требуется.
[quote="Dmitry Shnyrev"][i]"Returns true if the currently executing code is invoked by a scheduled Apex job; false otherwise."[/i] чет пока не улавливаю чем мне это поможет найти запущенный job для определенного класса.[/quote] Проверку в самом джобе сделать и не запускать его, если не требуется.
Type t = Type.forName(className);
System.schedule('Scheduled Job 1', '0 0 * * * ?', t.newInstance());
По сути код правильный
[quote="Dmitry Shnyrev"]Пробую так, но что-то не сильно даже сохраняется Type t = Type.forName(className); System.schedule('Scheduled Job 1', '0 0 * * * ?', t.newInstance());[/quote] По сути код правильный
Хм, все равно не догоняю. Ну узнаю я внутри job что я запущен внутри job. Чем это мне поможет найти другие запущенные jobs?
Хотя если принудительно из job сохранять его Id взятое из контекста куда-нибудь в базу то тогда это покроет случай с ручным запуском и будет работать
[quote="Gres"]Проверку в самом джобе сделать и не запускать его, если не требуется.[/quote] Хм, все равно не догоняю. Ну узнаю я внутри job что я запущен внутри job. Чем это мне поможет найти другие запущенные jobs? Хотя если принудительно из job сохранять его Id взятое из контекста куда-нибудь в базу то тогда это покроет случай с ручным запуском и будет работать [quote="Gres"]Храни jobId и убивай его, если необходжимо.[/quote]
Пользуйся:
SELECT Id, Status, ApexClass.Name
FROM AsyncApexJob
Пользуйся: [code] SELECT Id, Status, ApexClass.Name FROM AsyncApexJob [/code]
О!
нашел еще такую Штуку!!!
AsyncApexJob myJob = [SELECT Id, Status, ApexClass.Name, ApexClassID, JobType FROM AsyncApexJob];
AsyncApexJob:{Id=70728000017awzDAAQ, Status=Queued, ApexClassId=01p28000006retiAAA, JobType=ScheduledApex}
О! нашел еще такую Штуку!!! [code] AsyncApexJob myJob = [SELECT Id, Status, ApexClass.Name, ApexClassID, JobType FROM AsyncApexJob]; [/code] AsyncApexJob:{Id=70728000017awzDAAQ, Status=Queued, ApexClassId=01p28000006retiAAA, JobType=ScheduledApex}
Одновременно
[quote="Gres"]Пользуйся [/quote] :D Одновременно :D
Блин!
А вот теперь самая подлянка!
Я не могу связать CronTrigger с AsyncApexJob !
Чтобы было совсем красиво
Теперь с AsyncApexJob я могу определить факт что schedulableClass запушен,
НО я не могу его потушить через
System.abortJob(cronid);
потому что я не могу получить cronid из AsyncApexJob
Или я что-то упускаю?
Блин! А вот теперь самая подлянка! Я не могу связать CronTrigger с AsyncApexJob ! :( Чтобы было совсем красиво :( Теперь с AsyncApexJob я могу определить факт что schedulableClass запушен, НО я не могу его потушить через System.abortJob(cronid); потому что я не могу получить cronid из AsyncApexJob Или я что-то упускаю?
По ходу я не один такое http://salesforce.stackexchange.com/questions/374/linking-crontrigger-sobjects-to-scheduled-jobs-listings
Кстати, тоже многое упрощает! :)))
System.AsyncException: The Apex job named "Email Scheduler" is already scheduled for execution.
Не знал :)
Кстати, тоже многое упрощает! :))) [i]System.AsyncException: The Apex job named "Email Scheduler" is already scheduled for execution.[/i] Не знал :)