Programiści i architekci pracujący nad aplikacjami komercyjnymi często zgrzytają zębami, gdy ujrzą kolejną – ostateczną – wersję analizy procesów biznesowych klienta. Często mamy ochotę odpowiedzieć analitykowi – zrób to sobie sam! Jak się okazuje nie jest to wcale takie nierealne.
Od niedawna przyglądam się jBPM i wygląda na to, że z jego pomocą można powyższy problem rozwiązać. Szczegółowe informacje można uzyskać na stronie projektu jBPM, oraz w krótkim artykule Kamila Krasnodębskiego. Ja skupię się na praktycznych testach :)
Żeby rozpocząć zabawę należy pobrać środowisko ze stron jboss jBPM. Polecam pobranie jPDL Suite, który poza wymaganymi bibliotekami zawiera również prekonfigurowany serwer jboss oraz designera opartego na eclipse.
Ponieważ na co dzień tworzę aplikacje z wykorzystaniem Eclipse RCP, do jBPM podszedłem również od tej strony. Nie będę się tu skupiał na stworzeniu, zgodnej z wszelkimi wzorcami, pięknej aplikacji RCP. Moim celem jest jak najszybsze uzyskanie działającej aplikacji wykorzystującej jBPM. Rozpoczynamy więc od utworzenia nowego projektu pluginu RCP. W wizardzie nowego projektu zaznaczamy, że chcemy utworzyć aplikację RCP i korzystamy z wzorca Hello RCP. Jeśli próba uruchomienia aplikacji wypadnie pomyśnie, możemy zająć się dodawaniem do niej obsługi jBPM.
W katalogu głównym naszego projektu dodajemy katalog o nazwie lib i wrzucamy do niego wszystkie pliki *.jar z katalogu głównego i katalogu lib paczki instalacyjnej jbpm-jpdl. Następnie w edytorze pliku plugin.xml na zakładce Runtime, w sekcji Classpath, klikamy przycisk Add… i dodajemy wszystkie jary z katalogu lib. W tym momencie mamy już w projekcie wszystkie niezbędne zależności.
Kolejną rzeczą, którą musimy wykonać, jest konfiguracja hibernate. W naszych przykładach jako warstwy trwałości używać będziemy bazy HSQLDB. Z katalogu config paczki instalacyjnej jbpm-jpdl, do katalogu src naszego projektu kopiujemy pliki: hibernate.cfg.xml, jbpm.cfg.xml oraz log4j.properties. Po konfiguracji połączenia JDBC sekcja JDBC connection properties pliku hibernate.cfg.xml powinna wyglądać tak:
<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="hibernate.connection.url">jdbc:hsqldb:file:/db/jbpm.db</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
plik jbpm.cfg.xml powinien wyglądać tak:
<jbpm-configuration>
<jbpm-context>
<service name='persistence'
factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />
<service name='tx' factory='org.jbpm.tx.TxServiceFactory' />
</jbpm-context>
<string name='resource.hibernate.cfg.xml' value='hibernate.cfg.xml' />
<string name='resource.business.calendar'
value='org/jbpm/calendar/jbpm.business.calendar.properties' />
<string name='resource.default.modules'
value='org/jbpm/graph/def/jbpm.default.modules.properties' />
<string name='resource.converter'
value='org/jbpm/db/hibernate/jbpm.converter.properties' />
<string name='resource.action.types'
value='org/jbpm/graph/action/action.types.xml' />
<string name='resource.node.types'
value='org/jbpm/graph/node/node.types.xml' />
<string name='resource.varmapping'
value='org/jbpm/context/exe/jbpm.varmapping.xml' />
</jbpm-configuration>
Pamiętajmy o uprawnieniach zapisu w katalogu wskazanym jako katalog bazy HSQLDB w pliku konfiguracyjnym hibernate.cfg.xml.
Od tego momentu aplikacja będzie przechowywała definicje procesów biznesowych w bazie danych. Będą tam również przechowywane konkretne instancje tych procesów, co pozwala na dokończenie rozpoczętego wcześniej procesu po przerwie, bez konieczności dodatkowego oprogramowania takiej opcji.
Spróbujmy teraz dodać do naszej aplikacji akcję inicjującą bazę danych na potrzeby jBPM. Na zakładce Extensions edytora pliku plugin.xml dodajemy nowe rozszerzenie: org.eclipse.ui.actionSets. Wykorzystajmy szablon “Hello, World” dołączony do tego rozszerzenia. Jako nazwę klasy wpisujemy InitDBAction i klikamy Finish. Możemy teraz wyedytować etykiety naszego zbioru akcji, etykietę menu zawierającego akcje z naszego zbioru oraz etykietę akcji.
Następnie przechodzimy do edycji źródła klasy InitDBAction i dopisujemy na początku metody run:
JbpmConfiguration.getInstance().dropSchema();
JbpmConfiguration.getInstance().createSchema();
Podmieniamy również treść komunikatu np. na: “DB initialized”. Następnie organizujemy importy i zapisujemy plik. W ten sposób stworzyliśmy już pierwszą akcję inicalizującą bazę danych. Proponuję ją wypróbować. Po uruchomieniu akcji w pliku /db/jbpm.db.log znajdować się powinny instrukcje tworzące tabele JBPM_%.
Następnie utwórzmy nowy kontekst jBPM oraz zadbajmy o jego prawidłowe zamknięcie. W klasie Application na początku metody start() dodajmy:
JbpmConfiguration.getInstance().createJbpmContext();
Na początku sekcji finally tej metody dodajmy:
JbpmConfiguration.getInstance().getCurrentJbpmContext().close();
JbpmConfiguration.getInstance().close();
Kolejna akcja będzie ładowała definicję procesu biznesowego z pliku xml. W edytorze pliku plugin.xml klikamy prawym przyciskiem na naszym zbiorze akcji i wybieramy New/action. Wypełniamy atrybuty akcji podobnie do InitDBAction, w polach id i class wpisujemy jbpm.actions.LoadBPDefAction. Kopiujemy klasę InitDBAction i wklejamy ją jako LoadBPDefAction. W edytorze klasy LoadBPDefAction usuwamy kod inicjalizujący bazę danych, wklejamy natomiast następujący fragment kodu:
FileDialog fileDialog = new FileDialog(window.getShell(), SWT.OPEN);
fileDialog.setFilterExtensions(new String[] { "*.xml" });
fileDialog.setText("Wybierz plik definicji procesu");
String xmlFilePath = fileDialog.open();
if (xmlFilePath != null && !xmlFilePath.isEmpty()) {
ProcessDefinition processDefinition;
try {
processDefinition = ProcessDefinition.parseXmlInputStream(new FileInputStream(xmlFilePath));
JbpmContext jbpmContext = JbpmConfiguration.getInstance().getCurrentJbpmContext();
jbpmContext.deployProcessDefinition(processDefinition);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Uruchamiamy aplikację i testujemy nowo dodaną akcję z użyciu dowolnego pliku processdefinition.xml z katalogu examples paczki instalacyjnej jbpm-jpdl. W pliku jbpm.db.log naszej bazy danych powinny pojawić się inserty odpowiadające definicji procesu.
W kolejnym odcinku spróbujemy rozbudować naszą aplikację o kolejne funkcjonalności jBPM.


Bardzo Ci dziekuje za ten tutorial. Naprawde!
PS. nie wiesz moze dlaczego gdy uruchamiam aplikacje dropuje i tworzy nowa scheme ?
Fajnie, że się to komuś na coś przydaje :)
Co do usuwania tabel, spróbuj dopisać w pliku hibernate.cfg.xml linijkę: