← SkillForge / Articles / TIBCO BW6 Administration
SkillForge Article · Middleware Administration

TIBCO BW6 Administration

A developer's complete guide to administering TIBCO BusinessWorks 6 and Container Edition in enterprise production — from day one operations to deep debugging.

🔴 TIBCO BusinessWorks 6.x + CE 🏭 Enterprise Production 🎯 Developer → Admin transition

1. Admin Mindset for Developers

Developers transitioning into admin roles carry a significant advantage: they understand what the applications are supposed to do. Most infrastructure admins do not. When something breaks, a developer-turned-admin can reason about application behavior, data flow, and integration logic — not just infrastructure health. This perspective is the foundation of effective BW6 administration.

Developer Thinking

  • Focus: make the app work correctly
  • Unit: single application / process
  • Success: feature passes tests
  • Timeframe: sprint / release cycle
  • Tools: TIBCO Studio, debugger

Admin Thinking

  • Focus: keep ALL apps running reliably
  • Unit: platform + all applications
  • Success: zero unplanned downtime
  • Timeframe: always-on, right now
  • Tools: TEA, logs, OS, monitoring
Day-one principle: Never make a change in production without knowing how to reverse it. Before touching anything, write down the current state — running app version, config values, process counts. This is your rollback baseline.
Own the logs. 80% of admin work is log analysis. Know where every log file is before anything breaks.
Understand the data flow first. Before you can diagnose a production issue, you need to know: what sends messages in, what processes them, and where they go out.
Automation is safety. Any manual step you do more than twice should become a script. Manual steps cause mistakes under pressure.

2. BW6 Architecture — What You're Administering

Understanding the runtime architecture is the foundation of everything else. BW6 is not the same as BW5 — it's a fundamentally different OSGI-based runtime.

Core Components

┌─────────────────────────────────────────────────────────┐
│ TIBCO Enterprise Message Service (EMS) │
│ (optional — central messaging backbone) │
└────────────────────────────┬────────────────────────────┘

┌────────────────────────────▼────────────────────────────┐
│ TIBCO Administrator / TEA │
│ (management plane — deploy, config, monitor) │
└───────┬──────────────────────────────┬──────────────────┘
│ │
┌───────▼──────────┐ ┌───────────▼──────────────────┐
│ BW Domain 1 │ │ BW Domain 2 │
│ ┌─────────────┐ │ │ ┌─────────────────────────┐ │
│ │ BW Agent │ │ │ │ BW Agent (per node) │ │
│ └──────┬──────┘ │ │ └────────────┬────────────┘ │
│ ┌──────▼──────┐ │ │ ┌────────────▼────────────┐ │
│ │ AppNode 1 │ │ │ │ AppNode 1 AppNode 2 │ │
│ │ (JVM proc) │ │ │ │ (JVM proc)(JVM proc) │ │
│ └─────────────┘ │ │ └─────────────────────────┘ │
└──────────────────┘ └───────────────────────────────┘

Key Runtime Concepts

ComponentWhat it isAdmin responsibility
BW DomainLogical group of BW applications managed together. Maps to an environment (Dev, Test, Prod)Create, configure, manage per environment
BW AgentProcess on each machine that communicates with Administrator. Must be running for any admin operationsEnsure running at all times; auto-start on boot
AppNodeJVM process hosting one or more BW applications. Has its own heap, threads, and portsSize heap, monitor memory, restart on crash
AppSpaceLogical grouping of AppNodes that share the same deployed applicationsScale AppNodes, manage load distribution
ApplicationThe deployed EAR/AAR artifact — the BW6 app built by developersDeploy, configure, start/stop, version manage
Shared ModuleShared library (JDBC drivers, EMS jars, custom connectors) available to all apps in domainVersion control, deploy before apps need them

The OSGI Runtime

BW6 runs on an OSGI (OSGi Alliance) container — every BW process is a bundle within a Felix OSGI framework. This matters for admin because:

Class loading is per-bundle — driver version conflicts between apps are isolated (unlike BW5)
Each AppNode is a separate JVM — a crash in one AppNode does not affect other AppNodes
Plugins are OSGI bundles — when a connector fails to load, look for bundle activation errors in logs

Process Instance Lifecycle

# A BW6 process instance goes through these states:
Created → Running → [Suspended] → [Checkpoint] → Completed
                                                 ↘ Faulted → Dead Letter

# Admin actions per state:
Running  → can kill/suspend via TEA
Suspended → can resume or kill
Faulted  → investigate via TEA process monitor, re-run or kill

3a. Docker & Container Fundamentals for BWCE

Before you can administer BWCE, you need to own Docker. As a BWCE admin you're not just running containers — you're building them, inspecting them, and diagnosing them. This section gives you everything you need.

Why Containers Change Everything for BW6

Traditional BW6 Problems Containers Solve

  • "Works on Dev, fails on Prod" — eliminated by immutable images
  • Manual server setup and patching — replaced by image rebuilds
  • Shared library conflicts between apps — each image is isolated
  • Slow scaling — containers start in seconds vs VM minutes
  • Environment config drift — ConfigMaps enforce consistency

New Challenges Containers Introduce

  • Ephemeral storage — restart = data loss unless externalized
  • Image management — registry, versioning, vulnerability scanning
  • Networking — service discovery replaces static IPs
  • Observability — logs, metrics need aggregation infrastructure
  • Secrets management — cannot bake credentials into images

BWCE Docker Image Architecture

A BWCE image is built in layers. Understanding this is critical for diagnosing build failures and optimizing image size.

┌─────────────────────────────────────────────────────────────┐
│ Layer 5: Application Layer (YOUR EAR + appconfig.ini) │
│ Dockerfile: COPY MyApp-1.0.ear /bw/apps/ │
├─────────────────────────────────────────────────────────────┤
│ Layer 4: Plugin/Connector Layer (HTTP, JDBC, EMS plugins) │
│ Dockerfile: COPY plugins/ /bw/plugins/ │
├─────────────────────────────────────────────────────────────┤
│ Layer 3: BW6 Runtime Engine (OSGI bundles, engine jars) │
│ FROM tibco/bwce:2.x.x (TIBCO base image) │
├─────────────────────────────────────────────────────────────┤
│ Layer 2: JDK Layer (Java runtime) │
│ FROM eclipse-temurin:11-jre OR openjdk:11-jre │
├─────────────────────────────────────────────────────────────┤
│ Layer 1: Base OS (RHEL UBI / Alpine / Debian slim) │
│ FROM registry.access.redhat.com/ubi8/ubi-minimal │
└─────────────────────────────────────────────────────────────┘

Runtime (what gets added when container starts):
┌─────────────────────────────────────────────────────────────┐
│ Environment Variables → override appconfig.ini at runtime │
│ ConfigMap mounts → /bw/appconfig/ directory │
│ Secret mounts → /bw/secrets/ directory │
│ Volume mounts → /bw/checkpoint/ (persistent state) │
└─────────────────────────────────────────────────────────────┘

BWCE Dockerfile — Anatomy of Every Build

# Standard BWCE Dockerfile — understand every line

# Stage 1: Start from TIBCO's official BWCE base image
FROM tibco/bwce:2.8.0 AS bwce-base
# This image contains: BW6 engine, OSGI runtime, startup scripts
# Get exact version from: https://hub.docker.com/r/tibco/bwce/tags

# Stage 2: Install required connector plugins
# Plugins NOT in base image must be explicitly added
COPY plugins/com.tibco.bw.palette.ems-7.x.x.zip /bw/connectors/
COPY plugins/com.tibco.bw.palette.rest-7.x.x.zip /bw/connectors/
COPY plugins/com.tibco.bw.palette.jdbc-7.x.x.zip /bw/connectors/

# Stage 3: Copy 3rd party libraries (JDBC drivers, EMS client)
COPY lib/postgresql-42.x.x.jar /bw/lib/
COPY lib/tibjms.jar /bw/lib/

# Stage 4: Copy your application EAR
COPY target/MyIntegrationApp-1.0.0.ear /bw/apps/

# Stage 5: Copy certificates (if needed for TLS)
COPY certs/truststore.jks /bw/config/certs/

# Stage 6: Expose the port(s) the BW app listens on
EXPOSE 8080
EXPOSE 8443

# Stage 7: Environment variables with defaults (override at runtime)
ENV BW_PROFILE=default
ENV BW_APP_PROP_DB_URL=jdbc:postgresql://localhost:5432/mydb
ENV BW_LOGLEVEL=INFO

# Stage 8: Health check (Kubernetes uses this for readiness)
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

# Entrypoint is defined in the TIBCO base image
# It runs startup.sh which initializes the BW runtime

Building BWCE Images — Full Command Reference

## ─── BUILD ───────────────────────────────────────────────────

