Регистрация  |  Вход

Как запустить scheduled job по имени класса (динамически)

Товарищи, поделитесь информацией.

Как можно запусить 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 для определенного класса.

Dmitry Shnyrev
"Returns true if the currently executing code is invoked by a scheduled Apex job; false otherwise."

чет пока не улавливаю чем мне это поможет найти запущенный job для определенного класса.


Проверку в самом джобе сделать и не запускать его, если не требуется.

[quote="Dmitry Shnyrev"][i]"Returns true if the currently executing code is invoked by a scheduled Apex job; false otherwise."[/i]

чет пока не улавливаю чем мне это поможет найти запущенный job для определенного класса.[/quote]
Проверку в самом джобе сделать и не запускать его, если не требуется.

Dmitry Shnyrev
Пробую так, но что-то не сильно даже сохраняется

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]
По сути код правильный

Gres
Проверку в самом джобе сделать и не запускать его, если не требуется.

Хм, все равно не догоняю. Ну узнаю я внутри job что я запущен внутри job. Чем это мне поможет найти другие запущенные jobs?
Хотя если принудительно из job сохранять его Id взятое из контекста куда-нибудь в базу то тогда это покроет случай с ручным запуском и будет работать

Gres
Храни jobId и убивай его, если необходжимо.

[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}

Gres
Пользуйся

Одновременно

[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]
Не знал :)