Wednesday, April 22, 2015

Create JMS System Module Resources(distributed queue/ error queue/ quota / error quota and relationship between them) using WLST on Weblogic clustered server enviornment.

Server Architecture : 

Suppose we have a custered weblogic server setup which has 2 unix boxes and on each box 2 managed servers have been set up.

A Custom_cluster has been created which has 4 managed servers as below

1. srvr_1.1(on unix box 1)
2. srvr_1.2(on unix box 1)
3. srvr_2.1(on unix box 2)
4. srvr_2.2(on unix box 2)


Refer the below picture to understand the architecture.



I already have below 4 JMS servers each corresponding to 1 managed server

1. JMSServer_auto_1 on managed server srvr_1.1
2. JMSServer_auto_2 on managed server srvr_1.2
3. JMSServer_auto_3 on managed server srvr_2.1
4. JMSServer_auto_4 on managed server srvr_2.2

Assume that we have above configuration ready with us.

Agenda:


I have summarized the agenda for the post in below points.

1. Create JMS Module ‘custom-jms’.

2. Create Subdeployments.

Subdeploy_srvr_1.1 --> JMS Server JMSServer_auto_1
Subdeploy_srvr_1.2 --> JMS Server JMSServer_auto_2
Subdeploy_srvr_2.1 --> JMS Server JMSServer_auto_3
Subdeploy_srvr_2.2 --> JMS Server JMSServer_auto_4

3. Create Distributed Queue.

ex: Custom.queue

4. Create 4 Member Queues of Distributed Queue.

ex:

Custom.queue_auto_1 --> Subdeployment Subdeploy_srvr_1.1
Custom.queue_auto_2 --> Subdeployment Subdeploy_srvr_1.2
Custom.queue_auto_3 --> Subdeployment Subdeploy_srvr_2.1
Custom.queue_auto_4 --> Subdeployment Subdeploy_srvr_2.2

5. Create 4 Error Queues for each Member Queue.

ex:

Custom.queue_auto_1_error --> Subdeployment Subdeploy_srvr_1.1
Custom.queue_auto_2_error --> Subdeployment Subdeploy_srvr_1.2
Custom.queue_auto_3_error --> Subdeployment Subdeploy_srvr_2.1
Custom.queue_auto_4_error --> Subdeployment Subdeploy_srvr_2.2

6. Associate each Error Queue with it's respective Member Queue.

ex:

Custom.queue_auto_1_error --> Member Queue Custom.queue_auto_1

7. Create Quotas for each Member Queue.
ex:

Custom.queue_auto_1.Quota --> Subdeployment Subdeploy_srvr_1.1
Custom.queue_auto_2.Quota --> Subdeployment Subdeploy_srvr_1.2
Custom.queue_auto_3.Quota --> Subdeployment Subdeploy_srvr_2.1
Custom.queue_auto_4.Quota --> Subdeployment Subdeploy_srvr_2.2

8. Associated each Quota with it's respective Member Queue.

ex:

Custom.queue_auto_1.Quota --> Member Queue Custom.queue_auto_1


7. Create Quotas for each Error Queue.

ex:

Custom.queue_auto_1_error.Quota --> Subdeployment Subdeploy_srvr_1.1
Custom.queue_auto_2_error.Quota --> Subdeployment Subdeploy_srvr_1.2
Custom.queue_auto_3_error.Quota --> Subdeployment Subdeploy_srvr_2.1
Custom.queue_auto_4_error.Quota --> Subdeployment Subdeploy_srvr_2.2

8. Associated each Quota with it's respective Error Queue.

ex:

Custom.queue_auto_1_error.Quota --> Error Queue Custom.queue_auto_1_error


All the above configuration can be visualized through below diagram.




Implementation:

To achieve above agenda we will write below scripts.

1. createJMSModule_Subdployment.py : it will create JMS Module/ sub deployment which will point to respective JMS server.
2. createQueue_Quota.py : It will create distributed queue, member queues, error queue for each member queue, quotas for member queues, quotas for error queues.
3. createJMSObjects.sh : It will call the both the python scripts.
4. createJMS.sh : It will call createQueue.sh by passing it required parameter.
5. property file : contains details

I will explain now one by one about each file mentioned above. Create all the above files at a common location.

createJMSModule_Subdployment.py


1. The python script accepts parameters for user, password, url for admin console and domain name.
2. The 'custom-jms' module will be targeted to cluster named as domain name+'_cluster'(domain name will be prefixed to _cluster). One may use a cluster name as per one's requirement.
3. In the below script we kept subdeployment name as hard-coded but one can accept the name of subdeployment as a parameter to the script. In my case Subdeploy_srvr_1.1 will target JMSServer_auto_1 and similarly others.
4. All the resources like JMS member queues,quotas etc will be targetted to subdeployment which in turn will target to JMS server on a managed server.


Code:
# Purpose: To create JMS Module and SubDeployment
# Author: Alok Mishra

import sys

adminConsole_url=sys.argv[1]
print adminConsole_url
adminConsole_user=sys.argv[2]
print adminConsole_user
adminConsole_pwd=sys.argv[3]
print adminConsole_pwd
domain=sys.argv[4]
print domain
target='com.bea:Name='+domain+'_cluster,Type=Cluster'
print target

connect(adminConsole_user, adminConsole_pwd, adminConsole_url)

edit()
startEdit()
#==============================================================================
# Build JMS Module
# target preferable cluster, single-server DEV domain use server
#==============================================================================

cd('/')

cmo.createJMSSystemResource('custom-jms', 'custom-jms.xml')
cd('/SystemResources/custom-jms')
set('Targets',jarray.array([ObjectName(target)], ObjectName))

#==============================================================================

# Build JMS Subdeployment
#==============================================================================

cd('/SystemResources/custom-jms')

cmo.createSubDeployment('Subdeploy_srvr_1.1')
cd('/SystemResources/custom-jms/SubDeployments/Subdeploy_srvr_1.1')
set('Targets',jarray.array([ObjectName('com.bea:Name=JMSServer_auto_1,Type=JMSServer')], ObjectName))

cd('/SystemResources/custom-jms')

cmo.createSubDeployment('Subdeploy_srvr_1.2')
cd('/SystemResources/custom-jms/SubDeployments/Subdeploy_srvr_1.2')
set('Targets',jarray.array([ObjectName('com.bea:Name=JMSServer_auto_2,Type=JMSServer')], ObjectName))

cd('/SystemResources/custom-jms')

cmo.createSubDeployment('Subdeploy_srvr_2.1')
cd('/SystemResources/custom-jms/SubDeployments/Subdeploy_srvr_2.1')
set('Targets',jarray.array([ObjectName('com.bea:Name=JMSServer_auto_3,Type=JMSServer')], ObjectName))

cd('/SystemResources/custom-jms')

cmo.createSubDeployment('Subdeploy_srvr_2.2')
cd('/SystemResources/custom-jms/SubDeployments/Subdeploy_srvr_2.2')
set('Targets',jarray.array([ObjectName('com.bea:Name=JMSServer_auto_4,Type=JMSServer')], ObjectName))

#==============================================================================

# Finalize
#==============================================================================

save()

activate()
disconnect()

#==============================================================================

# End
#==============================================================================

createQueue_Quota.py


1. The python script accepts parameters for user, password, url for admin console and distributed queue name.
2. To create member queues distributed queue name will be appended with _auto_number.
3. The number will be taken between 1 to 4 where 1 would be reffered for srvr_1.1 and similarly 2 would point to 1.2 and 3 would point to 2.1 and 4 would point to 2.2.
4. Once the member queue name is decided it's respective error queue, quota and error quota names can be genrated as mentioned in script.
5. Rest script is self explanatory.

Code:
# Purpose: To create JMS Queue, Error Queue, Quota, Error Quota and their relationship
# Author: Alok Mishra
import sys
queue=sys.argv[1]
print queue
adminConsole_url=sys.argv[2]
print adminConsole_url
adminConsole_user=sys.argv[3]
print adminConsole_user
adminConsole_pwd=sys.argv[4]
print adminConsole_pwd
connect(adminConsole_user,adminConsole_pwd,adminConsole_url)
edit()
startEdit()

#=================================================================================================================

# Build Distributed queue, Member Queues, Error Member Queues, Quotas for Member Queues and Error Member Queues
#=================================================================================================================
#==========================================================================
# Create Distributed Queue
#==========================================================================
startEdit()
cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms')
cmo.createDistributedQueue(queue)
cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/DistributedQueues/'+queue)
cmo.setJNDIName(queue)
#==========================================================================
# For loop for 6 Member Queues under a Distributed Queue 
#==========================================================================
for num in range(1,7):  
  memberQueue="%s_auto_%d"%(queue,num)
  errorMemberQueue="%s_error"%memberQueue
  memberQuota="%s.Quota"%memberQueue
  errorMemberQuota="%s.Quota"%errorMemberQueue
  print memberQueue
  print errorMemberQueue 
  print memberQuota
  print errorMemberQuota
#==========================================================================  
  # Create Member Queue
#==========================================================================  
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms')
  cmo.createQueue(memberQueue)
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+memberQueue)
  cmo.setJNDIName(memberQueue)
  if num==1:
   cmo.setSubDeploymentName('Subdeploy_srvr_1.1')
  elif num==2:
   cmo.setSubDeploymentName('Subdeploy_srvr_1.2')
  elif num==3:
   cmo.setSubDeploymentName('Subdeploy_srvr_2.1')
  elif num==4:
   cmo.setSubDeploymentName('Subdeploy_srvr_2.2')

#==========================================================================  

  # Create Error Member Queue
#==========================================================================  
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms')
  cmo.createQueue(errorMemberQueue)
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+errorMemberQueue)
  cmo.setJNDIName(errorMemberQueue)
  if num==1:
   cmo.setSubDeploymentName('Subdeploy_srvr_1.1')
  elif num==2:
   cmo.setSubDeploymentName('Subdeploy_srvr_1.2')
  elif num==3:
   cmo.setSubDeploymentName('Subdeploy_srvr_2.1')
  elif num==4:
   cmo.setSubDeploymentName('Subdeploy_srvr_2.2')