# Basic build
docker build -t myregistry/myapp:1.0.0 .

# Build with specific Dockerfile name
docker build -f Dockerfile.prod -t myregistry/myapp:1.0.0 .

# Build with build arguments (version inject)
docker build \
  --build-arg APP_VERSION=1.0.0 \
  --build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
  -t myregistry/myapp:1.0.0 .

# Build with no cache (fresh build — use when debugging image issues)
docker build --no-cache -t myregistry/myapp:1.0.0 .

# Multi-platform build (build AMD64 image on ARM Mac or vice versa)
docker buildx build --platform linux/amd64 -t myregistry/myapp:1.0.0 .

# Build and see ALL output (no quiet mode — see every layer)
docker build --progress=plain -t myregistry/myapp:1.0.0 . 2>&1 | tee build.log

## ─── TAG & PUSH ──────────────────────────────────────────────

# Tag image with multiple tags
docker tag myregistry/myapp:1.0.0 myregistry/myapp:latest
docker tag myregistry/myapp:1.0.0 myregistry/myapp:prod

# Push to registry
docker push myregistry/myapp:1.0.0
docker push myregistry/myapp:latest

# Login to private registry first
docker login myregistry.company.com
docker login myregistry.company.com -u username -p password

Running & Testing BWCE Containers Locally

## ─── RUN LOCALLY (before pushing to Kubernetes) ─────────────

# Basic run with environment variable overrides
docker run -d \
  --name bwce-myapp \
  -p 8080:8080 \
  -e BW_APP_PROP_DB_URL="jdbc:postgresql://host.docker.internal:5432/mydb" \
  -e BW_APP_PROP_DB_USER="myuser" \
  -e BW_APP_PROP_DB_PASSWORD="mypassword" \
  -e BW_LOGLEVEL=DEBUG \
  myregistry/myapp:1.0.0

# Run with volume mount (for checkpoint persistence or config files)
docker run -d \
  --name bwce-myapp \
  -p 8080:8080 \
  -v /local/checkpoints:/bw/checkpoint \
  -v /local/certs:/bw/config/certs:ro \
  -e BW_APP_PROP_DB_URL="jdbc:postgresql://dbhost:5432/mydb" \
  myregistry/myapp:1.0.0

# Run with env file (cleaner for many variables)
cat > app.env << 'EOF'
BW_APP_PROP_DB_URL=jdbc:postgresql://dbhost:5432/mydb
BW_APP_PROP_DB_USER=myuser
BW_APP_PROP_DB_PASSWORD=mypassword
BW_APP_PROP_EMS_URL=tcp://emshost:7222
BW_LOGLEVEL=INFO
EOF
docker run -d --name bwce-myapp -p 8080:8080 --env-file app.env myregistry/myapp:1.0.0

# Run interactively — see startup logs in real time
docker run -it \
  --name bwce-debug \
  -p 8080:8080 \
  -e BW_LOGLEVEL=DEBUG \
  myregistry/myapp:1.0.0

# Run and override entrypoint — get shell instead of starting BW
docker run -it --entrypoint /bin/bash myregistry/myapp:1.0.0
# Now you can inspect the container filesystem before BW starts
# ls /bw/apps/    ← check EAR is there
# ls /bw/lib/     ← check JDBC drivers
# cat /bw/config/appconfig.ini  ← check default config

Analyzing & Inspecting BWCE Containers — Full Reference

## ─── INSPECT RUNNING CONTAINER ───────────────────────────────

# View all container details (JSON)
docker inspect bwce-myapp

# Extract specific fields
docker inspect bwce-myapp --format='{{.State.Status}}'
docker inspect bwce-myapp --format='{{.State.StartedAt}}'
docker inspect bwce-myapp --format='{{range .Mounts}}{{.Source}} → {{.Destination}}{{"\n"}}{{end}}'
docker inspect bwce-myapp --format='{{range .Config.Env}}{{.}}{{"\n"}}{{end}}'
# ↑ Lists ALL environment variables — verify overrides took effect

# Check resource usage of running container
docker stats bwce-myapp
docker stats bwce-myapp --no-stream  # One snapshot, then exit
# Output: CPU%, MEM USAGE/LIMIT, MEM%, NET I/O, BLOCK I/O

# Check exposed ports and actual port bindings
docker port bwce-myapp

## ─── ANALYZE IMAGE (before running) ─────────────────────────

# List all layers and their sizes
docker history myregistry/myapp:1.0.0
docker history myregistry/myapp:1.0.0 --no-trunc  # full commands
# Use this to identify which layer is bloating the image

# Inspect image metadata
docker inspect myregistry/myapp:1.0.0
docker inspect myregistry/myapp:1.0.0 --format='{{.Config.Env}}'
docker inspect myregistry/myapp:1.0.0 --format='{{.Config.ExposedPorts}}'
docker inspect myregistry/myapp:1.0.0 --format='{{.Config.Labels}}'

# Get image size
docker images myregistry/myapp:1.0.0 --format "{{.Size}}"

# Dive deeper — use 'dive' tool for interactive layer analysis
dive myregistry/myapp:1.0.0
# 'dive' shows each layer and what files changed — great for optimization
# Install: brew install dive OR docker run -it wagoodman/dive myregistry/myapp:1.0.0

## ─── LOGS ────────────────────────────────────────────────────

# Follow live logs
docker logs -f bwce-myapp

# Last N lines
docker logs --tail=200 bwce-myapp

# Logs since timestamp
docker logs --since="2024-01-15T10:00:00" bwce-myapp
docker logs --since=1h bwce-myapp   # last 1 hour

# Filter logs for errors
docker logs bwce-myapp 2>&1 | grep -i "ERROR\|FATAL\|Exception"
# 2>&1 combines stdout and stderr — BW logs to both

## ─── EXEC INTO CONTAINER ─────────────────────────────────────

# Get interactive shell
docker exec -it bwce-myapp /bin/bash
docker exec -it bwce-myapp /bin/sh   # if bash not available (Alpine)

# Run single command without interactive shell
docker exec bwce-myapp ls -la /bw/apps/
docker exec bwce-myapp cat /bw/config/appconfig.ini
docker exec bwce-myapp ps aux | grep java

# Check environment variables inside running container
docker exec bwce-myapp env | sort
# Verify all BW_APP_PROP_* overrides are present

# Check filesystem inside container
docker exec bwce-myapp ls -la /bw/
docker exec bwce-myapp ls -la /bw/apps/      # EAR files
docker exec bwce-myapp ls -la /bw/lib/       # 3rd party jars
docker exec bwce-myapp ls -la /bw/connectors/ # connector plugins
docker exec bwce-myapp ls -la /bw/log/        # BW log files inside container

# Copy files from container to host (get logs, config, heap dump)
docker cp bwce-myapp:/bw/log/bwappnode.log ./bwappnode.log
docker cp bwce-myapp:/bw/log/ ./container-logs/

# Copy files into running container
docker cp new-cert.crt bwce-myapp:/bw/config/certs/new-cert.crt

BWCE Container Network Diagnostic Commands

## ─── NETWORK DIAGNOSTICS ─────────────────────────────────────

# List all networks
docker network ls

# Inspect network containers are attached to
docker network inspect bridge
docker network inspect bwce-network

# Test connectivity FROM inside container
docker exec bwce-myapp curl -v http://downstream-api/health
docker exec bwce-myapp ping -c 3 dbhost
docker exec bwce-myapp telnet emshost 7222

# Check DNS resolution inside container
docker exec bwce-myapp nslookup downstream-api
docker exec bwce-myapp cat /etc/resolv.conf

# Port connectivity test from inside container
docker exec bwce-myapp bash -c "timeout 3 bash -c 'cat </dev/null > /dev/tcp/dbhost/5432' && echo 'OPEN' || echo 'CLOSED'"

BWCE Multi-Container Architecture with Docker Compose

For local development and testing, Docker Compose lets you run the full BWCE architecture stack together:

# docker-compose.yml — full BWCE local stack
version: '3.8'

services:

  # BWCE Application
  bwce-myapp:
    image: myregistry/myapp:1.0.0
    ports:
      - "8080:8080"
    environment:
      - BW_APP_PROP_DB_URL=jdbc:postgresql://postgres:5432/mydb
      - BW_APP_PROP_EMS_URL=tcp://ems:7222
      - BW_LOGLEVEL=DEBUG
    depends_on:
      postgres:
        condition: service_healthy
      ems:
        condition: service_started
    volumes:
      - ./checkpoints:/bw/checkpoint
    networks:
      - bwce-net

  # PostgreSQL database
  postgres:
    image: postgres:14
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myuser"]
      interval: 10s
      retries: 5
    networks:
      - bwce-net

  # TIBCO EMS (if licensed — or use ActiveMQ for testing)
  ems:
    image: myregistry/tibco-ems:8.x.x
    ports:
      - "7222:7222"
    networks:
      - bwce-net

networks:
  bwce-net:
    driver: bridge

# Commands
docker-compose up -d         # start all services
docker-compose logs -f bwce-myapp  # follow app logs
docker-compose ps            # status of all services
docker-compose down          # stop and remove containers
docker-compose down -v       # also remove volumes

How TIBCO Architecture is Solutioned Using Containers

Enterprise BWCE deployments follow one of these reference architectures depending on scale and operational requirements:

Pattern 1 — Single Namespace (Small/Medium Enterprise)

Kubernetes Cluster
└── Namespace: tibco-prod
├── Deployment: experience-api (3 replicas)
│ └── BWCE Pod → Pod → Pod
│ Ingress: api.company.com/v1/

├── Deployment: process-api (2 replicas)
│ └── BWCE Pod → Pod
│ Service: ClusterIP (internal only)

├── Deployment: system-api-salesforce (2 replicas)
├── Deployment: system-api-db (2 replicas)

├── ConfigMap: bwce-global-config (shared env props)
├── Secret: bwce-credentials (DB/EMS passwords)
└── PersistentVolumeClaim: checkpoints

Pattern 2 — Multi-Namespace (Large Enterprise, Team Isolation)

Kubernetes Cluster
├── Namespace: tibco-infra ← EMS, shared config, certs
├── Namespace: tibco-experience ← Experience APIs (internet-facing)
├── Namespace: tibco-process ← Process APIs (internal only)
├── Namespace: tibco-system ← System APIs (backend integration)
└── Namespace: tibco-monitoring ← Prometheus, Grafana, ELK

Network Policies control: experience → process (allowed)
process → system (allowed)
experience → system (blocked — must go through process)

Pattern 3 — Sidecar Pattern (Enhanced Observability)

# Pod with BW app + observability sidecars
spec:
  containers:

  # Main BW application container
  - name: bwce-myapp
    image: myregistry/myapp:1.0.0
    ports:
    - containerPort: 8080

  # Sidecar 1: Log shipper (ships BW logs to ELK/Splunk)
  - name: filebeat
    image: elastic/filebeat:8.x
    volumeMounts:
    - name: bw-logs
      mountPath: /bw/log

  # Sidecar 2: Metrics exporter (exposes JVM metrics to Prometheus)
  - name: jmx-exporter
    image: bitnami/jmx-exporter:latest
    ports:
    - containerPort: 9090

  volumes:
  - name: bw-logs
    emptyDir: {}   # shared between main + filebeat sidecar

Container Image Maintenance — Production Admin Tasks

## ─── IMAGE HOUSEKEEPING ──────────────────────────────────────

# List all BWCE images on host
docker images | grep bwce
docker images --format "{{.Repository}}:{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"

# Remove old images (dangling = untagged after build)
docker image prune              # remove dangling only
docker image prune -a --filter "until=720h"  # remove all older than 30 days

# Pull latest base image (for security patches)
docker pull tibco/bwce:2.8.0

# Check image for known CVE vulnerabilities
docker scout cves myregistry/myapp:1.0.0      # Docker Scout (built-in)
trivy image myregistry/myapp:1.0.0             # Trivy (recommended)
grype myregistry/myapp:1.0.0                   # Grype (alternative)

# Compare two image versions (what changed between releases)
docker diff bwce-myapp-old   # shows files changed in running container

# Export image to tar (for air-gapped environments)
docker save myregistry/myapp:1.0.0 -o myapp-1.0.0.tar
docker load -i myapp-1.0.0.tar

## ─── SYSTEM CLEANUP ──────────────────────────────────────────
docker system df              # show disk usage by Docker
docker system prune           # remove stopped containers, unused networks, dangling images
docker system prune -a        # include all unused images
# ⚠️ Be careful with prune -a in production — confirm what will be removed first

Debugging a BWCE Build Failure

## When 'docker build' fails — step-by-step diagnosis

Step 1: Read the exact error in build output
docker build --progress=plain -t myregistry/myapp:1.0.0 . 2>&1 | tee build.log
grep -A5 "ERROR\|failed\|not found" build.log

Step 2: Identify which layer failed
# Each 'Step N/M' in output is one Dockerfile instruction
# Failed step tells you exactly which COPY/RUN/FROM failed

Step 3: Debug a specific layer by building up to that point
# Add --target if using multi-stage, or manually comment out lines below failure

Step 4: Inspect the last successfully built layer
docker build -t debug-layer . 2>&1 | grep "sha256" | tail -5
docker run -it sha256:<last-good-layer-hash> /bin/bash
# Now you're inside the last good state — inspect filesystem, test commands

Common BWCE build failures:
COPY failed: file not found in build contextEAR file path wrong, or mvn build didn't run before docker build

FROM tibco/bwce:2.x.x: manifest unknownWrong BWCE version tag; check docker.io/tibco/bwce for valid tags

unauthorized: authentication requireddocker login to private registry before build

no space left on devicedocker system prune on build host

BWCE is BW6 packaged as Docker containers, typically orchestrated by Kubernetes or Docker Swarm. The application logic is identical to traditional BW6 — only the runtime infrastructure differs dramatically.

Traditional BW6

  • Apps deployed to AppNodes on VMs/bare metal
  • TEA / TIBCO Administrator as management plane
  • Domain-based configuration
  • JVM per AppNode — long-running processes
  • Manual or script-based scaling
  • Shared Module for connectors

BWCE (Container Edition)

  • Apps packaged as Docker images
  • Kubernetes/OpenShift for orchestration
  • ConfigMaps + Secrets for configuration
  • Pods replace AppNodes — ephemeral
  • HPA (Horizontal Pod Autoscaler) for scaling
  • Connectors packaged in Docker image

BWCE Image Anatomy

# BWCE Docker image layers:
TIBCO Base OS Image (RHEL/CentOS)
  └─ TIBCO Runtime Layer (BW6 engine + OSGI bundles)
       └─ Connector Layer (EMS, JDBC, HTTP connectors)
            └─ Application Layer (your EAR/AAR + appconfig.ini)
                 └─ Environment overrides (via env vars at runtime)

BWCE Configuration Override Pattern

# appconfig.ini — base config baked into image
ConnectionTimeout=30
MaxRetries=3
DBUrl=jdbc:postgresql://placeholder:5432/mydb

# Kubernetes ConfigMap — overrides per environment
apiVersion: v1
kind: ConfigMap
metadata:
  name: bwce-app-config
data:
  BW_APP_PROP_DB_URL: "jdbc:postgresql://prod-db:5432/mydb"
  BW_APP_PROP_MAX_RETRIES: "5"

# Kubernetes Secret — for credentials
apiVersion: v1
kind: Secret
type: Opaque
data:
  BW_APP_PROP_DB_PASSWORD: base64encodedvalue
Critical: In BWCE, pods are ephemeral — when a pod restarts, all in-memory state is lost. Any BW6 process using checkpoints must have checkpoint storage configured (shared filesystem or database). Confirm this before production go-live.

Key kubectl Commands for BWCE Admin

# Pod status
kubectl get pods -n <namespace> -l app=<bwce-app>
kubectl describe pod <pod-name> -n <namespace>

# Logs
kubectl logs <pod-name> -n <namespace> --tail=200 -f
kubectl logs <pod-name> -n <namespace> --previous  # crashed pod logs

# Exec into running pod
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash

# Scale
kubectl scale deployment <deployment-name> --replicas=3 -n <namespace>

# ConfigMap/Secret refresh (after editing)
kubectl rollout restart deployment <deployment-name> -n <namespace>

# Check resource usage
kubectl top pods -n <namespace>
kubectl top nodes

4. Domains, AppSpaces, AppNodes & Deployment

Domain Structure Best Practices

Recommended Structure

  • One domain per environment tier (Dev, Test, UAT, Prod)
  • Separate AppSpaces per application group
  • Never share AppSpace between critical and non-critical apps

AppNode Sizing

  • Start with 512MB–2GB heap per AppNode
  • Monitor actual usage before right-sizing
  • CPU: minimum 2 cores for production AppNode

Anti-Patterns

  • All apps in one AppNode (blast radius risk)
  • Same domain for Dev and Prod
  • Deploying without testing in lower env first

Deployment via tibcoamx CLI

# Connect to domain
tibcoamx connect --domain MyDomain --host adminhost --port 9091 --user admin --password ****

# List deployed apps
tibcoamx app list --domain MyDomain

# Deploy new application
tibcoamx app deploy --file MyApp-1.0.ear --appSpace MyAppSpace --domain MyDomain

# Start application
tibcoamx app start --name MyApp --appSpace MyAppSpace --domain MyDomain

# Stop application
tibcoamx app stop --name MyApp --appSpace MyAppSpace --domain MyDomain

# Undeploy
tibcoamx app undeploy --name MyApp --appSpace MyAppSpace --domain MyDomain

# Check AppNode status
tibcoamx node list --appSpace MyAppSpace --domain MyDomain

# Kill and restart AppNode
tibcoamx node stop --name MyAppNode --appSpace MyAppSpace --domain MyDomain
tibcoamx node start --name MyAppNode --appSpace MyAppSpace --domain MyDomain

Deployment Checklist

1

Verify artifact version — confirm the EAR/AAR version matches the intended release. Check with the developer team.

2

Check dependencies — ensure Shared Modules (JDBC drivers, EMS client jars) are deployed and version-compatible.

3

Backup current config — export current application configuration from TEA before overwriting.

4

Stop existing application — graceful stop allows in-flight processes to complete. Check zero active processes before stopping.

5

Deploy new version — deploy the EAR. Watch TEA logs during deployment for bundle activation errors.

6

Apply configuration — set all environment-specific properties (DB URLs, credentials, endpoints).

7

Start and validate — start app, verify processes are receiving and completing, check error rates.

8

Monitor for 15 minutes — watch logs, memory, thread count, and error counts before declaring success.

5. TEA & Admin UI — Your Control Panel

TIBCO Enterprise Administrator (TEA) is your primary management interface for traditional BW6. Understanding every panel is essential.

TEA Navigation Map

TEA SectionWhat you do hereCheck frequency
ApplicationsDeploy, start, stop, configure apps. View application status.Every incident, every deployment
AppNodesMonitor JVM health: memory, threads, uptime. Restart nodes.Daily
Process MonitorView running/suspended/faulted process instances. Kill or resume.When SLA breach or error reported
Plugin ManagerManage connector plugins deployed to domain. Version tracking.Pre-deployment, post-upgrade
Domain SettingsGlobal domain configuration — JVM args, log settings, ports.Initial setup, tuning
Audit LogAll admin actions recorded here — who changed what and when.Post-incident investigation
MonitoringBuilt-in metrics dashboards — throughput, latency, errors per app.Continuous

Process Monitor — Critical Admin Skill

Process Monitor shows every running BW6 process instance. As an admin you'll use it to:

Identify stuck processes — instances that have been Running for too long (check against expected SLA)
Kill zombie processes — instances with no activity that are consuming threads
Resume suspended processes — if a process hit a checkpoint and suspended due to downstream failure
Investigate faulted processes — view the error, the input data, and the process step that failed
Never kill a faulted process before reading it. A faulted process contains the full error message, input payload, and stack trace. Screenshot or export before killing — once killed, the investigation data is gone.

6. Configuration Management

BW6 Configuration Hierarchy

# Priority order (highest to lowest):
1. Environment Variables (OS level or container env vars)
2. Application Properties set via TEA / Admin UI
3. appconfig.ini (bundled in EAR)
4. Default values in BW module descriptors

# Rule: always use TEA / env vars for production — never bake creds into EAR

Property Files — Know These Locations

FileLocationPurpose
config.iniBW_HOME/runtime/3rdparty/config.iniOSGI framework config — heap, JVM args, bundle locations
domain.propertiesBW_HOME/domains/<domain>/config/Domain-level settings — ports, TLS, agent config
TRA filesBW_HOME/bin/bwagent.traJVM arguments for the BW Agent process itself
appconfig.iniInside the EAR artifactApplication-specific defaults
logback.xmlBW_HOME/domains/<domain>/<appspace>/config/Log levels, appenders, rolling policy

Modifying JVM Arguments (TRA Files)

# bwagent.tra — sets JVM args for the BW Agent
tibco.env.HEAP_SIZE=1024m
tibco.env.MAX_HEAP_SIZE=2048m
java.property.Djava.io.tmpdir=/data/tmp
java.property.Djavax.net.ssl.trustStore=/certs/truststore.jks
java.property.Djavax.net.ssl.trustStorePassword=changeit

# AppNode JVM — configured via TEA > AppNode > JVM Settings
# Or via config.ini in the AppNode config directory
-Xms512m -Xmx2048m -XX:+UseG1GC -XX:MaxGCPauseMillis=200

Connection Pool Configuration

# JDBC connection pool — critical for database-heavy apps
Minimum Pool Size: 5        # Never set to 0 (cold start latency spike)
Maximum Pool Size: 20       # Match your DB max_connections / num_apps
Connection Timeout: 30000   # 30 seconds — fail fast
Idle Timeout: 600000        # 10 minutes — return idle connections
Validation Query: SELECT 1  # Validates connection before use

# EMS connection factory — for JMS-heavy apps
ConnAttemptCount: 3
ConnAttemptDelay: 1000
ConnAttemptTimeout: 5000
ReconnAttemptCount: -1      # -1 = infinite reconnect (recommended for prod)

7. Day-One Operations Checklist

Before you do anything in a production environment, run through this checklist every morning or after any change.

Morning Health Check (15 minutes)

## STEP 1: Check all BW Agents are running
ps aux | grep bwagent | grep -v grep
# Expected: one bwagent process per machine

## STEP 2: Check AppNode JVM processes
ps aux | grep AppNode | grep -v grep
# One JVM process per AppNode — if missing, an AppNode has crashed

## STEP 3: Check TEA connectivity
curl -s http://adminhost:9091/tea/api/v1/domains | python3 -m json.tool

## STEP 4: Check all applications are STARTED
tibcoamx app list --domain ProdDomain | grep -v STARTED
# Any non-STARTED app needs investigation

## STEP 5: Check error logs from last 24 hours
grep -i "ERROR\|FATAL\|Exception" /opt/tibco/bw6/domains/Prod/appspaces/*/logs/*.log \
  --include="*.log" | tail -100

## STEP 6: Check disk space (logs fill fast)
df -h /opt/tibco /var/log /data
# Alert threshold: 80% — action threshold: 90%

## STEP 7: Check JVM heap usage via TEA or JMX
# TEA > AppNode > Memory — if heap is consistently >80%, tune or scale

Know Your Environment Map

On day one, document these before anything else. You cannot admin what you don't know exists:

List of all domains, AppSpaces, and AppNodes with their host IPs and ports
All deployed applications with their current version, status, and purpose
All downstream dependencies — every DB connection, EMS server, HTTP endpoint, and SFTP server used by any app
Log file locations for every AppNode and the BW Agent
Who the on-call developer is for each application
Escalation contacts: TIBCO support account number, internal DBA, network team

8. Monitoring & Alerting

What to Monitor — BW6 Key Metrics

MetricWhere to get itAlert thresholdWhy it matters
JVM Heap Used %TEA > AppNode > Memory / JMX>80% sustainedLeads to OutOfMemoryError and AppNode crash
Active Process CountTEA > Process MonitorAbove expected peakProcess backlog building up — downstream slowness
Faulted Process CountTEA > Process MonitorAny increaseApplication errors — data not being processed
Thread Pool UtilizationJMX MBeans>85%Thread starvation — apps become unresponsive
Message Queue DepthEMS Admin / ActiveMQSustained growthConsumers not keeping up with producers
GC Pause TimeJVM GC logs / JMX>200ms p99Long GC pauses cause timeout cascades
BW Agent HeartbeatTEA statusAny gapAgent down = no admin operations possible
AppNode UptimeTEA > AppNodeAny restartUnexpected restart = crash to investigate

JMX Monitoring (Advanced)

# Enable JMX in AppNode TRA / config.ini
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

# Connect with JConsole or jvisualvm
jconsole <host>:9999

# Key MBeans to watch:
java.lang:type=Memory              → HeapMemoryUsage (used/max)
java.lang:type=GarbageCollector    → CollectionCount, CollectionTime
java.lang:type=Threading           → ThreadCount, PeakThreadCount
com.tibco.bw:*                     → BW-specific MBeans (process counts, rates)

Log Aggregation Setup

In production, never hunt individual log files manually. Set up centralized logging:

ELK Stack (Elasticsearch + Logstash + Kibana): Logstash agent on each BW host ships logs to Elasticsearch. Kibana for querying and dashboards.
Splunk: Universal Forwarder on BW hosts sends to Splunk indexer. Most enterprises already have Splunk — ask your ops team if it's available.
CloudWatch / Azure Monitor / GCP Logging: If BW6 is on cloud VMs, use native cloud logging agents.
BWCE + Kubernetes: kubectl logs or Fluentd/Fluentbit DaemonSet shipping pod logs to your aggregation backend.

9. Log Management & Analysis

BW6 Log Locations

# BW Agent log
BW_HOME/domains/<domain>/logs/bwagent.log

# AppNode logs (one directory per AppNode)
BW_HOME/domains/<domain>/appspaces/<appspace>/appnodes/<appnode>/logs/
  ├── bwappnode.log         ← main AppNode log
  ├── bwappnode.log.1       ← rolled previous file
  ├── gc.log                ← GC log (if enabled)
  └── stderr.log            ← JVM startup errors, OOM messages

# Application-level logs (if app uses logback file appender)
BW_HOME/domains/<domain>/appspaces/<appspace>/appnodes/<appnode>/logs/<appname>.log

Log Configuration (logback.xml)

<!-- logback.xml — control log verbosity per package -->
<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${bw.home}/logs/app.log</file>
    <rollingPolicy class="...TimeBasedRollingPolicy">
      <fileNamePattern>app.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>   <!-- keep 30 days -->
    </rollingPolicy>
  </appender>

  <!-- Production: INFO level. Never DEBUG in prod — fills disk fast -->
  <root level="INFO"><appender-ref ref="FILE"/></root>

  <!-- Specific package — DEBUG for targeted troubleshooting -->
  <logger name="com.mycompany.integration" level="DEBUG"/>
</configuration>

Log Analysis — Common Patterns to Search

# Find all ERRORs in last hour
grep "ERROR" bwappnode.log | awk -v d="$(date -d '1 hour ago' '+%Y-%m-%d %H:%M')" '$0 >= d'

# Find OutOfMemoryError
grep -i "OutOfMemory\|java.lang.OOM" *.log stderr.log

# Find connection failures
grep -i "connection refused\|connection timeout\|could not connect" bwappnode.log | tail -50

# Find slow processes (BW logs process duration)
grep "process.duration" bwappnode.log | awk -F'=' '{if($2 > 30000) print}' | tail -20

# Count errors per minute (identify spike time)
grep "ERROR" bwappnode.log | awk '{print $1, $2}' | cut -c1-16 | sort | uniq -c

# Find specific correlation ID / process ID
grep "processId=abc123" bwappnode.log

Log Rotation — Prevent Disk Full

# If logback rolling is not configured, set up OS-level logrotate
# /etc/logrotate.d/tibco-bw
/opt/tibco/bw6/domains/*/appspaces/*/appnodes/*/logs/*.log {
    daily
    rotate 14
    compress
    missingok
    notifempty
    copytruncate    # Non-disruptive — copies then truncates live file
}

10. Performance Tuning

JVM Tuning for BW6 AppNodes

# Recommended JVM flags for BW6 production AppNode
-Xms1g -Xmx2g                      # Set min=max to avoid heap resize pauses
-XX:+UseG1GC                        # G1 GC — best for BW6 mixed workloads
-XX:MaxGCPauseMillis=200            # Target max GC pause — tune per SLA
-XX:G1HeapRegionSize=16m            # Larger regions for large object avoidance
-XX:+HeapDumpOnOutOfMemoryError     # Capture heap dump on OOM
-XX:HeapDumpPath=/data/dumps/       # Save dumps — need 2x heap free space!
-Xlog:gc*:file=/opt/tibco/gc.log:time,uptime:filecount=5,filesize=20m
                                    # GC logging — essential for tuning

Thread Pool Sizing

# BW6 thread pool — configured in AppNode config
# Too few → throttled throughput; Too many → context switch overhead

Min Threads: 10      # Always keep threads warm
Max Threads: 100     # Formula: (num CPUs × 2) + I/O wait threads

# For I/O-heavy apps (DB, EMS, HTTP):
Max Threads = num_CPUs × 10   # I/O releases threads during wait

# For CPU-heavy apps (transformation, encryption):
Max Threads = num_CPUs × 2    # CPU-bound — more threads = more contention

EMS Tuning (if using TIBCO EMS)

# tibemsd.conf — key parameters
max_msg_memory = 512mb           # In-memory queue size before overflow to disk
msg_swapping = enabled           # Allow disk overflow (slower but safer)
max_connections = 1000           # Max client connections
max_msg_size = 10mb              # Reject messages larger than this
flow_control = enabled           # Back-pressure — slow producers when queues fill

# Check EMS server status
tibemsadmin -server tcp://emshost:7222 -user admin -password ****
show server
show queues
show consumers

11. High Availability & Failover

BW6 HA Topologies

Active-Active (Recommended)

  • Multiple AppNodes in same AppSpace
  • Load distributed across nodes
  • Failure of one node → others absorb load
  • Requires stateless application design
  • EMS-based apps: use durable subscribers

Active-Passive

  • One AppNode active, one standby
  • Automatic failover on crash
  • Used for stateful apps with checkpoints
  • Higher cost — standby is idle
  • Failover time: 30–120 seconds

Fault Tolerance Configuration

# Enable fault tolerance in AppSpace
# TEA > AppSpace > Fault Tolerance Settings
Fault Tolerance Mode: Active-Active
Activation Interval:  2000ms     # How often nodes coordinate
Heartbeat Interval:   1000ms     # Health check frequency
Activation Timeout:   30000ms    # How long to wait for peer before taking over

# For EMS-based HA — use EMS fault-tolerant pairs
# Primary EMS + Backup EMS — automatic failover
Primary Server:  tcp://ems-primary:7222
Backup Server:   tcp://ems-backup:7222

Graceful Shutdown Procedure

# NEVER hard-kill an AppNode without following this sequence

Step 1: Stop new message intake
# Suspend all listeners (EMS, HTTP) via TEA
# Allow in-flight processes to complete

Step 2: Wait for active processes to finish
# TEA > Process Monitor — wait until Active Process Count = 0
# Set a timeout — if not zero in N minutes, escalate

Step 3: Graceful stop via TEA/CLI
tibcoamx app stop --name MyApp --appSpace MyAppSpace --domain MyDomain --graceful true

Step 4: Verify AppNode stopped cleanly
ps aux | grep AppNode
# Should show no process

12. Debug Scenarios & Runbook

The following scenarios are the most common production situations you will face. Each follows the same structure: symptom, diagnosis approach, resolution.

Scenario 1

Application Won't Start — Bundle Activation Failure

App deployed successfully but status remains STOPPED or ERROR. TEA shows no detailed error. App was working in Dev.
• Missing Shared Module (JDBC driver, EMS client jar not deployed to domain)
• Version mismatch between plugin and BW runtime
• Missing or incorrect configuration property
• TLS/SSL certificate not found in truststore
Step 1: Check AppNode log immediately after deploy attempt
tail -200 bwappnode.log | grep -A5 "ERROR\|Exception\|FAILED\|Bundle"

Step 2: Look for OSGI bundle activation errors specifically
grep -i "BundleException\|could not be resolved\|missing required" bwappnode.log
# Missing bundle = missing Shared Module or connector plugin

Step 3: Check Shared Modules deployed to domain
tibcoamx sharedmodule list --domain MyDomain
# Compare against what the app's MANIFEST.MF requires

Step 4: Check plugin versions in TEA > Plugin Manager
# Developer should provide the list of required plugins + versions

Step 5: Check application configuration for missing required properties
tibcoamx app getconfig --name MyApp --appSpace MyAppSpace --domain MyDomain
Deploy missing Shared Module → redeploy app → start. For property issues, set values in TEA and restart.
Scenario 2

AppNode Crashed — OutOfMemoryError

AppNode process disappeared. TEA shows AppNode as DOWN. All applications in that AppNode are unavailable. Alarm fired from monitoring.
• JVM heap exhausted — too many process instances in memory
• Large message payloads being held in memory simultaneously
• Memory leak in custom Java code within BW app
• Heap sized too small for the actual workload
Step 1: Find and read the crash evidence
grep -i "OutOfMemory\|OOM\|heap space\|GC overhead" stderr.log bwappnode.log

Step 2: Check if heap dump was captured
ls -lh /data/dumps/*.hprof
# If exists → share with developer for analysis in Eclipse MAT

Step 3: Check GC log for warning signs leading up to crash
grep "GC" gc.log | tail -100
# Look for: increasing GC pause times, decreasing heap free after GC

Step 4: Check active process count before crash (from logs)
grep "active.process.count" bwappnode.log | tail -50

Step 5: Immediate recovery
tibcoamx node start --name MyAppNode --appSpace MyAppSpace --domain MyDomain

Step 6: Temporary mitigation while investigating
# Increase heap (if safe headroom on host)
# Or add a second AppNode to distribute load
Share heap dump with developer. Common findings: BW mapper holding large XML in memory; too many simultaneous processes; unclosed DB ResultSet leaking memory. Fix = code change OR heap increase OR process throttling.
Scenario 3

Messages Piling Up in EMS Queue

EMS queue depth growing rapidly. Monitoring alert: "QueueDepth > 1000". Business reports orders/data not being processed. Application appears running.
• BW consumer application is running but stuck on a single message (bad message blocking the queue)
• Downstream dependency (DB, HTTP endpoint) is slow/unavailable causing each message to take too long
• Consumer stopped or crashed silently
• Message size increased and hitting max_msg_size limit
Step 1: Check if consumers are active on the queue
tibemsadmin -server tcp://ems:7222 -user admin -password ****
show queue MyQueue
# Look at: Consumer Count, Messages Pending, Messages/Second
# If consumer count = 0 → BW app not connected → restart app
# If consumer count > 0 but rate = 0 → consumer is stuck

Step 2: Check for stuck/long-running processes in TEA Process Monitor
# Filter by application, sort by start time → oldest first
# Oldest process = potentially processing the bad message

Step 3: Check BW logs for repeated errors on same message
grep "redelivered\|retry\|failed to process" bwappnode.log | tail -50

Step 4: Check downstream dependency health
curl -v http://downstream-api/health
psql -h dbhost -U user -c "SELECT count(*) FROM pg_stat_activity WHERE state='active'"

Step 5: If bad message — move to dead letter queue to unblock
# In EMS Admin:
move queue MyQueue MyQueue.deadletter    # moves ALL messages — careful!
# Or use EMS browser to selectively move specific message IDs
Bad message: configure EMS max redelivery → auto-move to dead letter. Downstream outage: fix dependency, then messages process automatically. Consumer not connected: restart BW app.
Scenario 4

BW6 App Throwing DB Connection Errors

Log flooding with "Unable to acquire JDBC Connection" or "Connection pool timeout". Some process instances faulting. DB team says database is fine.
• Connection pool exhausted (too many concurrent processes holding connections)
• DB connections going stale (firewall kills idle connections; BW doesn't know)
• DB server restarted — pool has stale connections
• Pool min/max configured too low for current load
Step 1: Check current pool state via JMX or TEA
# Look for: Active Connections, Idle Connections, Awaiting connections
# If Active = Max → pool exhausted

Step 2: Check DB side — active connections from BW host
psql -h dbhost -c "SELECT count(*), state, application_name FROM pg_stat_activity \
  WHERE application_name LIKE '%tibco%' GROUP BY state, application_name"

Step 3: Test basic DB connectivity from BW host
telnet dbhost 5432
psql -h dbhost -U tibcouser -d mydb -c "SELECT 1"

Step 4: Check for stale connections (firewall timeout)
# If firewall closes idle connections after N minutes:
# → Add validation query to connection pool: SELECT 1
# → Set idle connection timeout < firewall timeout

Step 5: Temporary fix — restart AppNode to recycle pool
tibcoamx node stop --name MyAppNode --appSpace MyAppSpace --domain MyDomain
tibcoamx node start --name MyAppNode --appSpace MyAppSpace --domain MyDomain
Add testOnBorrow=true and validationQuery=SELECT 1 to JDBC resource config. Set idleTimeout to less than firewall idle timeout. Increase max pool size if load has grown.
Scenario 5

BWCE Pod CrashLoopBackOff

kubectl shows pod status CrashLoopBackOff. Pod starts, runs briefly, then crashes repeatedly. Previously working. Recent deployment made.
• New application config value missing or wrong (DB URL, credentials)
• ConfigMap or Secret not updated for new property added in this release
• Insufficient memory/CPU limits on pod spec — OOM killed by kernel
• Application startup sequence failing (DB connection at startup fails)
Step 1: Get crash reason immediately
kubectl describe pod <pod-name> -n <namespace>
# Look at: Last State, Exit Code, Reason
# Exit code 137 = OOM killed by kernel (increase memory limit)
# Exit code 1 = app error (check logs)

Step 2: Read logs from the crashed pod
kubectl logs <pod-name> -n <namespace> --previous
kubectl logs <pod-name> -n <namespace> --previous | grep -i "error\|fatal\|exception"

Step 3: Check ConfigMap has all required properties
kubectl get configmap bwce-app-config -n <namespace> -o yaml
# Compare with appconfig.ini from the EAR artifact

Step 4: Check resource limits
kubectl get pod <pod-name> -n <namespace> -o jsonpath='{.spec.containers[0].resources}'

Step 5: Rollback deployment if recent change caused it
kubectl rollout undo deployment <deployment-name> -n <namespace>
kubectl rollout status deployment <deployment-name> -n <namespace>
Add missing ConfigMap key → rolling restart. If OOM: increase memory limit in deployment YAML. If app config error: fix property, update Secret/ConfigMap, rolling restart.
Scenario 6

Slow Performance — Processes Taking Longer Than SLA

Business reports "system is slow". Response times exceeding SLA. No errors, no crashes. Everything appears running. Harder to diagnose than failures.
• Downstream dependency slow (DB query, HTTP call, EMS publish)
• GC pressure — long GC pauses adding latency
• Thread pool saturation — requests queuing behind active threads
• Message payload size increased — transformation taking longer
• Network latency between BW host and dependencies increased
Step 1: Establish where the time is going
# Check BW process duration in logs
grep "duration" bwappnode.log | awk -F'duration=' '{print $2}' | sort -n | tail -20

Step 2: Check GC logs for pause correlation
grep "Pause\|GC" gc.log | awk '{print $1, $NF}' | tail -50
# If GC pauses > 500ms correlate with slow response times → tune GC or increase heap

Step 3: Check thread pool — is it saturated?
# Via JMX: java.lang:type=Threading → ThreadCount vs PeakThreadCount
# If ThreadCount = Max configured → requests are queuing

Step 4: Measure each downstream dependency independently
time curl -o /dev/null -s http://downstream-api/endpoint
time psql -h dbhost -c "EXPLAIN ANALYZE SELECT * FROM orders WHERE id=1"

Step 5: Check network latency
ping -c 20 dbhost | tail -5
traceroute dbhost
Slow processes = either the BW processing is slow OR a dependency call is slow. Isolate which service/activity takes the most time using BW process logs + dependency latency checks. Fix is almost always in the dependency, not BW itself.
Scenario 7

TEA / BW Agent Not Responding

TEA UI shows domain or machines as offline. Cannot deploy or manage applications. Applications may still be running — agent is management plane only.
Step 1: Check if BW Agent process is running
ps aux | grep bwagent | grep -v grep
# If no process → agent crashed → check bwagent.log for cause → restart

Step 2: Check TEA server process
ps aux | grep tibco.admin | grep -v grep

Step 3: Restart BW Agent
cd BW_HOME/bin
./bwagent.sh start
# Or via systemd:
sudo systemctl start tibco-bwagent

Step 4: Check agent log for connection errors
tail -100 BW_HOME/domains/<domain>/logs/bwagent.log
# Look for: port conflict, certificate error, cannot reach TEA

Step 5: If agent is running but TEA can't connect → check port/firewall
telnet bwagent-host 5555    # default agent port
netstat -tlnp | grep 5555
While the agent is down, deployed applications continue running. The agent is purely the management plane. Communicate this to stakeholders — business is not impacted, but you cannot deploy or admin until agent is restored.

13. Security Administration

Certificate Management

# Check certificate expiry — schedule this as monthly cron
keytool -list -keystore /certs/server.jks -storepass changeit | grep "Valid from"
openssl s_client -connect downstream-api:443 -servername api.company.com 2>/dev/null \
  | openssl x509 -noout -dates

# Add new certificate to truststore
keytool -import -alias new-cert -file new-cert.crt \
  -keystore /certs/truststore.jks -storepass changeit

# List all certs in truststore
keytool -list -keystore /certs/truststore.jks -storepass changeit

# After cert update — restart AppNode to pick up new truststore
tibcoamx node stop ... && tibcoamx node start ...

User & Role Management in TEA

TEA uses LDAP or local user store — integrate with corporate Active Directory for enterprise deployments
Roles: Domain Administrator (full control), Application Manager (deploy/manage apps), Monitor (read-only). Apply least-privilege.
Audit log in TEA records every admin action — user, timestamp, what changed. Critical for compliance.

Secrets Management

# NEVER store passwords in plain text in TRA files or properties
# BW6 built-in obfuscation (weak — for display only, not real security)
tibcoamx obfuscate --password mysecretpassword

# Better: use external vault
# BWCE: Kubernetes Secrets (base64, not encryption — use Sealed Secrets or Vault)
# Traditional: HashiCorp Vault with BW6 plugin
# Or: OS-level environment variables set by secure configuration management (Ansible, Chef)

14. CI/CD & Deployment Automation

Traditional BW6 — Maven + tibcoamx

# Maven build (Developer responsibility — triggers from CI)
mvn clean package -DskipTests
# Produces: target/MyApp-1.0.0.ear

# Deployment script template (Admin responsibility)
#!/bin/bash
APP_NAME="MyApp"
APP_VERSION="1.0.0"
DOMAIN="ProdDomain"
APPSPACE="ProdAppSpace"
EAR_PATH="/deploy/artifacts/MyApp-${APP_VERSION}.ear"

# Stop existing
tibcoamx app stop --name $APP_NAME --appSpace $APPSPACE --domain $DOMAIN

# Undeploy old version
tibcoamx app undeploy --name $APP_NAME --appSpace $APPSPACE --domain $DOMAIN

# Deploy new version
tibcoamx app deploy --file $EAR_PATH --appSpace $APPSPACE --domain $DOMAIN

# Apply properties
tibcoamx app setproperty --name $APP_NAME --appSpace $APPSPACE --domain $DOMAIN \
  --property "DBUrl" --value "jdbc:postgresql://prod-db:5432/mydb"

# Start
tibcoamx app start --name $APP_NAME --appSpace $APPSPACE --domain $DOMAIN
echo "Deployment complete: ${APP_NAME} v${APP_VERSION}"

BWCE — Kubernetes Rolling Deployment

# Build and push new image
docker build -t myregistry/bwce-myapp:1.0.1 .
docker push myregistry/bwce-myapp:1.0.1

# Update deployment image (triggers rolling update)
kubectl set image deployment/bwce-myapp bwce-myapp=myregistry/bwce-myapp:1.0.1 -n prod

# Watch rolling update progress
kubectl rollout status deployment/bwce-myapp -n prod

# Rollback if needed
kubectl rollout undo deployment/bwce-myapp -n prod

# BWCE deployment YAML — key sections
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Add 1 new pod before removing old
      maxUnavailable: 0  # Never reduce below desired count

BW5 → BW6 Transition Guide

BW5 and BW6 share the TIBCO name but are fundamentally different products. A BW5 developer stepping into BW6/CE will encounter a platform that shares almost none of the same runtime, tooling, or deployment model. This section maps the conceptual differences, identifies what prior knowledge transfers, and outlines the topics that require learning from scratch — including where MuleSoft platform experience provides a meaningful head start.

MuleSoft platform knowledge transfers well to BW6/CE: MuleSoft and BW6 share more conceptual DNA than BW5 and BW6 do. Both are OSGI-based runtimes, both use Eclipse-based IDEs, both have module/connector plugin systems, both deploy to managed runtimes, and both support container deployment. A developer with MuleSoft experience will find the BW6 structure familiar even when the TIBCO-specific tooling and terminology differ.

Concept Mapping — BW5 → BW6 → MuleSoft

BW5 ConceptBW6 EquivalentMuleSoft EquivalentKey difference
TIBCO DesignerTIBCO Business Studio (Eclipse)Anypoint Studio (Eclipse)BW6 and MuleSoft both use Eclipse — same IDE base, different plugins
TRA Runtime AgentOSGI Felix Container (AppNode JVM)Mule Runtime (OSGI)All three are OSGI underneath — BW6 and MuleSoft are architecturally closer to each other than to BW5
.process fileBW6 Process (module-based)Mule Flow (.xml)BW6 processes are backed by module descriptors; MuleSoft flows are XML-first
TIBCO Administrator (old)TEA + tibcoamx CLIAnypoint Runtime ManagerTEA is simpler than Anypoint but similar management plane concept
AppManage (deploy tool)tibcoamx CLI / TEAAnypoint CLI / MavenCLI-based deployment — MuleSoft experience transfers directly
TIBCO Adapters (separate products)Palette Plugins (bundled)Connectors (Exchange)BW6 plugins ≈ MuleSoft connectors — same concept, different marketplace
Process Engine (single runtime)AppNode per AppSpaceMule Runtime per appBW6 AppNode ≈ Mule Runtime — isolated JVM per group of apps
Fault Handler activityError Scopes (Try/Catch like)On Error Propagate/ContinueBW6 error handling is closer to MuleSoft than to BW5
BW5 CheckpointBW6 Checkpoint (different impl)No direct equivalentBW6 checkpoint requires external storage in CE; MuleSoft uses Object Store
Service AgentAppSpace Fault ToleranceClustering (RTF/CloudHub)BW6 FT built into AppSpace; MuleSoft HA via multiple workers/nodes
.ear deployment.ear / .aar (BW6 format).jar (Mule app)All are JVM artifacts — same concept, different packaging
Domain (BW5)Domain (BW6 — different)Organization/EnvironmentBW6 Domain ≈ Mule Environment in purpose; completely different implementation

What Transfers from BW5 (directly useful)

✓ Transfers Well

  • EMS administration — same broker product, same tibemsadmin tool, same queue/topic concepts
  • Integration patterns — request/reply, pub/sub, CBR, DLQ patterns are universal
  • XPath / XML skills — BW6 still works heavily with XML/XPath
  • JDBC and SQL knowledge — database integration concepts identical
  • Troubleshooting mindset — log reading, connection isolation, systematic debugging
  • TIBCO EMS concepts — durable subscribers, message selectors, flow control

✗ Does NOT Transfer

  • TIBCO Designer skills — completely replaced by Business Studio
  • TRA runtime knowledge — replaced by OSGI AppNode model
  • Old TIBCO Administrator — replaced by TEA (different UI, different concepts)
  • BW5 Adapter configs — adapters replaced by palette plugins
  • BW5 deployment procedures — AppManage replaced by tibcoamx CLI
  • BW5 fault handling model — error scopes work differently in BW6

What Transfers from MuleSoft

MuleSoft Knowledge That Transfers to BW6

MuleSoft background significantly reduces the BW6/CE learning curve. The conceptual model for runtime management, connector configuration, environment-based deployment, and container orchestration is largely shared between the two platforms. The primary learning effort focuses on TIBCO-specific tooling (TEA, tibcoamx CLI, Business Studio) and BW6-specific runtime concepts rather than rebuilding foundational integration knowledge from scratch.

Training Roadmap — Topic by Topic

Each topic below includes a summary of what to focus on and the best free resource available. Work through them in order — each builds on the previous.

Topic 1

OSGI Runtime Concepts

BW6 runs every application as an OSGi bundle inside Apache Felix. Understanding bundles, the bundle lifecycle (INSTALLED → RESOLVED → ACTIVE), classloader isolation, and why "missing bundle" errors happen is foundational. MuleSoft developers: you already know this model — BW6 just uses different bundle naming conventions.
Bundle activation sequence on startup · Bundle dependency resolution (why app fails to start) · Classloader isolation between bundles · How plugins/connectors are loaded as bundles · Reading bundle errors in AppNode logs
osgi.org — Where to Start — Official OSGi Alliance beginner guide
Baeldung — Introduction to OSGi — Practical Java developer introduction
Apache Felix Tutorials — The exact OSGi container BW6 uses
Topic 2

TIBCO Business Studio IDE

Eclipse-based IDE where BW6 apps are built. As an admin you need enough Studio knowledge to: open and read a BW6 project, understand module structure, read process diagrams to understand application flow, and check appconfig.ini values. You don't need to build apps — but you need to read them.
Project structure (modules, shared modules, application module) · appconfig.ini location and format · How process diagrams map to log output · Reading connector configuration to understand what the app connects to · Module descriptor and dependency declarations
docs.tibco.com — BW6 Official Documentation — Start with "Getting Started" guide (free, no login)
TIBCO Software YouTube Channel — Official TIBCO video tutorials including Business Studio walkthroughs
TIBCO Community — BusinessWorks Topic — Community Q&A, how-to articles, real-world solutions
Topic 3

BW6 Process Model

BW6 processes (flows) differ from BW5 in how they handle scope, variables, fault handling, and checkpoints. Understanding the process execution model helps you read Process Monitor in TEA intelligently — why a process is stuck, what state it's in, and whether to kill or resume it.
Process instance lifecycle (Created → Running → Completed/Faulted) · Scope and variable visibility · Error scopes (Try/Catch equivalent) · Compensation and rollback · Checkpoint behavior and when state is persisted · How BW6 subprocess differs from BW5 subprocess
TIBCO BW6 Developer Guide — Processes — Official process model documentation
YouTube — "TIBCO BusinessWorks 6 process tutorial" — Multiple community video walkthroughs
TIBCO Community — Search "BW6 process scope" and "BW6 error handling" for real-world examples
Topic 4

AppNode / AppSpace / Domain Model

This is the most critical admin-specific knowledge. BW6's runtime topology (Domain → AppSpace → AppNode → Application) has no equivalent in BW5. Think of it like: Domain = Anypoint Organization, AppSpace = Anypoint Environment, AppNode = Mule Runtime instance. Getting this mental model right makes everything else click.
Domain hierarchy and environment separation · AppSpace as logical grouping · AppNode as JVM process (size, heap, ports) · How fault tolerance works at AppSpace level · Application deployment to specific AppSpace · Shared Modules and cross-application library sharing
TIBCO BW6 Installation Guide — Runtime Architecture — Official domain/appspace/appnode explanation
TIBCO BW6 Administration Guide — The admin bible — bookmark this
TIBCO YouTube — "BW6 Administration" playlist
Topic 5

TEA Administration

TIBCO Enterprise Administrator is your daily management console. If you've used Anypoint Runtime Manager, TEA will feel familiar in purpose but different in structure. Focus on deployment workflow, process monitoring, and configuration management — these are the 80% of daily admin work.
Deploy / start / stop / undeploy applications · Process Monitor (view, kill, resume process instances) · Application configuration (properties, module properties) · AppNode health monitoring · Plugin Manager · Audit log review · Domain backup and restore
TIBCO Enterprise Administrator Documentation — Official TEA guide
TIBCO Community — TEA Topic — Real admin questions and solutions
YouTube — "TIBCO TEA administration BW6"
Topic 6

Maven Build System for BW6

BW6 uses Maven for build and deployment automation — same as MuleSoft. The mule-maven-plugin and bw6-maven-plugin serve identical purposes. If you've scripted MuleSoft CI/CD with Maven, BW6 CI/CD will feel immediately familiar. Focus on the BW6-specific plugin goals and property injection patterns.
bw6-maven-plugin goals (bwinstall, bwpackage, bwdeploy) · pom.xml structure for BW6 projects · Property file injection per environment · CI/CD pipeline integration (Jenkins/GitHub Actions) · Building EAR artifacts · Shared Module dependency management in pom.xml
TIBCO BW6 Maven Plugin Guide — Official plugin documentation
Apache Maven Getting Started — Maven fundamentals if needed
TIBCO Community — BW6 CI/CD with Jenkins — Community how-to article
Topic 7

BW6 Fault Handling & Error Scopes

BW6 error handling is structurally closer to MuleSoft's On Error Propagate/Continue than to BW5's Fault Handler activity. Understanding how errors propagate through scopes tells you — as admin — why a process instance ended up Faulted, what the original error was, and whether retrying will help or the message needs intervention.
Error propagation through nested scopes · Catch specific error vs catch all · Compensation scope for rollback · How faulted processes appear in TEA Process Monitor · Re-run vs kill decisions · Dead letter pattern implementation in BW6
Topic 8

Docker for BWCE

Already covered in Section 3a of this article. Docker is non-negotiable for BWCE. Prior MuleSoft deployment experience on CloudHub 2.0 or RTF (both container-based platforms) provides a strong conceptual foundation. The key addition is hands-on Docker CLI fluency — building images, running containers locally, and using inspect/exec/logs commands for diagnosis.
Docker image build and layers · Dockerfile authoring for BWCE · Running and debugging containers locally · docker inspect / exec / logs / stats · Image registry management · Container networking fundamentals · Multi-container with Docker Compose
Docker Official Get Started Guide — Best free Docker introduction, hands-on labs included
Play with Docker — Free browser-based Docker environment, no install needed — practice immediately
YouTube — "Docker Tutorial for Beginners" (TechWorld with Nana) — Best free Docker video course
TIBCO BWCE — Creating Docker Images — BWCE-specific Docker guide
Topic 9

Kubernetes for BWCE

BWCE runs on Kubernetes — the same platform MuleSoft's Runtime Fabric (RTF) uses underneath. RTF experience maps directly to BWCE on Kubernetes: Pods, Deployments, Services, ConfigMaps, Secrets, and namespace isolation are the same Kubernetes primitives in both platforms. Focus on the BWCE-specific patterns: how BWCE apps are packaged as Deployments, how configuration is injected via environment variables, and how to diagnose pod-level startup and runtime failures.
Pods, Deployments, ReplicaSets · Services (ClusterIP, NodePort, LoadBalancer) · ConfigMaps and Secrets for BWCE config injection · Namespaces for environment isolation · kubectl essential commands (get, describe, logs, exec, rollout) · Horizontal Pod Autoscaler (HPA) for BWCE scaling · Ingress for external routing · PersistentVolumes for BW checkpoint storage
Kubernetes.io — Kubernetes Basics (Interactive) — Official free interactive tutorial in browser
Killercoda — Kubernetes Scenarios — Free browser-based Kubernetes lab environment
YouTube — "Kubernetes Tutorial for Beginners" (TechWorld with Nana) — Best free K8s full course (4 hrs)
TIBCO BWCE — Deploying on Kubernetes — BWCE-specific K8s deployment guide
Topic 10

TIBCO EMS Administration

EMS is the messaging backbone for most TIBCO enterprise deployments. BW5 developers have EMS exposure but mostly as a developer (sending/receiving messages). Admin-level EMS knowledge means: server configuration, HA setup, queue and topic management, permission management, and diagnosing message flow issues.
tibemsadmin CLI — all show commands · Queue vs Topic configuration (persistence, max depth, max message size) · Durable subscriber management · Fault-tolerant EMS pair setup · Dead letter queue (>$dead.queue.default) · Flow control and back-pressure configuration · EMS SSL/TLS configuration · User and permission management · tibemsd.conf key parameters
TIBCO EMS Documentation — Official admin guide — reference for tibemsadmin commands
TIBCO Community — EMS Topic — Production EMS troubleshooting discussions
YouTube — "TIBCO EMS administration"

Recommended Learning Sequence

The topics below are ordered by dependency — each builds the foundation for the next. Work through them in sequence rather than in parallel for the most efficient path to operational readiness.

PriorityTopicOperational Capability Gained
1 — FirstDomain/AppSpace/AppNode model + TEA hands-onDeploy, start, stop, and monitor applications. The foundation of all admin work.
2Read BW6 projects in Business Studio + process modelUnderstand what any application does, what it connects to, and how data flows through it.
3Docker fundamentals + BWCE build and local runBuild BWCE images, run containers locally, inspect and debug container-level issues.
4Kubernetes fundamentals + kubectl for BWCEManage BWCE pods, read pod logs, diagnose deployment and startup failures.
5Fault handling concepts + debug scenarios in this articleIndependently diagnose the majority of production incidents.
6 — OngoingEMS administration + performance tuning + CI/CDOperational depth — handle complex messaging, tuning, and pipeline automation.
Hands-on practice accelerates understanding more than documentation alone. Access to a non-production BW6 or BWCE environment is essential. Deliberately triggering common failure scenarios — misconfigured app, queue saturation, heap exhaustion — and resolving them builds the diagnostic muscle memory that documentation alone cannot develop.

When you hit a problem you've never seen before, this framework prevents panic and gets you to resolution systematically.

The DREAD Methodology (for unknown issues)

D — Describe

Write down exactly what is happening. Symptom, not assumption. "App X is not processing messages from Queue Y" — not "app is broken".

R — Reproduce

Can you reproduce it? When did it start? What changed before it started? Correlate with deployments, config changes, infra changes.

E — Evidence

Collect all logs, screenshots, metrics before changing anything. You cannot investigate what you've already cleaned up.

A — Analyze

Form hypothesis. Test hypothesis with one change at a time. Document each attempt and result.

TIBCO Support Resources

TIBCO Support Portal (support.tibco.com): Create tickets, search knowledge base. Have your support contract number ready. Severity 1 = production down = phone escalation available.
TIBCO Community (community.tibco.com): Forums, user groups. Search before asking — most common issues have solutions posted.
TIBCO Documentation (docs.tibco.com): Official BW6 and BWCE admin guides. Always reference the exact version you're running.
Thread dump analysis: When BW seems stuck with no errors, take a thread dump. kill -3 <pid> on Linux outputs to stdout/stderr. Look for WAITING threads all waiting on the same lock — that's a deadlock.

Information to Gather Before Escalating

# Collect before contacting TIBCO Support or senior engineer

1. BW version:    tibcoamx --version
2. OS + version:  cat /etc/os-release
3. Java version:  java -version (from AppNode process)
4. Exact error:   Full stack trace from log
5. Timeline:      When did it start? What changed?
6. Reproducible:  Does it happen every time or intermittent?
7. Scope:         One app? One AppNode? All apps? All environments?
8. Logs:          bwappnode.log, bwagent.log, stderr.log (last 24hr)
9. Thread dump:   kill -3 <appnode-pid> → stderr.log
10. Heap dump:    If OOM → .hprof file
11. Config:       Current application configuration (anonymize passwords)

🎯 Topics to Research & Deepen

These topics come up in enterprise BW6 administration and are worth studying further: