Admin

Oracle Peoplesoft

Featured

WebLogic 14c Clustered Domain Setup: AdminServer, NodeManager, JMS Bridges

Build a robust WebLogic 14c clustered domain. Configure AdminServer, NodeManager, and JMS bridges for high availability and performance.

By Someshwar ThakurPublished: June 15, 202612 min read17 views✓ Fact Checked
WebLogic 14c Clustered Domain Setup: AdminServer, NodeManager, JMS Bridges
WebLogic 14c Clustered Domain Setup: AdminServer, NodeManager, JMS Bridges

Overview: Architecting Resilient Messaging with WebLogic 14c Clustered Domains and JMS Bridges

In the demanding landscape of enterprise applications, particularly within the Oracle PeopleSoft ecosystem, robust and highly available middleware infrastructure is not merely a luxury but a fundamental necessity. Oracle WebLogic Server 14c, the latest long-term support release, stands as a cornerstone for deploying mission-critical applications, offering unparalleled performance, scalability, and resilience. This article delves into the intricate process of setting up a WebLogic 14c clustered domain, incorporating the essential components of an AdminServer for centralized management, NodeManager for intelligent process supervision, and critically, JMS bridges for seamless, reliable message exchange.

A WebLogic cluster provides a highly available and scalable environment for applications. By distributing application components across multiple managed servers, it ensures continuous operation even if one server fails, and allows for dynamic scaling to meet fluctuating demand. The AdminServer acts as the control plane for the entire domain, managing configuration and deployment. NodeManager, often overlooked in its strategic importance, automates the startup, shutdown, and monitoring of Managed Servers, providing local restart capabilities and integrating seamlessly with the AdminServer for remote management operations. This is particularly vital in PeopleSoft environments where application servers (PS_APP_SERVER) and integration gateway servers often run as WebLogic Managed Servers, demanding high uptime.

The true power of an integrated enterprise system, such as PeopleSoft, often lies in its ability to communicate effectively with other internal and external systems. This is where Java Message Service (JMS) plays a pivotal role. WebLogic JMS provides a robust, standards-based messaging system. However, for interoperability between different JMS implementations (e.g., two distinct WebLogic domains, or WebLogic JMS and IBM MQ), or even between different JMS servers within the same domain for architectural segregation, JMS bridges become indispensable. These bridges ensure reliable, transactional message forwarding, guaranteeing message delivery and integrity across disparate messaging systems, which is crucial for PeopleSoft's Integration Broker architecture facilitating data synchronization and event-driven processes across the enterprise.

This technical deep-dive will guide you through the complete lifecycle, from environment preparation and software installation to the creation of a clustered domain, NodeManager configuration, and the sophisticated setup of JMS resources and bridges. Our focus will be on practical, command-line driven implementations, reflecting real-world deployment scenarios for enterprise-grade PeopleSoft foundations.

Prerequisites for a Robust WebLogic 14c Environment

Before embarking on the WebLogic 14c domain configuration, a solid foundation must be established. Adhering to these prerequisites ensures a smooth installation and a stable operating environment.

Operating System and User Accounts

  • Operating System: Oracle Linux 7.x or 8.x is highly recommended for optimal performance and support. Red Hat Enterprise Linux (RHEL) or other compatible distributions are also viable. Ensure the OS is fully patched and updated.
  • System Resources:
    • RAM: Minimum 16GB, 32GB or more recommended for production clusters, especially for PeopleSoft deployments.
    • CPU: 4 cores minimum, 8+ cores recommended.
    • Disk Space: At least 50GB free space for Oracle Home, domain directory, logs, and temporary files. Use separate mount points for `/u01/app/oracle/product` (Oracle Home) and `/u01/app/oracle/config/domains` (Domain Home) for better management and I/O performance.
  • Oracle User: A dedicated operating system user, typically `oracle`, with appropriate group memberships (e.g., `oinstall`, `dba`) should be created to own the Oracle software installations and run the WebLogic processes. This user requires a non-interactive shell and a strong password.

sudo groupadd -g 1000 oinstall
sudo groupadd -g 1001 dba
sudo useradd -u 1000 -g oinstall -G dba oracle
sudo passwd oracle
sudo mkdir -p /u01/app/oracle/product
sudo mkdir -p /u01/app/oracle/config/domains
sudo chown -R oracle:oinstall /u01/app/oracle
sudo chmod -R 775 /u01/app/oracle

Java Development Kit (JDK)

  • WebLogic 14c (14.1.1.0.0) requires Oracle JDK 8 (8u261+) or Oracle JDK 11 (11.0.8+). For enterprise stability and broader compatibility with PeopleSoft components, JDK 8 is often preferred.
  • Ensure the JDK is installed in a standard location (e.g., `/u01/app/oracle/product/jdk8`) and the `JAVA_HOME` environment variable is correctly set for the `oracle` user.

# Example .bash_profile for the 'oracle' user
export JAVA_HOME=/u00/app/oracle/product/jdk8
export PATH=$JAVA_HOME/bin:$PATH

Database for Repository Creation Utility (RCU)

  • An Oracle Database (12.2.0.1, 18c, 19c, or 21c) is required to host the Metadata Services (MDS) schema, which is essential for creating a WebLogic JRF (Java Required Files) domain. This domain type is standard for many Oracle Fusion Middleware products and provides foundational services.
  • Ensure you have database connectivity details (hostname, port, service name/SID, database user with DBA privileges).

WebLogic Server 14c Software

  • Download the Oracle Fusion Middleware Infrastructure 14c distribution (fmw_14.1.1.0.0_infrastructure.jar) from the Oracle Technology Network (OTN) or Oracle Software Delivery Cloud. This package includes WebLogic Server, JRF components, and other essential utilities.

Network Configuration

  • Static IP Addresses: All servers participating in the cluster must have static IP addresses.
  • DNS Resolution: Ensure proper DNS resolution for all server hostnames involved (AdminServer, Managed Servers). Update `/etc/hosts` if DNS is not fully configured.
  • Firewall Rules: Open necessary ports:
    • AdminServer HTTP/HTTPS (e.g., 7001/7002)
    • Managed Servers HTTP/HTTPS (e.g., 8001/8002, 8003/8004)
    • NodeManager (e.g., 5556)
    • JMS T3/IIOP ports (if custom ports are used beyond server listen ports)

# Example firewall-cmd commands on Oracle Linux 7/8
sudo firewall-cmd --permanent --add-port=7001/tcp
sudo firewall-cmd --permanent --add-port=7002/tcp
sudo firewall-cmd --permanent --add-port=8001/tcp
sudo firewall-cmd --permanent --add-port=8002/tcp
sudo firewall-cmd --permanent --add-port=5556/tcp
sudo firewall-cmd --reload

Step-by-Step Implementation: Building the WebLogic 14c Clustered Domain

1. Install WebLogic Server 14c

As the `oracle` user, install the Fusion Middleware Infrastructure software. We will use a silent installation for reproducibility and automation.


# Navigate to the directory containing the installer JAR
cd /stage/software/wls14c

# Create an installation response file
cat <<EOF > /tmp/wls_install_response.rsp
[ENGINE]
#DO NOT CHANGE THIS.
Response File Version=1.0.0.0.0

[GENERIC]
ORACLE_HOME=/u01/app/oracle/product/fmw14c
INSTALL_TYPE=Fusion Middleware Infrastructure
DECLINE_SECURITY_UPDATES=true
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
EOF

# Run the installer in silent mode
$JAVA_HOME/bin/java -jar fmw_14.1.1.0.0_infrastructure.jar -silent -responseFile /tmp/wls_install_response.rsp

# Verify installation
ls -l /u01/app/oracle/product/fmw14c

Note: The `INSTALL_TYPE` 'Fusion Middleware Infrastructure' is crucial as it includes the necessary components for JRF domains, which are commonly used for PeopleSoft components that rely on Oracle's Fusion Middleware stack.

2. Create RCU Schemas for Metadata Services (MDS)

The Repository Creation Utility (RCU) creates and manages the necessary database schemas for WebLogic JRF domains. We will create the MDS schema.


# Set environment variables for RCU
export ORACLE_HOME=/u01/app/oracle/product/fmw14c
export PATH=$ORACLE_HOME/oracle_common/bin:$PATH

# Launch RCU in silent mode to create schemas
# Replace with your actual DB details
rcu.sh -silent -createRepository -databaseType ORACLE -connectString "your_db_host:1521/your_pdb_service_name" \
-dbUser sys -dbRole SYSDBA -schemaPrefix PSTOOLS \
-component MDS \
-f -log /tmp/rcu_create_mds.log

# Provide passwords when prompted:
# Enter database password: 
# Enter schema password: 

Important: Choose a strong schema prefix, e.g., `PSTOOLS`, to logically group your PeopleSoft-related WebLogic schemas. Remember the schema password as it will be used during domain creation.

3. Create the WebLogic 14c Clustered Domain

We'll use WebLogic Scripting Tool (WLST) for domain creation, which is ideal for repeatable, automated deployments. This script creates an AdminServer, two Managed Servers, a cluster, and configures NodeManager machines.


# Create a WLST script for domain creation: /tmp/create_domain.py
cat <<EOF > /tmp/create_domain.py
# --- Domain Configuration Variables ---
domain_home = '/u01/app/oracle/config/domains/PSTOOLS_DOMAIN'
oracle_home = '/u01/app/oracle/product/fmw14c'
java_home = '/u01/app/oracle/product/jdk8'
domain_name = 'PSTOOLS_DOMAIN'
admin_user = 'weblogic'
admin_password = 'WeblogicPassword1!' # Use a strong password!

# AdminServer details
admin_server_name = 'AdminServer'
admin_server_listen_address = 'weblogic-admin.example.com' # Replace with your Admin Server hostname/IP
admin_server_listen_port = 7001
admin_server_ssl_port = 7002

# Cluster details
cluster_name = 'PSTOOLS_CLUSTER'

# Managed Server details
managed_server_base_name = 'peoplesoft_app_server'
managed_server_listen_port = 8001
managed_server_ssl_port = 8002
num_managed_servers = 2

# NodeManager details
nodemanager_port = 5556

# Database details for RCU schemas
rcu_db_host = 'your_db_host'
rcu_db_port = 1521
rcu_db_service_name = 'your_pdb_service_name'
rcu_schema_prefix = 'PSTOOLS'
rcu_schema_password = 'PSTOOLS_SCHEMA_PASSWORD' # Replace with your RCU schema password

# --- WLST Script Logic ---
readTemplate(oracle_home + '/wlserver/common/templates/wls/wls.jar')

# Configure JRF (Java Required Files)
selectTemplate('Oracle JRF')
loadTemplates()

# Domain details
set('Name', domain_name)
setOption('DomainName', domain_name)
setOption('OverwriteDomain', 'true') # Use 'true' for initial creation, 'false' otherwise
setOption('JavaHome', java_home)
setOption('AppDir', domain_home + '/applications')

# AdminServer configuration
cd('/Server/AdminServer')
set('ListenAddress', admin_server_listen_address)
set('ListenPort', admin_server_listen_port)
create(admin_server_name, 'Server')
cd('/Server/' + admin_server_name)
set('ListenPort', admin_server_listen_port)
set('ListenAddress', admin_server_listen_address)
set('NumChannels', 1)
create(admin_server_name, 'SSL')
cd('/Server/' + admin_server_name + '/SSL/' + admin_server_name)
set('ListenPort', admin_server_ssl_port)
set('Enabled', 'true')

# Admin user credentials
cd('/Security/base_domain/User/weblogic')
cmo.setUserPassword(admin_password)

# Cluster configuration
cd('/')
create(cluster_name, 'Cluster')
cd('/Cluster/' + cluster_name)
set('ClusterMessagingMode', 'unicast') # or 'multicast' if your network supports it

# Managed Servers and assigning to cluster
for i in range(1, num_managed_servers + 1):
    server_name = managed_server_base_name + str(i)
    cd('/')
    create(server_name, 'Server')
    cd('/Server/' + server_name)
    set('ListenPort', managed_server_listen_port + (i-1)*2) # e.g., 8001, 8003
    set('ListenAddress', 'weblogic-ms' + str(i) + '.example.com') # Replace with your Managed Server hostnames/IPs
    set('Cluster', cluster_name)
    create(server_name, 'SSL')
    cd('/Server/' + server_name + '/SSL/' + server_name)
    set('ListenPort', managed_server_ssl_port + (i-1)*2) # e.g., 8002, 8004
    set('Enabled', 'true')

# Machine configuration for NodeManager
cd('/')
create('Machine1', 'Machine')
cd('/Machine/Machine1')
create('weblogic-admin.example.com', 'NodeManager') # AdminServer host
cd('/Machine/Machine1/NodeManager/weblogic-admin.example.com')
set('ListenAddress', 'weblogic-admin.example.com')
set('ListenPort', nodemanager_port)

cd('/')
create('Machine2', 'Machine')
cd('/Machine/Machine2')
create('weblogic-ms1.example.com', 'NodeManager') # Managed Server 1 host
cd('/Machine/Machine2/NodeManager/weblogic-ms1.example.com')
set('ListenAddress', 'weblogic-ms1.example.com')
set('ListenPort', nodemanager_port)

cd('/')
create('Machine3', 'Machine')
cd('/Machine/Machine3')
create('weblogic-ms2.example.com', 'NodeManager') # Managed Server 2 host
cd('/Machine/Machine3/NodeManager/weblogic-ms2.example.com')
set('ListenAddress', 'weblogic-ms2.example.com')
set('ListenPort', nodemanager_port)

# Assign servers to machines (for NodeManager)
cd('/Server/' + admin_server_name)
set('Machine', 'Machine1')

cd('/Server/' + managed_server_base_name + '1')
set('Machine', 'Machine2')

cd('/Server/' + managed_server_base_name + '2')
set('Machine', 'Machine3')

# JDBC Data Source for RCU schemas (MDS)
cd('/')
create('PSTOOLS_MDS_DS', 'JDBCSystemResource')
cd('JDBCSystemResource/PSTOOLS_MDS_DS/JdbcResource/PSTOOLS_MDS_DS')
create('myJdbcDataSourceParams', 'JDBCDataSourceParams')
cd('JDBCDataSourceParams/myJdbcDataSourceParams')
set('JNDIName', 'jdbc/PSTOOLS_MDS_DS')
set('GlobalTransactionsProtocol', 'None') # For MDS, usually XA is not required

cd('..') # Back to JdbcResource
create('myJdbcDriverParams', 'JDBCDriverParams')
cd('JDBCDriverParams/myJdbcDriverParams')
set('DriverName', 'oracle.jdbc.OracleDriver')
set('URL', 'jdbc:oracle:thin:@' + rcu_db_host + ':' + str(rcu_db_port) + '/' + rcu_db_service_name)
set('Password', rcu_schema_password)
set('UseXADataSource', 'false') # Not an XA datasource for MDS
set('Algorithm', 'AES') # For encrypted password
set('Value', rcu_schema_password) # Plaintext password for encryption during creation
create('myProperties', 'Properties')
cd('Properties/myProperties')
create('user', 'Property')
cd('Property/user')
set('Value', rcu_schema_prefix + '_MDS')

cd('/JDBCSystemResource/PSTOOLS_MDS_DS/JdbcResource/PSTOOLS_MDS_DS')
create('myJdbcConnectionPoolParams', 'JDBCConnectionPoolParams')
cd('JDBCConnectionPoolParams/myJdbcConnectionPoolParams')
set('InitialCapacity', 5)
set('MaxCapacity', 20)
set('MinCapacity', 5)
set('TestConnectionsOnReserve', 'true')
set('TestTableName', 'SQL SELECT 1 FROM DUAL')

# Target the data source to AdminServer and Cluster
cd('/JDBCSystemResource/PSTOOLS_MDS_DS')
set('Target', admin_server_name + ',' + cluster_name)

# Create the domain
writeDomain(domain_home)
closeTemplate()
exit()
EOF

# Run the WLST script
$ORACLE_HOME/oracle_common/common/bin/wlst.sh /tmp/create_domain.py

4. Configure and Start NodeManager

NodeManager is essential for managing server processes remotely. It needs to be configured and running on each physical host that will run WebLogic servers (AdminServer, Managed Servers).


# On each host (weblogic-admin, weblogic-ms1, weblogic-ms2):

# Set environment variables
export DOMAIN_HOME=/u01/app/oracle/config/domains/PSTOOLS_DOMAIN
export WL_HOME=/u01/app/oracle/product/fmw14c/wlserver
export PATH=$WL_HOME/common/bin:$PATH

# Enable NodeManager's ability to start servers using startup scripts
# This is crucial for managing servers with custom environment settings.
cd $DOMAIN_HOME/nodemanager
sed -i 's/StartScriptEnabled=false/StartScriptEnabled=true/' nodemanager.properties

# Configure NodeManager to listen on a specific address and port
# Update nodemanager.properties if needed, ensure ListenAddress is set
# For example, on weblogic-admin.example.com:
# ListenAddress=weblogic-admin.example.com
# ListenPort=5556

# Start NodeManager (can be run in background or as a service)
startNodeManager.sh &

Note: For production, NodeManager should be configured as a system service to ensure it starts automatically on server reboot.

5. Start AdminServer and Managed Servers

First, start the AdminServer manually. Then, use WLST or the Admin Console to start the Managed Servers via NodeManager.


# On the AdminServer host (weblogic-admin.example.com):
# Start AdminServer
cd $DOMAIN_HOME/bin
nohup ./startWebLogic.sh &> /tmp/adminserver.log &

# Wait for AdminServer to start (check /tmp/adminserver.log for "Server started in RUNNING mode")

# Use WLST to connect to AdminServer and start Managed Servers via NodeManager
# Create a WLST script: /tmp/start_managed_servers.py
cat <<EOF > /tmp/start_managed_servers.py
connect('weblogic', 'WeblogicPassword1!', 'weblogic-admin.example.com:7001')
nmConnect('weblogic', 'WeblogicPassword1!', 'weblogic-admin.example.com', 5556, '$DOMAIN_HOME')
nmStart('peoplesoft_app_server1')
nmStart('peoplesoft_app_server2')
disconnect()
exit()
EOF

# Run the WLST script
$ORACLE_HOME/oracle_common/common/bin/wlst.sh /tmp/start_managed_servers.py

Verification: Log in to the WebLogic Admin Console (http://weblogic-admin.example.com:7001/console) to verify that all servers (AdminServer, peoplesoft_app_server1, peoplesoft_app_server2) are in RUNNING state.

6. Configure JMS Resources (Servers, Modules, Queues/Topics)

JMS resources are fundamental for message-driven applications. We'll set up a JMS server, a system module, a persistent store, and a couple of queues within our cluster.


# Create a WLST script: /tmp/configure_jms.py
cat <<EOF > /tmp/configure_jms.py
connect('weblogic', 'WeblogicPassword1!', 'weblogic-admin.example.com:7001')

edit()
startEdit()

# 1. Create a JMS Server
# Target the JMS Server to the cluster for high availability
cd('/')
cmo.createJMSServer('PSTOOLS_JMSServer')
cd('/JMSServer/PSTOOLS_JMSServer')
cmo.setTarget(getMBean('/Clusters/PSTOOLS_CLUSTER'))

# 2. Create a File Store for persistence
cd('/')
cmo.createFileStore('PSTOOLS_FileStore')
cd('/FileStore/PSTOOLS_FileStore')
cmo.setDirectory('$DOMAIN_HOME/PSTOOLS_FileStore') # Ensure this directory exists and is writable
cmo.setTarget(getMBean('/Clusters/PSTOOLS_CLUSTER'))

# Assign the File Store to the JMS Server
cd('/JMSServer/PSTOOLS_JMSServer')
cmo.setPersistentStore(getMBean('/FileStore/PSTOOLS_FileStore'))

# 3. Create a JMS System Module
cd('/')
cmo.createJMSSystemResource('PSTOOLS_JMSModule')
cd('/JMSSystemResource/PSTOOLS_JMSModule')
cmo.setTarget(getMBean('/Clusters/PSTOOLS_CLUSTER')) # Target module to cluster

# 4. Create Subdeployments (for targeting JMS resources)
cd('/JMSSystemResource/PSTOOLS_JMSModule')
sub1 = cmo.createSubDeployment('PSTOOLS_SubDeployment')
sub1.setTarget(getMBean('/JMSServer/PSTOOLS_JMSServer'))

# 5. Create JMS Queues
# Queue for inbound PeopleSoft messages
cd('/JMSSystemResource/PSTOOLS_JMSModule/JMSResource/PSTOOLS_JMSModule')
q1 = cmo.createQueue('PS_INBOUND_QUEUE')
q1.setJNDIName('jms/PSInboundQueue')
q1.setSubDeploymentName('PSTOOLS_SubDeployment')

# Queue for outbound PeopleSoft messages
q2 = cmo.createQueue('PS_OUTBOUND_QUEUE')
q2.setJNDIName('jms/PSOutboundQueue')
q2.setSubDeploymentName('PSTOOLS_SubDeployment')

# Queue for error handling
q3 = cmo.createQueue('PS_ERROR_QUEUE')
q3.setJNDIName('jms/PSErrorsQueue')
q3.setSubDeploymentName('PSTOOLS_SubDeployment')

activate()
disconnect()
exit()
EOF

# Run the WLST script
$ORACLE_HOME/oracle_common/common/bin/wlst.sh /tmp/configure_jms.py

Note: Ensure the directory $DOMAIN_HOME/PSTOOLS_FileStore exists and has correct permissions before running the script.

7. Implement JMS Bridges

JMS bridges enable reliable, asynchronous message forwarding between two JMS destinations. This is crucial for integrating PeopleSoft with external systems or other WebLogic domains. Here, we'll demonstrate bridging an internal queue to another, simulating an integration point. For external systems, you would configure a foreign JMS server or a JCA adapter.


# Create a WLST script: /tmp/configure_jms_bridge.py
cat <<EOF > /tmp/configure_jms_bridge.py
connect('weblogic', 'WeblogicPassword1!', 'weblogic-admin.example.com:7001')

edit()
startEdit()

# Define JNDI names for source and target destinations
source_queue_jndi = 'jms/PSInboundQueue'
target_queue_jndi = 'jms/PSOutboundQueue' # For demonstration, bridging within the same module

# Create a connection factory for the bridge (source and target)
# Often, you'd use a separate CF for the bridge for dedicated resources.
# For simplicity, we'll use a generic one, but in production, separate CFs are recommended.
cd('/')
cmo.createJMSConnectionFactory('BridgeConnectionFactory')
cd('/JMSConnectionFactory/BridgeConnectionFactory')
cmo.setJNDIName('jms/BridgeConnectionFactory')
cmo.setTarget(getMBean('/Clusters/PSTOOLS_CLUSTER'))

# Create a JMS Bridge
cd('/')
jmsBridge = cmo.createJMSBridge('PS_Integration_Bridge')
jmsBridge.setTarget(getMBean('/Clusters/PSTOOLS_CLUSTER')) # Target bridge to cluster for HA

# Source Destination Configuration
cd('/JMSBridge/PS_Integration_Bridge')
sourceConfig = cmo.createSourceDestination('PSBridgeSource')
cd('SourceDestination/PSBridgeSource')
sourceConfig.setConnectionFactoryJNDIName('jms/BridgeConnectionFactory')
sourceConfig.setDestinationJNDIName(source_queue_jndi)
sourceConfig.setDestinationType('Queue')
sourceConfig.setConnectionURL('t3://weblogic-admin.example.com:7001') # AdminServer for initial context
sourceConfig.setInitialContextFactory('weblogic.jndi.WLInitialContextFactory')
sourceConfig.setUser('weblogic') # Bridge user, typically dedicated
sourceConfig.setPassword('WeblogicPassword1!') # Use a dedicated user with minimal permissions

# Target Destination Configuration
cd('/JMSBridge/PS_Integration_Bridge')
targetConfig = cmo.createTarget

Written By

Someshwar Thakur

PS Admin, Cloud Architect, DBA

Sources & References

• Official company announcements and press releases

• Industry reports from Gartner, IDC, and Statista

• Peer-reviewed research and technical documentation

• On-record statements from industry experts

Last verified: June 15, 2026

Fact-checked by TechNews Venture editorial team

Leave a Comment

Comments are moderated and will appear after review.