#==========================================================================   

  # Add Member Queues to Distributed Queue
#==========================================================================  
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/DistributedQueues/'+queue)
  cmo.setLoadBalancingPolicy('Round-Robin')
  cmo.createDistributedQueueMember(memberQueue)
#==========================================================================  
  # Create Quota for Member Queue
#==========================================================================  
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms')
  cmo.createQuota(memberQuota)
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Quotas/'+memberQuota)
  cmo.setBytesMaximum(9223372036854775807L)
  cmo.setMessagesMaximum(9223372036854775807L)
  cmo.setPolicy('FIFO')
  cmo.setShared(false)
  
  # Create Quota for Error Member Queue
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms')
  cmo.createQuota(errorMemberQuota)
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Quotas/'+errorMemberQuota)
  cmo.setBytesMaximum(9223372036854775807L)
  cmo.setMessagesMaximum(9223372036854775807L)
  cmo.setPolicy('FIFO')
  cmo.setShared(false)
#==========================================================================
  # Add Quota to Member Queue
#==========================================================================  
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+memberQueue+'/Thresholds/'+memberQueue)
  cmo.setMessagesLow(9223372036854775807L)
  cmo.setMessagesHigh(9223372036854775807L)
  cmo.setBytesHigh(9223372036854775807L)
  cmo.setBytesLow(9223372036854775807L)

  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+memberQueue)

  cmo.setMaximumMessageSize(2147483647L)
  cmo.setQuota(getMBean('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Quotas/'+memberQuota))
#==========================================================================  
  # Add Quota to Error Member Queue
#==========================================================================  
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+memberQueue+'/Thresholds/'+memberQueue)
  cmo.setMessagesLow(9223372036854775807L)
  cmo.setMessagesHigh(9223372036854775807L)
  cmo.setBytesHigh(9223372036854775807L)
  cmo.setBytesLow(9223372036854775807L)

  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+errorMemberQueue)

  cmo.setMaximumMessageSize(2147483647L)
  cmo.setQuota(getMBean('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Quotas/'+errorMemberQuota))
#==========================================================================
  # Add Error Member Queue to Member Queue
#==========================================================================
  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+memberQueue+'/DeliveryFailureParams/'+memberQueue)
  cmo.setRedeliveryLimit(-1)
  cmo.setExpirationPolicy('Discard')

  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+memberQueue+'/DeliveryParamsOverrides/'+memberQueue)

  cmo.setRedeliveryDelay(-1)

  cd('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+memberQueue+'/DeliveryFailureParams/'+memberQueue)

  cmo.setErrorDestination(getMBean('/JMSSystemResources/custom-jms/JMSResource/custom-jms/Queues/'+errorMemberQueue))

  save()

#==========================================================================
# Finalize
#==========================================================================
   
  
activate()
disconnect()

#================================

# End
#================================

createJMSObjects.sh


1. The shell script will give a call to both the above python scripts with the parameters.

Code:
# Purpose: To call python for creating JMS Queue, Error Queue, Quota, Error Quota and their relationship
# Author: Alok Mishra
#! /bin/sh
java weblogic.WLST /opt/app/mssnas/m6config/Scripts/JMS/createJMSModule_Subdployment.py $adminConsole_url $adminConsole_user $adminConsole_pwd $domain
java weblogic.WLST /opt/app/mssnas/m6config/Scripts/JMS/CreateQueue_Quota.py "Queue_Name" $adminConsole_url $adminConsole_user $adminConsole_pwd $domain


createJMS.sh


1. The script will set the environment.
2. It will read the property file for the parameters.
3. It will call the other shell script and passing the parameters to it.

Code:
# Purpose: To call shell script which inturn will call python to create JMS module, subdeployment, queues and quotas
# Author: Alok Mishra
#! /bin/sh
#DOMAIN_HOME="/opt/app/domains/domain_name"
SCRIPT_HOME="/opt/app/Scripts/JMS"
WL_HOME="/opt/app/bea/wli10gR3MP1/wlserver_10.3"
# set up class path
. "${WL_HOME}/server/bin/setWLSEnv.sh"
. /opt/app/mssnas/m6config/Scripts/JMS/domain.properties
echo $adminConsole_user
echo $adminConsole_pwd
echo $adminConsole_url
echo $domain
. "${SCRIPT_HOME}/createJMSObjects.sh" "${adminConsole_url}" "${adminConsole_user}" "${adminConsole_pwd}" "${domain}"

domain.property


Also have a look at domain.property file.

adminConsole_user=weblogic
adminConsole_pwd=weblogic
adminConsole_url=t3://adminserverURLfor domain:adminserverPort for domain
domain=name of domain


provide user/password and other URLs as per your configurations.Now by simply executing  createJMS.sh all the JMS objects mentioned will be created and login to console and confirm if all the objects are created.

Hope above helps in JMS Objects creation on weblogic server using WLST, please leave your feedback or query.

1 comment: