W systemie Comarch ERP Enterprise wiele zadań nie jest przetwarzanych interaktywnie, lecz w kolejkach przetwarzania w tle. Pozwala to użytkownikowi na kontynuowanie pracy w trybie dialogowym, podczas gdy długotrwałe kroki przetwarzania są kontynuowane w tle. Ponadto, umożliwia to automatyczne wykonywanie stale powtarzających się lub wyzwalanych przez aktywność kroków przetwarzania.
Niniejszy artykuł opisuje sposób tworzenia aplikacji działającej w tle oraz jej wywoływanie w różnych kontekstach.
Grupa docelowa
- Programiści
- Konsultanci techniczni
Definicje terminów
- Aplikacja działająca w tle — aplikacja, która jest wykonywana w ramach zlecenia przetwarzania w kolejce przetwarzania
- Zlecenie przetwarzania — zlecenia przetwarzania są wprowadzane przez użytkownika lub generowane programowo. Obejmują one zestaw parametrów, które określają, kiedy, jak często i w której kolejce przetwarzania dana aplikacja działająca w tle ma zostać wykonana i z jakimi parametrami startowymi. Przechodzą one przez sekwencję stanów (statusów), które obejmują w szczególności W opracowaniu, Zwolnione, Zakończone lub Przerwane. Oprócz statusu, do zleceń przetwarzania mogą być przypisane komunikaty.
- Kolejka przetwarzania — kolejki przetwarzania są wprowadzane w panelu systemowym. Opisują one zasoby (liczbę połączeń, wątków, które serwery aplikacyjne itp.), które są udostępniane do realizacji zleceń przetwarzania.
- Aplikacja reorganizacyjne — aplikacje reorganizacyjne to aplikacje działające w tle, które przeprowadzają powtarzające się operacje utrzymania danych. Przykładami są usuwanie przestarzałych komunikatów lub fizyczne usuwanie rekordów danych oznaczonych do usunięcia, które nie są już referencjonowane.
- Pseudozlecenie przetwarzania — pseudozlecenia przetwarzania to zlecenia, które są uruchamiane w specjalnym trybie. Nie są one wykonywane ani w kolejce przetwarzania, ani w żaden inny sposób. Posiadają jedynie status, a także można im przypisać komunikaty. Są one generowane programistycznie, a ich cykl życia podlega w pełni jawnej, programistycznej kontroli. Z punktu widzenia użytkownika wydają się one być podrzędnymi zleceniami przetwarzania (SubJobs).
Wymagania
Zlecenia przetwarzania mogą być wprowadzane interaktywnie lub programistycznie.
Po zatwierdzeniu zlecenia przetwarzania, zostaje ono umieszczone w przypisanej kolejce przetwarzania.
W zależności od obciążenia kolejki, w pewnym momencie zlecenie przetwarzania jest wykonywane poprzez uruchomienie przypisanej aplikacji działającej w tle. Dzieje się to niezależnie od sesji użytkownika, w oddzielnej sesji, która może być również przypisana do innego użytkownika.
Gdy aplikacja działająca w tle zakończy działanie, informuje kolejkę za pomocą wartości zwracanej return value, czy zlecenie przetwarzania zostało uznane za zakończone, czy przerwane. Jeśli w aplikacji działającej w tle wystąpi nieobsługiwany wyjątek, zlecenie przetwarzania zostaje uznane za przerwane.
Rozwój
Dla aplikacji działającej w tle wymagane są co najmniej dwa obiekty deweloperskie: obiekt deweloperski typu Aplikacja oraz klasa Java. W zależności od złożoności i przypadku użycia, można dodać szereg innych obiektów deweloperskich. W tym dokumencie najpierw przedstawiono przypadek bardzo prostej aplikacji działającej w tle, a następnie omówiono bardziej szczegółowe i złożone przypadki użycia.
Proste aplikacje działające w tle
Dla prostej aplikacji działającej w tle należy utworzyć obiekt deweloperski typu Aplikacja oraz klasę Java. Te dwa obiekty zostały opisane w tej sekcji.
Obiekt deweloperski Aplikacja
Dla aplikacji działającej w tle należy utworzyć obiekt deweloperski typu Aplikacja.
Typ aplikacji
Aplikacja musi mieć zdefiniowane ustawienie W tle w polu Typ. Oznaczenie aplikacji należy dobrać w taki sposób, aby jak najlepiej odzwierciedlała jej przeznaczenie.
Szczególne zastosowanie
Dla szczególnego zastosowania aplikacji dostępne są następujące wartości:
- (brak) — aplikacja działająca w tle jest standardową aplikacją i nie podlega żadnym specjalnych regułom
- Aktualizacja danych — aplikacja jest aktualizacją danych i uruchamia się automatycznie po instalacji aktualizacji oprogramowania, która zawiera jej nową wersję. Należy upewnić się, że w momencie uruchomienia tej aplikacji wszystkie wymagane aktualizacje oprogramowania są już aktywne.
- Aktualizacja danych w tle — jest to aktualizacja danych, która stanowi aplikację działającą w tle i może być uruchomiona przez użytkownika z poziomu aplikacji Zlecenia przetwarzania
- Reorganizacja — aplikacja z tym szczególnym zastosowaniem może być używana w aplikacji Zlecenia reorganizacji. Nazwa aplikacji reorganizacyjnej musi kończyć się na Reorganization. Więcej informacji na temat aplikacji reorganizacyjnych można znaleźć w artykule Podręcznik referencyjny: Reorganizacja.
- Aplikacja z możliwością restartu — aplikacja działająca w tle, która uległa przerwaniu z przyczyn niezależnych od niej, jest wznawiana po ponownym uruchomieniu serwera aplikacji
Ustawienia prezentacji i utrzymania
Dla ustawień prezentacji i utrzymania należy wziąć pod uwagę zależności od ustawień szczególnego zastosowania:
- Prezentacja, utrzymanie
- Bez szczególnego zastosowania — aplikacja działająca w tle pojawia się w menu nawigacyjnym w podfolderze Przetwarzanie w tle odpowiedniego obszaru. Może być używana w menu użytkownika.
- Aktualizacja danych — ustawienia widoczności i utrzymania są bez znaczenia dla aktualizacji danych
- Aktualizacja danych w tle — aplikacje działające w tle są uruchamiane za pomocą aplikacji Zlecenia przetwarzania
- Reorganizacja — więcej informacji na ten temat można znaleźć w artykule Zlecenia reorganizacji
- Brak prezentacji, utrzymanie — to ustawienie jest zazwyczaj używane, aby umożliwić uruchamianie aplikacji wyłącznie w określonym kontekście za pomocą opcji uruchamiania przetwarzania następującego, czyli w sposób programistyczny, a nie przez aplikację Zlecenia przetwarzania
- Brak prezentacji, brak utrzymania — to ustawienie nie ma żadnych konsekwencji technicznych. Służy jedynie jako wskazówka, że utrzymanie aplikacji nie jest prowadzone ani planowane.
- Brak prezentacji, brak utrzymania, z kodem aktywacyjnym — to ustawienie jest tożsame z wartością Brak prezentacji, brak utrzymania i dodatkowo określa, że aplikacja może być używana tylko po podaniu kodu aktywacyjnego. W przypadku narzędzi, kod aktywacyjny może być wymagany tylko dla określonych parametrów. Kody aktywacyjne są przyznawane przez Centrum Wsparcia Comarch ERP Enterprise.
Tryb uprawnień
W polu Tryb uprawnień można określić, czy indywidualne uprawnienia użytkownika mają być sprawdzane podczas wykonywania aplikacji. W niektórych przypadkach rezygnacja z takiej weryfikacji może być celowa lub konieczna.
Obszar
Aplikacja działająca w tle musi być przypisana do obszaru. Wówczas może się ona pojawić w odpowiednim menu nawigacyjnym.
Główna jednostka biznesowa
Wskazanie głównej jednostki biznesowej decyduje o tym, dla jakich baz danych aplikacja działająca w tle jest możliwa do uruchomienia lub będzie uruchamiana.
Funkcja
Aplikacja działająca w tle może być sterowana przez funkcję.
Wymagane aktywne bazy danych
W tym miejscu należy wskazać bazy danych, które muszą być dostępne w momencie wykonywania aplikacji.
Obiekt deweloperski Klasa Java
W najprostszym przypadku, ta klasa musi dziedziczyć po klasie com.cisag.pgm.base.CisApplication. Konieczne jest zaimplementowanie metody run(…).
public class SimpleBatchApplication extends CisApplication {
public CisParameterList run(int action, CisParameterList parms) {
}
}
Komunikaty w aplikacjach działających w tle
Jeśli w aplikacji działającej w tle generowane są komunikaty, muszą one zostać przeniesione do kolejki komunikatów (MessageQueue) aplikacji wywołującej. W przeciwnym razie nie pojawią się w logach komunikatów. Z tego powodu, jedna z ostatnich instrukcji w metodzie run powinna brzmieć:
mm.sendProgramMessages(CisMessageManager.PREVIOUS);
Wartości zwracane przez aplikację działającą w tle
Aplikacja działająca w tle musi zwrócić swój status do systemu poprzez wartość zwracaną przez metodę run. Aby to ułatwić, dostępna jest klasa pomocnicza com.cisag.pgm.base.CisApplicationCallResult. Obiekt tej klasy jest tworzony za pomocą metody createInstance, a odpowiedni status ustawiany jest metodą setResult(short result). Następnie wartość zwracana przez metodę run jest generowana za pomocą metody serialize().
Poniżej przedstawiono możliwe wartości zwracane przez aplikację działającą w tle:
- COMPLETED — aplikacja działająca w tle zakończyła się pomyślnie. Zaleca się umieszczenie komunikatu informacyjnego w kolejce komunikatów (Messagequeue).
- ABORTED — aplikacja działająca w tle została przerwana. Odpowiednie komunikaty o błędach powinny zostać umieszczone w kolejce komunikatów.
public class SimpleBatchApplication extends CisApplication {
public CisParameterList run(int action,
CisParameterList parms) {
CisApplicationCallResult result =
CisApplicationCallResult.createInstance(parms);
CisMessageManager mm =
CisEnvironment.getInstance().getMessageManager();
// Do something useful …
result.setResult(CisApplicationCallResult.COMPLETED);
mm.sendProgramMessages(CisMessageManager.PREVIOUS);
return result.serialize();
}
}
Uruchamianie aplikacji działającej w tle
Aplikacje działające w tle można uruchamiać na różne sposoby. Zależy to zarówno od ustawień w powiązanym obiekcie deweloperskim Aplikacja, jak i od zamierzonego zastosowania.
Aplikacja Zlecenia przetwarzania
Jeśli aplikacja działająca w tle jest zdefiniowana jako Prezentacja, utrzymanie i nie ma szczególnego zastosowania, można ją uruchomić za pomocą aplikacji Zlecenia przetwarzania.
JobSubmitDialog
Klasa com.cisag.pgm.services.batch.JobSubmitDialog umożliwia programistyczne uruchomienie aplikacji działającej w tle, która wymaga dodatkowej interakcji z użytkownikiem. W tym celu należy utworzyć instancję JobSubmitDialog za pomocą wywołania createInstance.
Na utworzonej instancji JobSubmitDialog należy ustawić jej właściciela, którym może być albo CisUiApplication, albo VisualElement.
Ponadto, za pomocą wywołania setTitleFrom() można ustawić tytuł okna dialogowego na podstawie ciągu znaków. Pierwszym parametrem jest ścieżka do tej tabeli, a drugim – ewentualne parametry zastępcze dla występujących w ciągu znaków placeholderów.
Wywołanie setBatchJob(CisBatchJob) pozwala na ustawienie kolejnych parametrów dla przetwarzania w tle. Bezpośrednie tworzenie obiektu CisBatchJob nie jest zalecane. Zamiast tego, dostępna jest klasa serwisowa CisBatchService, która wspiera to zadanie. Użycie klasy CisBatchService zostanie opisane w kolejnym rozdziale.
Na koniec, okno dialogowe JobSubmitDialog zostaje wyświetlone poprzez wywołanie show(). Użytkownik może wprowadzić lub zmienić odpowiednie dane, a następnie uruchomić aplikację działającą w tle lub przerwać proces uruchamiania.
import com.cisag.pgm.services.batch.JobSubmitDialog;
JobSubmitDialog jsd = JobSubmitDialog createInstance():
// Entweder setOwner(CisUiApplication) oder setOwner(VisualElement)
jsd.setOwner(this);
jsd.setTitleFrom(String,String[]);
jsd.setBatchJob(cisBatchJob);
CisBatchService
Klasa com.cisag.pgm.services.batch.CisBatchService może być używana do tworzenia obiektu CisBatchJob, a także do bezpośredniego uruchamiania aplikacji działającej w tle bez interakcji z użytkownikiem.
Podczas tworzenia obiektu CisBatchJob, różne parametry dla zadania są ustawiane na wartości domyślne. Ułatwia to tworzenie poprawnych obiektów CisBatchJob. Następnie można wprowadzić dodatkowe wartości lub nadpisać niepożądane ustawienia.
CisBatchService cbs = CisBatchService.getInstance();
CisBatchJob job = cbs.createJob(false);
job.setName(„Moje przetwarzanie w tle”);
// uruchom bezpośrednio cbs.submitJob(job);
// alternatywnie, uruchom z JobSubmitDialog
//
// JobSubmitDialog dialog = JobSubmitDialog createInstance();
//
// … ustaw właściciela i tytuł …
//
// dialog.setBatchJob(cbs);
//
// dialog.show();
Parametryzacja aplikacji działających w tle
Aplikacje działające w tle można parametryzować na dwa sposoby: poprzez podanie parametru action oraz poprzez listę wartości. Parametr action służy do wyboru różnych ścieżek przetwarzania i jest zazwyczaj interpretowany w metodzie run za pomocą instrukcji switch-case. Lista wartości, w formie CisParameterList, składa się z trójek nazwa-typ-wartość, które mogą być wykorzystane w procesie przetwarzania. Dozwolone dla danej aplikacji akcje (actions) oraz ich parametry wartości muszą być zdefiniowane w obiekcie deweloperskim Aplikacja.
Aplikacje działające w tle z automatycznym edytorem
Gdy aplikacja działająca w tle, której klasa Java dziedziczy po CisApplication i dla której w obiekcie deweloperskim Aplikacja zdefiniowano jedną lub więcej akcji z parametrami, jest uruchamiana za pomocą uruchamiania aplikacji działających w tle, użytkownikowi wyświetla się wybór zdefiniowanych akcji. W zależności od wybranej akcji, pojawiają się pola wejściowe zgodne ze zdefiniowanymi parametrami. Wybrana akcja oraz wprowadzone wartości są przekazywane do metody run aplikacji w formie CisParameterList w momencie jej uruchamiania. W metodzie run wartości te można pobrać za pomocą odpowiednich metod get z obiektu CisParameterList. Jako parametr służy nazwa parametru zdefiniowana w obiekcie deweloperskim Aplikacja.
Aplikacje działające w tle z edytorem
Jeśli aplikacja jest uruchamiana za pomocą JobSubmitDialog, użytkownik może wprowadzić wartości dla parametrów zadeklarowanych w zdefiniowanej akcji.
Ten mechanizm nie jest zbyt elastyczny. Istnieje jednak możliwość zaimplementowania własnego edytora, aby móc programistycznie sterować przepływem danych między polami wejściowymi.
W JobSubmitDialog za pomocą wywołania metody setCustomTabView(Action, View) można przypisać widok, który implementuje wymagany edytor. Ten widok edytora jest następnie wyświetlany w osobnej zakładce w JobSubmitDialog. Wykorzystując Action można sterować wyglądem zakładki (etykieta, podpowiedź, itp.). Action jest wywoływana przez JobSubmitDialog, a zadaniem zarejestrowanego słuchacza (listener) jest walidacja danych i udostępnienie ich aplikacji działającej w tle. W tym procesie komunikaty mogą być generowane za pomocą Messagemanager. Zazwyczaj sam widok jest rejestrowany jako słuchacz, a wartości odczytane z widoku są wstawiane do CisParameterList obiektu BatchJob.
public class CustomView extends View implements ActionListener{
ShortField field;
CisParameterList pl;
public void init(CisParameterList pl){
this.pl = pl;
setLayout(new StandardLayout());
field =
new ShortField(Guid.AUTOGUID,
„com.cisag.app.financials.batch:StartTransferBatchesDuration.lt”);
add(field);
field.setValue(pl.getShort(„StartTransferBatchesDuration”));
}
public void performAction(Action action) {
// validate field … if not ok, send some error-message
mm.sendMessage(„APP”,333);
pl.setShort(„StartTransferBatchesDuration”,
field.getValue());
}
}
Zastosowanie:
com.cisag.pgm.services.batch.JobSubmitDialog dialog =
obSubmitDialog createInstance()
setOwner(…)
setTitleFrom(…,…);
dialog.setBatchJob(CisBatchJob)
CustomView customView = new CustomView();
Action customViewAction = new Action(“…“);
customViewAction.register(customView);
dialog.setCustomTabView(customViewAction, customView)
dialog.show();
Edytor przetwarzania w tle
Metodę implementowania własnego edytora, opisaną w poprzednim rozdziale, można jeszcze uprościć.
W tym celu aplikacja działająca w tle musi dziedziczyć po CisBatchApplication i dodatkowo implementować metodę createEditor(). Metoda ta musi zwracać obiekt, który jest instancją klasy dziedziczącej po CisBatchApplicationEditor.
public class BatchApplicationTest extends CisBatchApplication {
@Override
public CisBatchApplicationEditor createEditor() {
// TODO Auto-generated method stub
return new BatchApplicationTestEditor();
}
@Override
public CisParameterList run(int action, CisParameterList parms)
{
CisApplicationCallResult result =
CisApplicationCallResult.createInstance(parms);;
return result.serialize();
}
}
class BatchApplicationTestEditor extends CisBatchApplicationEditor
{
private static final int MSG = 42;
private View contentPane;
private ShortField field;
private short actionId;
public boolean isOnlineSubmitEnabled() {
// online execution is not allowed, otherwise return true
return false;
}
public void init(int visualizationType) {
contentPane = new View(new StandardLayout());
field =
new ShortField(Guid.AUTOGUID,
„com.cisag.app.financials.batch:StartTransferBatchesDuration.lt”);
contentPane.add(field);
field.registerMessage(MSG);
}
public VisualElement getVisualElement() {
return contentPane;
}
public short getActionId() {
return actionId;
}
public void applyDefaults() {
// set defaults to fields
}
public void dataToUi() {
// copy data from parameterlist to fields
}
public void dataFromUi() {
// copy data from fields to parameterlist
}
public void validate() {
// validate values and send messages if necessary
}
}
Aplikacje z kodem aktywacyjnym
Jeśli dla aplikacji działającej w tle ustawiono wartość Brak prezentacji, brak utrzymania, z kodem aktywacyjnym, to do jej wykonania wymagane jest podanie kodu aktywacyjnego. Kod aktywacyjny jest ważny tylko w określonym czasie. Kody aktywacyjne są przyznawane przez Centrum Wsparcia Comarch ERP Enterprise.
Jeśli aplikacja ma być uruchomiona interaktywnie za pomocą JobSubmitDialog, w oknie dialogowym dostępne jest pole Kod aktywacyjny, w które należy wpisać ważny kod, zanim aplikacja zostanie otwarta.
Jeśli aplikacja ma być uruchomiona programistycznie, zazwyczaj za pomocą metod CisBatchService.callJob(CisBatchJob) lub CisApplicationManager.callApplication(CisApplicationCall), lista parametrów przekazywanego obiektu musi zawierać specjalny parametr typu String o nazwie UNLOCK_CODE z ważnym kodem aktywacyjnym jako wartością.
Aplikacje z możliwością ponownego uruchomienia
Aplikacja działająca w tle może zostać przerwana z przyczyn leżących po jej stronie, np. z powodu wyjątku, lub z przyczyn niezależnych od niej, np. ponowne uruchomienie serwera aplikacji. Aplikacje z możliwością ponownego uruchomienia są automatycznie wznawiane po takim przerwaniu (niezależnym od aplikacji) po ponownym uruchomieniu serwera aplikacji. Aby oznaczyć aplikację jako taką, w jej obiekcie deweloperskim należy wybrać wartość Aplikacja z możliwością restartu lub Usługa.
Zazwyczaj, po ponownym uruchomieniu aplikacja nie powinna rozpoczynać pracy od początku, lecz kontynuować ją od punktu przerwania lub ostatniego udanego zatwierdzenia transakcji. Aby wspierać takie zachowanie, klasa CisBatchApplication oferuje interfejs, za pomocą którego można w sposób transakcyjny zapisać bieżący stan aplikacji.
Dane statusowe
Klasa CisBatchApplication udostępnia interfejs, który umożliwia zapis danych o bieżącym stanie przetwarzania. Można w tym celu wywołać następujące metody:
protected final void putStatusData(CisParameterList statusData)
protected final CisParameterList getStatusData()
Poprzez wywołanie putStatusData informacje o już wykonanych krokach roboczych mogą zostać zapisane w bazie danych jako CisParameterList. Dane te stają się trwałe dopiero po zatwierdzeniu powiązanej transakcji nadrzędnej. Zatem, rozsądnie jest wywoływać tę metodę w tej samej transakcji, która obejmuje właściwe kroki przetwarzania. Dane statusowe można odczytać ponownie, wywołując getStatusData.
Ten mechanizm działa w opisany sposób tylko wtedy, gdy aplikacja działająca w tle jest wykonywana w kolejce. Gdy aplikacja jest wykonywana w sesji dialogowej, np. po wybraniu przycisku [Natychmiast] w aplikacji przetwarzania w tle, getStatusData zawsze zwraca pustą CisParameterList.
Zlecenia podrzędne (SubJobs)
Aplikacja działająca w tle może samodzielnie uruchamiać kolejne aplikacje działające w tle. Zazwyczaj aplikacja startująca będzie czekać na wyniki swoich zleceń podrzędnych, na przykład dlatego, że są one potrzebne do dalszego przetwarzania.
Uruchamianie wielu zleceń podrzędnych umożliwia zasadniczo równoległe wykonywanie kroków roboczych. Jednakże, użycie zleceń podrzędnych jedynie stwarza możliwość paralelizacji. Aby móc z niej korzystać w trakcie działania, kolejka przetwarzania musi być odpowiednio skonfigurowana.
Jeśli do kolejki zostanie przypisane jest wiele połączeń, wiele zleceń podrzędnych może być przetwarzanych na jednym serwerze SAS. Jeśli kolejka jest skonfigurowana jako kolejka rozproszona, zlecenia podrzędne mogą być przetwarzane na wielu serwerach SAS.
Gdy zlecenia podrzędne są uruchamiane przez aplikację działającą w tle, ta aplikacja zostaje tymczasowo zatrzymana. W razie potrzeby można ustawić, aby aplikacja startująca została ponownie uruchomiona po zakończeniu wszystkich zleceń podrzędnych.
Jeśli aplikacja nie ma być ponownie uruchamiana, jej status zostanie ustawiony na Zakończone dopiero po pomyślnym zakończeniu wszystkich zleceń podrzędnych. Jeśli ma być ponownie uruchomiona, jej status zostanie ustawiony na Zakończone tylko wtedy, gdy zostanie on odpowiednio ustawiony za pomocą wartości zwracanej przez metodę run.
public class SubJobTest extends CisApplication {
private final static int RESTART = 999;
public CisParameterList run(int action, CisParameterList parms)
{
CisApplicationCallResult result =
CisApplicationCallResult.createInstance(parms);
CisBatchService cbs = CisBatchService.getInstance();
switch(action) {
case RESTART:
// do something with the results of the subjob ….
result.setResult(CisApplicationCallResult.COMPLETED);
break;
default:
CisBatchJob subJob = cbs.createSubJob(parms);
// make other settings for subJob …
short state = cbs.submitJob(subJob);
byte[] subJobGuid = subJob.getGuid();
CisList batchJobGuids = new CisArrayList();
CisList failed = new CisArrayList();
if(state == CisBatchService.SUCCESS) {
batchJobGuids.add(subJobGuid);
} else {
failed.add(subJobGuid);
}
result.setWaitForBatchJobs(batchJobGuids, RESTART,
parms);
result.setResult(CisApplicationCallResult.COMPLETED);
}
return result.serialize();
}
}
Pseudozlecenia przetwarzania
Połączenie zleceń przetwarzania z komunikatami jest wbudowanym w system mechanizmem do protokołowania kroków przetwarzania. Użytkownik może w ten sposób przeglądać wszystkie komunikaty wygenerowane dla danego zlecenia. Czasami jednak liczba komunikatów nie jest odpowiednio ustrukturyzowana. Można by to lepiej zorganizować, tworząc zlecenia podrzędne dla mniejszych jednostek przetwarzania. Wiąże się to jednak z drastycznym wzrostem technicznego nakładu administracyjnego i zużycia zasobów.
Dla tego przypadku użycia aplikacje działające w tle można uruchamiać w specjalnym trybie. Aplikacja jest wtedy ignorowana przez standardowe kolejki przetwarzania. Zamiast tego, musi istnieć aplikacja serwisowa, która zarówno implementuje właściwą funkcjonalność, jak i steruje statusem aplikacji działającej w tle.
Aplikacja startująca musi początkowo ustawić status aplikacji na Udostępniona poprzez wywołanie metody setRelease(java.lang.Boolean) na obiekcie CisBatchJob. Aplikacja serwisowa przetwarzająca zlecenie musi ustawić status na aktywny podczas przetwarzania, a po zakończeniu – na Zakończone. Dopiero wtedy przetwarzanie w tle może zostać usunięte z kolejki.
Aplikacja tego typu może generować komunikaty o błędach, ale musi wtedy zmienić swój status na Przerwane. Aplikacja startująca jest informowana o finalnym statusie aplikacji działającej w tle. Sposób powiadamiania można określić za pomocą metody CisBatchJob#setNotificationMode(short). Można powiadomić użytkownika za pomocą okna dialogowego lub wywołać zdarzenie w workflow. Obie opcje mogą dotyczyć wszystkich komunikatów lub tylko komunikatów o błędach.
CisBatchService cbs = CisBatchService.getInstance();
CisBatchJob cbj = cbs.createJob(params);
cbj.setStartMode(com.cisag.pgm.services.batch.BatchJobStartMode.APP
LICATION);
// set other values for the job,
// especially set an user readable name
cbs.changeJobState(JobStateAction. RELEASE_JOB);
cbs.callJob(cbj);
cbs.changeJobState(JobStateAction. ACTIVATE_JOB);
// do something useful
// if error, or anything other to report …
cbs.sendMessage(CisMessageManager.PROGRAM, cbj.getGuid());
cbs.changeJobState(JobStateAction. COMPLETE_JOB);