Instalacja JBPM

jBPM to elastyczny pakiet Business Process Management (BPM). Jest lekki, w pełni open-source (dystrybuowany na licencji Apache License 2.0) i napisany w Javie. Umożliwia modelowanie, wykonywanie i monitorowanie procesów biznesowych i przypadków przez cały cykl ich życia.

jBPM korzysta z następujących komponentów:

  • Serwera aplikacji WildFly (wersja community Jboss Entreprise Application Server) rozwijanej przez Red Hat 
  • Drools jako silnik reguł biznesowych, Artemis JMS do obsługi komunikacji między komponentami,
  • KIE Server - lekki serwer wykonawczy, który służy do uruchamiania procesów biznesowych BPMN, reguł Drools oraz optymalizacji OptaPlanner. Jego główną rolą jest wykonywanie tych elementów w oparciu o zadania przekazywane przez API (REST lub JMS). Sam KIE Server nie oferuje interfejsu graficznego do modelowania – jest jedynie serwerem uruchamiającym procesy i reguły. Kiedy finalnie uruchomisz http://localhost:8080/business-central połączysz sie właśnie z KIE Server
  • KIE Workbench - aplikacja webowa działająca na serwerze aplikacyjnym (np. WildFly), która udostępnia graficzny interfejs do modelowania procesów BPMN, zarządzania regułami Drools i tworzenia formularzy.

Pobranie JBPM i przygotwanie systemu operacyjnego

jBPM wymaga Maven. jBPM jest zbiorem bibliotek i zależności zewnętrznych (np. Hibernate, Drools, itp.), które muszą być zainstalowane i dostępne podczas kompilacji i uruchamiania aplikacji. Maven pozwala na łatwe zarządzanie tymi zależnościami jBPM jest podzielone na różne moduły (np. jBPM core, jBPM console, jBPM human task, itp.), z których każdy może mieć swoje własne zależności. Maven pozwala na zarządzanie tymi zależnościami i modułami w sposób spójny, co ułatwia zarówno rozwój, jak i utrzymanie projektu.

Maven

Pobierz Maven ze strony https://maven.apache.org/download.cgi a następnie dodaj do zmiennych Windows 'MAVEN_HOME' oraz  do zmiennej 'PATH' scieżkę '%MAVEN_HOME%\bin'.

Repozytorium projektów JBPM będzie domyślnie przechowywane w:

C:\Users\user\.m2\repository

Możesz to zmienić ustawiając zmienna M2_HOME z odpowiednią ścieżką.

Java

JBPM nie uruchamia się w środowisku Java wyższym niż versja 8. Pobierz JDK np w wersji 'jdk8u432-b06'. Nie musisz ustawiać JAVA_HOME ze wskazaniem na tę wersję, wystarczy że ustawisz ją w pliku który uruchamia JBPM, standalone.bat:

set "JAVA_HOME=C:\Program Files\Java\jdk8u432-b06"

Pobranie JBPM

Ze strony https://www.jbpm.org/download/community.html pobierz zip oznaczony 'Download jBPM 7.74.1.Final server (single zip) distribution'. Po rozpakowaniu na dysku, upenij się że system będzie miał prawo zapisu w katalogach JBPM - pisanie do pliku konfiguracyjnego, tworzenie XML z ustawieniami serwera, pobieranie konektorów bazy danych i tworzenie konfiguracji połączenia.

Przygotowanie bazy danych

Domyślna instalacja JBPM zawiera baze danych H2. Do celów produkcyjnych potrzebujesz innej. Jeśli zdecydujesz sie na skorzytanie z MySQL lub Postgresql, JBPM ma skrypt ktory wykona konfigurajcę za Ciebie. Najlepszym pomysłem będzie użycie Postgresql (MySQL czesto faktycznie jest bazą MariaDB, domyslny konektor ktory przychodzi z instalacja JBPM nie wspolpracuje z MySQL w Windows a po instalacji mysql-connector-java-5.1.49-bin.jar JBPM mimo ze uzywa bazy, zglasza w logu bledy o niekompatybilnosci). Użyjemy zatem Postgresql.

Instalacja Postgresql

Nie musisz instalować bazy Postgres trwale w systemie. Do celów testu wystarczy pobranie np postgresql-17.0-1-windows-x64-binaries ze strony https://www.postgresql.org/download/. Po rozpakowaniu zip uruchom polecenia:

# Inicjacja bazy (wcześniej ustaw użytkownika w config, katalogu share). Katalog 'data' przechowuje dane.
initdb -D Z:\Postgresql\data -U postgres -A scram-sha-256 --pwprompt
# Uruchamianie 
pg_ctl -D "Z:/Postgresql/data" -l "plik_dziennika.log" start
# Sprawdzanie statusu
pg_ctl -D "Z:/Postgresql/data" status
# Zatrzymanie:
pg_ctl -D "Z:/Postgresql/data" stop

Utworz baze, użytkownika dla JBPM i nadaj uprawnienia

Dobrym pomysłem będzie użycie DBeaver - jest lżejszy niż PGAdmin. Korzystając z tego GUI (zaznacz opcje 'show all databases' we właściwościach połączenia) utwórz baze 'jbpm', użytkownika 'jbpm' z hasłem 'jbpm' (to test) a następnie wykonaj szereg poleceń SQL by nadać temu użytkownikowi odpowiednie uprawnienia:

GRANT CONNECT ON DATABASE jbpms TO jbpm;
GRANT USAGE ON SCHEMA public TO jbpm;
GRANT CREATE ON SCHEMA public TO jbpm;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jbpm;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO jbpm;

Przygotowanie pliku konfiguracyjnego JBPM

Konfiguracja połączenia z bazą danych

Wejdż do katalogu 'bin' JBPM i wykonaj następujące polecenie (doda ono niezbędne dyrektywy do pliku konfiguracyjnego standalone.xml, pobierze konektor Postgresql, utworzy katalog 'modules\org\postgres\main')

jboss-cli.bat --file=jbpm-postgres-config.cli

Polecenie to dodało linie:

<system-properties>
        <property name="org.kie.server.persistence.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
...
<datasources>
                <xa-datasource jndi-name="java:jboss/datasources/jBPMDS" pool-name="jBPMXADS">
                    <xa-datasource-property name="ServerName">
                        localhost
                    </xa-datasource-property>
                    <xa-datasource-property name="PortNumber">
                        5432
                    </xa-datasource-property>
                    <xa-datasource-property name="DatabaseName">
                        jbpm
                    </xa-datasource-property>
                    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                    <driver>postgres</driver>
                    <security>
                        <user-name>jbpm</user-name>
                        <password>jbpm</password>
                    </security>
                    <validation>
                        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
                        <validate-on-match>true</validate-on-match>
                        <background-validation>true</background-validation>
                        <background-validation-millis>120000</background-validation-millis>
                        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
                    </validation>
                </xa-datasource>
..
<drivers>
                    <driver name="postgres" module="org.postgres">
                        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                  </driver>

Możesz usunąć teraz datasource H2, driver H2.

                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
...
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>

JBPM ciągle jednak nie będzie używać Postgres jako bazy danych. By tak się stało zmień default-bindings (zmień wskazanie na datasource):

<default-bindings .... datasource="java:jboss/datasources/jBPMDS" ..../>

Ustawienie dostępności pamięci

Domyślnie jBPM startuje z następującą alokacją pamięci (ustawienia w standalone.conf.bat):

set "JAVA_OPTS=-Xms64M -Xmx1512M -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=512m"

Zalecane jest zwiększenie tych wartości dla przeciętnie obciążonego systemu:

JAVA_OPTS="-Xms256M -Xmx2048M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=1024M"

Mail [SMTP]

Będziesz potrzebować komunikacji smtp by wysyłać maile z powiadomieniami o taskach oczekujących na realizację lub w innych celach.  W tym celu połącz sie z WildFly CLI:

jboss-cli.bat

Następnie wpisz 'connect', prompt zmieni się na:

[standalone@localhost:9990 /]

Wykonaj kolejno trzy polecenia:

/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=jbpm-mail-smtp/:add(host=smtp.email.com, port=465)

/subsystem=mail/mail-session=jbpm/:add(jndi-name=java:/jbpmMailSession, from=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.)

/subsystem=mail/mail-session=jbpm/server=smtp/:add(outbound-socket-binding-ref=jbpm-mail-smtp, ssl=true, username=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript., password=password)

Rozłącz się z WildFly. W efekcie tych poleceń do pliku standalone.xml zostanie wpisana konfiguracja serwera oraz sesji e-mail. Oto co znajdziesz w ustawieniach:

        <subsystem xmlns="urn:jboss:domain:mail:4.0">
            <mail-session name="jbpm" jndi-name="java:/jbpmMailSession" from="Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.">
                <smtp-server outbound-socket-binding-ref="jbpm-mail-smtp" ssl="true" username="Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript." password="xxxx"/>
            </mail-session>
        </subsystem>
...
        <outbound-socket-binding name="jbpm-mail-smtp">
            <remote-destination host="mail.pl" port="465"/>
      </outbound-socket-binding>

jBoss potrafi wykorzystywać różne sesje email. To jakiej sesji użyje jBPM możesz wpisać na stałe do standalone.xml w sekcji <system-properties>:

<property name="org.kie.mail.session" value="java:/jbpmMailSession"/>

Możesz też startować jbpm z parametrem sesji:

standalone.bat -Dorg.kie.mail.session=java:/jbpmMailSession

Interfejsy [http, https]

Jeśli chesz by Twoja instalacja była dostępna z innego miejsca niz localhost, zmień domyślne zapisy w sekcji:

    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
        </interface>
        <interface name="unsecure">
            <inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/>
        </interface>
    </interfaces>

'Public' to interfejs dostępny dla użytkowników aplikacji. W konfiguracji standalone.xml jest jeszcze kilka innych miejsc  do ustawień sieciowych; nazwa serwera, komunikacja wsdl itd.

Uruchamianie jBPM

JBPM uruchamisz po prostu wykonujac standalone.bat z katalogu bin. Domyślnie użyty zostanie plik konfiguracyjny standalone.xml  z katalogu standalone/configuration. Jeśli chcesz wskazać inny plik konfiguracyjny wykonaj polecenie:

standalone.bat -c plik-konfiguracyjny.xml

Po uruchomieniu jBPM wpisz w przeglądarce https://localhost:8443/business-central/ a następnie zaloguj się kontem administratora: wbadmin/wbadmin

Certyfikat TLS

Przy pierwszym uruchomieniu jBPM stworzy self-signed certyfikat TLS wgra go do utworzonego podczas startu keystore. Jeśli chcesz używać innego certyfikatu, wgraj go do keystore jBPMKeystore.jceks który znajduje w katalogu standalone/configuration. Możesz użyć w tym celu wygodnego GUI https://keystore-explorer.org/

Przechowywanie dokumentów

Domyślne 'Marshalling strategies' jBPM przechowują dokumenty w katalogu 'bin\.docs'.  Możesz zmienić tę lokalizację wstawiając w <system-properties> zapis:

<property name="org.jbpm.document.storage" value="Z:/jbpm/xx/.docs"/>

Potencjalne problemy

Jesli server nie bedzie posiadac capabilities 'process', usun server i zresetuj jBPM