TaskCentre – Uruchomienie taska przez taska

Czasami zdarza się tak że potrzeba uruchomić innego taska z poziomu kolejnego taska żeby np. przetworzyć coś w pętli asynchronicznej. W tym właśnie celu powstaje ten wpis. Będzie on rozbudowany o kilka dodatkowych informacji i trików, jednak jeżeli potrzebujesz tylko listingu kodu to odwołaj się do tematu źródłowego: Execute a task from within another task using the TaskCentre API.

Pełen kod który umożliwia uruchomienie taska. Należy go wkleić w Run Script (VBScript).

Dim Server, UserName, Password
Dim TCAPI, Session, TaskItem, TaskID
Dim Vars, Param
Dim DispStr
Dim datavalue
Dim customerid

Const LogonTaskcentre = 1
Const LogonWindows = 2

' Podaj ID taska który ma zostać uruchomiony
TaskID = xxxxx

' Podaj pełne dane do logowania dla TaskCentre(użytkownik na którym ma zostać wykonane zadanie)
Server = "localhost"
UserName = "API_User" 
Password = "password"

' Sekcja podłączenia TaskCentre i logowania do aplikacji
Set TCAPI = CreateObject("Iwcltcp.TCAPI")
Set Session = TCAPI.Logon(LogonTaskcentre, Server, UserName, Password)
Set TaskItem = Session.OpenTaskItem(TaskID)
Set Vars = TaskItem.Variables 'This enables Variables to be passed to the new task

' Przypisanie wartości do zmiennych
datavalue = some variable Or recordset Value
customerid = some variable Or recordset Value

' Przypisanie zmiennych do parametrów
Vars.Item("DynamicCompany").ParameterValue = datavalue
Vars.Item("customerid").ParameterValue = customerid

' Uruchamia określone zadanie i czeka aż zostanie skończone żeby ruszyć do kolejnego kroku
TaskItem.Runsync 
' LUB
' Uruchamia określone zadanie asynchronicznie i od razu przechodzi do kolejnego kroku
TaskItem.QueueTask

 

Skąd wziąć ID taska do uruchomienia?

Otwórz konkretnego taska i na zakładce General przejdź do Options. W Options przejdź do Advanced i znajdziesz tak sekcję Identification w której masz Task ID. Id będzie zapisanie na zasadzie np.: 00000108. Zara wiodące usuwamy i wpisujemy TaskID = 108. Może się zdarzyć że Task będzie miał ID równe 0. Trzeba wtedy usunąć taska i założyć go na nowo tak aby miał minimalny ID równe 1, wtedy nie sypie błędem że nie znalazł wskazanego taska.

TaskID

 

Jakie wpisać dane użytkownika?

Dane użytkownika możemy wziąć z ogólnej konfiguracji TaskCentre. W tym celu przechodzimy w lewym menu do TaskCentre > System > Users. Zakładamy nowego użytkownika który będzie odpowiedzialny za uruchamianie zadań. Swojemu użytkownikowi nadałem nazwę API_User i przypisałem hasło haslo12345. Przechodzimy również na zakładkę Server Roles i zaznaczamy System Administrators. Ta flaga przypisze nam wszystkie inne uprawnienia dla zakładanego konta. Jeżeli wiesz że konto będzie potrzebowało znacznie mniej uprawnień możesz je w tym miejscu wyłączyć. Dla tego przykładu zostały nadane pełne uprawnienia.

Zakladanie_Usera

 

Jak przekazać zmienne?

W tasku do którego chcemy przekazać zmienną musimy ją najpierw utworzyć. W tym celu otwieramy naszego taska i w przyborniku przechodzimy na zakładkę Envoiment > Scope: Task i w sekcji Variables dodajemy nową zmienną. Po nadaniu jej nazwy przechodzimy na zakładkę Details i oznaczamy Parameter = TRUE oraz Parameter Attributes: In, Out a Scope: Task Instance.

zmienna

Przygotowany kod na chwilę obecną wygląda tak jak na listingu poniżej.

Dim Server, UserName, Password
Dim TCAPI, Session, TaskItem, TaskID
Dim Vars, Param
Dim DispStr
Dim datavalue
Dim customerid

Const LogonTaskcentre = 1
Const LogonWindows = 2

TaskID = 108

Server = "localhost"
UserName = "API_User" 
Password = "haslo12345"

Set TCAPI = CreateObject("Iwcltcp.TCAPI")
Set Session = TCAPI.Logon(LogonTaskcentre, Server, UserName, Password)
Set TaskItem = Session.OpenTaskItem(TaskID)
Set Vars = TaskItem.Variables

input = "moja_wartosc_zmiennej_input"
Vars.Item("INPUT").ParameterValue = input

TaskItem.Runsync

kod

Podczas podawania zmiennych został zastosowany poniższy zapis ze względu na wewnętrzne mechanizmy TaskCentre odpowiadające za ustawianie wartości zmiennych. O ile w przypadku podawania zmiennej tekstowej z palca problem nie wystąpi o tyle podczas przypisania do parametru jakiejś zmiennej wewnętrznej otrzymamy dziwny błąd.

input = "moja_wartosc_zmiennej_input"
Vars.Item("INPUT").ParameterValue = input

Jeżeli chcesz przypisać zmienną do parametru wchodzącego to należy zrobić to 2 etapowo, właśnie w taki brzydki sposób.

input = Variables("JAKAS_WARTOS_VARSOW")
Vars.Item("INPUT").ParameterValue = input

 

Czy można z poziomu taska uruchomić tego samego taska? Można!

Najlepiej w tym celu uruchamiać taski asynchronicznie, tak aby nie były od siebie zależne. W tym celu musisz użyć komendy

' Uruchamia określone zadanie asynchronicznie i od razu przechodzi do kolejnego kroku
TaskItem.QueueTask

Dodatkowo przejdź na zakładce General taska w Options > Advanced i zaznacz w zmiennej Maximum Concurrent Instances jako Unlimited Instances. Możesz teraz bez problemowo uruchomić wiele tych samych tasków asynchronicznie podając im różne parametry wejściowe.

Kasztelan Paweł

Programista samouk, zakochany w ZF i Laravel, szerzący opinię że PHP + JS + HTML + CSS to są języki w których może zostać stworzona aplikacja równie dobra, a nawet lepsza od twardego klienta.