Customizing an independent JMS server for Business Automation Workflow

You can deploy an independent Java™ Message Service (JMS) server instead of the embedded JMS server.

About this task

The embedded JMS server, running on the Workflow server pod, is configured by default. You can update the custom resource (CR) file to deploy an independent JMS server.

Note:

By default IBM® Business Automation Workflow Runtime is deployed with JMS running in the baw-server-0. If the pod containing JMS is restarted, Business Automation Workflow pods might experience a brief period of unavailability. If this behavior affects your environment, you can increase the Business Automation Workflow readiness probe timeout values to allow sufficient time for JMS reconnection and recovery.

If Business Automation Workflow is deployed with more than one pod replica, configure an external JMS provider to avoid potential issues during rolling updates of the baw-server pods. The external JMS pod supports only a single replica.

The JMS messaging service supports Basic Authentication (Username/Password) only, using a single built-in Business Automation Workflow service account. If you are using JMS messaging, you must use this account to communicate with the messaging service; customer-defined or external registry users are not supported.

The plain-text credentials can be found directly from the container file system at:
  • Username: /credentials/ADMIN_USERNAME
  • Password: /credentials/ADMIN_PASSWORD

Procedure

To deploy an independent JMS server:

  1. Edit the CR and add is_embedded: false to baw_configuration.jms for Business Automation Workflow Runtime, as shown in the following example:
    baw_configuration:
    -  name: instance1
       jms:
          is_embedded: false
  2. You can customize the JMS parameters, edit the CR file, and add the customized parameters to baw_configuration.jms, as shown in the following example:
    baw_configuration:
    -  name: instance1
       jms:
          is_embedded: false
          ## Enable/disable logging where logs can be sent to Elasticsearch, default is 'false'
          logging_enabled: false
          ## Specify the group which Kubernetes will change the permissions of all files in volumes to when volumes are mounted by a pod, which is specified on the pod level. With scc(on OCP) or psp(on Kubernetes), you need to map the service account to proper scc or psp, for example on OCP, use commnad line: `oc adm policy add-scc-to-user anyuid -z wfps-instance1-sa -n NAMESPACE`
          fs_group: ""
          image:
            ## Image name for Java Messaging Service container.
            repository: cp.icr.io/cp/cp4a/baw/jms
            ## Image tag for Java Messaging Service container.
            tag: "24.0.0"
            ## Pull policy for Java Messaging Service container. Default value is IfNotPresent. Possible values are IfNotPresent, Always.
            pull_policy: IfNotPresent
          tls:
            ## TLS secret name for Java Message Service (JMS)
            tls_secret_name: ibm-jms-tls-secret
          resources:
            limits:
              ## Memory limit for JMS configuration
              memory: "1Gi"
              ## CPU limit for JMS configuration
              cpu: "1000m"
            requests:
              ## Requested amount of memory for JMS configuration
              memory: "512Mi"
              ## Requested amount of CPU for JMS configuration
              cpu: "100m"
          storage:
            ## Whether to enable persistent storage for JMS
            persistent: true
            ## Size for JMS persistent storage
            size: "1Gi"
            ## Whether to enable dynamic provisioning for JMS persistent storage
            use_dynamic_provisioning: true
            ## Access modes for JMS persistent storage
            access_modes:
            - ReadWriteOnce
            ## Storage class name for JMS persistent storage
            storage_class: "{{ shared_configuration.storage_configuration.sc_fast_file_storage_classname }}"
          node_affinity:
            # Values in this field will be used as kubernetes.io/arch selector values. Default values are ['amd64','s390x','ppc64le']
            deploy_arch: []
            #-------------------------------------
            # custom_node_selector_match_expression will be added in node selector match expressions.
            # It accepts array list inputs. You can assign multiple selector match expressions except (kubernetes.io/arch)
            # Example input:
            # - key: kubernetes.io/hostname
            #   operator: In
            #   values:
            #     - worker0
            #     - worker1
            #     - worker3
            #-------------------------------------
            custom_node_selector_match_expression: []
          # Values in this field will be used as annotations in all generated pods.
          # They must be valid annotation key-value pairs.
          # Example:
          # custom_annotations:
          #   key1: value1
          #   key2: value2
          custom_annotations: {}
          # Values in this field will be used as labels in all generated pods
          # It must be valid label key value pairs
          # Example:
          # custom_labels:
          #   key1: value1
          #   key2: value2
          custom_labels: {}
          ##  JMS Server custom plain XML snippet
          ##  custom_xml: |+
          ##    <server>
          ##      <!-- custom propeties here -->
          ##    </server>
          custom_xml:
          ## JMS custom XML secret name that contains custom configuration in Liberty server.xml,
          ## put the custom.xml in secret with key "sensitiveCustom.xml"
          ## kubectl create secret generic jms-custom-xml-secret --from-file=sensitiveCustom.xml=./custom.xml
          custom_secret_name:
  3. Apply the updated CR.