Author Archive

How to run WLST script using Cronjob ?

Ravish Mody

One of our subscriber middleware_guy was having issues to run a WLST script using Cronjob and wanted us to help him out with it to solve his problem by providing him a detailed steps or the script which would do the same for him, hence we thought that it would be better if we create an article on this issue so that everyone can take the advantage and can run any WLST script using cronjob.

The requirement was to run the WLST script every hour so that they can get some information from the running Weblogic server, we had suggested to use the cronjob to this part of the job, as running WLST script continually in the background takes lot of usage and we have been reported that this causes high CPU issue as well, thus using cronjob would be a best choice in this situation. For the new guys the question would come….

What is a Cronjob ?

Cronjob is a a job scheduler which is used for time based scheduler which comes with all Unix based operating systems and one of the best tool for the all administrators. You can use cronjob to run any commands or scripts periodically in a certain time based or dates wise manner which would automate the job of an administrators like taking backup of the logs every week, clean up the logs which are older then 30 days etc.

To use cronjob there are predefined scheduling definitions which has to be used as show in the diagram, which would give you a better picture what all things are needed to activate a cronjob.

* * * * * [command/script to get executed]

┬    ┬    ┬    ┬    ┬
│    │    │    │    │
│    │    │    │    │
│    │    │    │    └───── day of week [0 to 7] (where Sunday=0 or 7)
│    │    │    └────────── month [1 to 12]
│    │    └─────────────── day of month [1 to 31]
│    └──────────────────── hour [0 to 23]
└───────────────────────── min [0 to 59]

Let’s take an example, as per the requirement middleware_guy wanted that the WLST script should be called every hour, so to get that job done following would be the command which has to go in the “crontab” file.

0 * * * * [script]

This would make sure that the given script would run every hour, however to run a WLST script we would have to make sure that the weblogic environment is set properly so that it can call the WLST script or else it would get an exception. So the below shell script would do that job to sent the weblogic environment and then call the WLST script as well. Create a file called “WLST.sh” and put the below code in it

#!/bin/bash

# ************* Setting the Environment ***********************
DOMAIN_HOME="/home/testusr/WLS103/user_projects/domains/Domain_7001"
. ${DOMAIN_HOME}/bin/setDomainEnv.sh $*

echo "Environment has been set....."

# ************* Changing the directory where all the related files are needed ***********************
cd home/testusr/WLS/App_State

echo "Calling the PYTHON script....."

# ************* Calling the WLST script  *****************
java weblogic.WLST application_status.py

NOTE:

Make sure that all the files to run the python script and the WLST.sh file should be in the same directory folder so that you would not get filenotfound error.

Hence below line would be given in the crontab file to run the WLST script given in the WLST.sh file

0 * * * * /home/testusr/WLS/App_State/WLST.sh >> home/testusr/WLS/App_State/out.log

Same way if you want to run your script in every 15 minutes (like 1:15, 1:30,1:45,2:00,2:15…) then do the following:

00,15,30,45  *   *  *  * /home/testusr/WLS/App_State/WLST.sh >> home/testusr/WLS/App_State/out.log

Regards,
Ravish Mody


Sending Email Alert for Application Current State

Ravish Mody

Yesterday evening one of your subscriber middleware_guy using comment asked us how can he can get a regular update say every 1 hour get an email showing the current state of an applications which are not in prepared or failed states, hence we updated our previous script which was written by Jay called Getting Application States using WLST to get the above requirement.

We have just added the two logic in this script which are the email and condition loop which would make sure that only shoot an email when the applications are not in Active states, however you can still modify this to fulfill your requirement and regarding the check every 1 hour I would suggest to use the Cron-Job utility to call this script.

Update:

I have updated the script to show on which server is the applications are be targeted, as this script automatically gets all the application state which are been deployed on all the servers in that domain, without giving any details of the managed servers in domain.

Steps to Create an Email Alert For Application Current State

Step1) Create a Directory somewhere in your file system like : “C:WLST”

Step2) Write a Properties file “domains.properties” inside “C:WLST” like following:

admin.url=t3://localhost:7001
username=weblogic
password=weblogic

Step-3) Create a WLST Script somewhere in your file system with some name like “application_status.py” inside “C:WLST” contents will be something like following:

#############################################################################
#
# @author Copyright (c) 2010 - 2011 by Middleware Magic, All Rights Reserved.
#
#############################################################################
from java.io import FileInputStream
import java.lang
import os
import string

propInputStream = FileInputStream("domains.properties")
configProps = Properties()
configProps.load(propInputStream)

ServerUrl = configProps.get("admin.url")
UserName = configProps.get("username")
Password = configProps.get("password")

#############  This method would send the Alert Email  #################
def sendMailString():
	os.system('/bin/mailx -s  "ALERT: Applications are currently NOT in ACTIVE state !!! " ABCD@comapny.com < currentAppState_file')
	print '*********  ALERT MAIL HAS BEEN SENT  ***********'

redirect('wlst.log','false')
connect(UserName,Password,ServerUrl)
cd ('AppDeployments')
myapps=cmo.getAppDeployments()
print '=============================================='
print 'Following Applications are not in STATE_ACTIVE'
print '=============================================='
for appName in myapps:
	domainConfig()
	cd ('/AppDeployments/'+appName.getName()+'/Targets')
	mytargets = ls(returnMap='true')
	domainRuntime()
	cd('AppRuntimeStateRuntime/AppRuntimeStateRuntime')
	for targetinst in mytargets:
		currentAppState=cmo.getCurrentState(appName.getName(),targetinst)
		if currentAppState != "STATE_ACTIVE":
			writeInFile ='Applicaiton = "'+ appName.getName() +'"   //    Targeted Server = "'+str(mytargets)+'"   //     Current STATE = "'+ currentAppState +'"'
			print '', writeInFile
			cmd = "echo " + writeInFile + " >> currentAppState_file"
			os.system(cmd)
print '=============================================='
print''
sendMailString()
cmd = "rm -f wlst.log currentAppState_file"
os.system(cmd)

Step-4) Open a command prompt and then run the “setWLSEnv.cmd” or “setWLSEnv.sh” to set the CLASSPATH and PATH variables. Better you do echo %CLASSPATH% or echo $CLASSPATH to see whether the CLASSPATH is set properly or not. If you see an Empty Classpath even after running the “setWLSEnv.sh” then please refer to the Note mentioned at Step3) in the Following post: http://middlewaremagic.com/weblogic/?page_id=1492 Step-5) Now run the WLST Script in the same command prompt using the following command:

java   weblogic.WLST  application_status.py

You will see the following kind of results in the command prompt

$java weblogic.WLST application_status.py

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

==============================================
Following Applications are not in STATE_ACTIVE
==============================================
 Applicaiton = "Mysite"   //    Targeted Server = "[AdminServer]"   //     Current STATE = "STATE_PREPARED"
 Applicaiton = "SessionTest.war#VesionB"   //    Targeted Server = "[Cluster]"   //     Current STATE = "STATE_NEW"
 Applicaiton = "_appsdir_ClassLoaderTestEAR_ear"   //    Targeted Server = "[AdminServer]"   //     Current STATE = "STATE_PREPARED"
 Applicaiton = "MDB"   //    Targeted Server = "[MS-2]"   //     Current STATE = "STATE_NEW"
 Applicaiton = "FirstEARApplication"   //    Targeted Server = "[MS-1]"   //     Current STATE = "STATE_NEW"
 Applicaiton = "SecondEARApplication"   //    Targeted Server = "[MS-1]"   //     Current STATE = "STATE_NEW"
==============================================

*********  ALERT MAIL HAS BEEN SENT  ***********

NOTE: This script is using mailx (i.e. but Windows box does not have mailx utility) so please do check if your mailx is configured properly or else script would run properly but the mail would not be sent.


Regards,

Ravish Mody


[Updated Version] Steps to Move Messages From One Queue To Another Queue Using WLST

Ravish Mody

Today one of our subscribers Pavan had  come back saying that the WLST script which was created by us previously How to Move Messages From One Queue To Another Queue Using WLST was only “working to move the messages from one queue to another queue which are on the same servers only”  by using comment , and as per his requirement they need to move the messages from Queue-1 to Queue-2 which are targeted to Server-1 and Server-2 respectively. Hence I have just made few modification in my previous script and thus this is the update version of it

I had to add two URL’s to get connected to the with the respective servers and also added two System Module this way you can move the messages from any Source Server to the Destination Server which can be in the same module or if the destination server is in different system module too this way its more flexible. All this can be done using the same script just give the domain and there servers details in the domain.properties files and you are good to go.

[Updated Version] Steps to Move Messages From One Queue To Another Queue Using WLST

Step1). Create a Directory somewhere in your file system like : “C:WLSTMove_Messages”

Step2). Write a Properties filedomain.properties inside “C:WLSTMove_Messages” like following:

######################
#    Destination
######################
new.server.url=t3://localhost:8003
new.system.module.name=SystemModule2
new.tragated.server.name=MS-2
new.jms.server.name=JMSServer2
new.queue.name=Q2

######################
#	Source
######################
old.server.url=t3://localhost:8002
old.system.module.name=SystemModule1
old.tragated.server.name=MS-1
old.jms.server.name=JMSServer1
old.queue.name=Q1

username=weblogic
password=weblogic

Step2). Now in the same directory write the following WLST Script “move_messages.py” like following:

#############################################################################
#
# @author Copyright (c) 2010 - 2011 by Middleware Magic, All Rights Reserved.
#
#############################################################################
from java.io import FileInputStream
import java.lang
import os
import string

propInputStream = FileInputStream("domain.properties")
configProps = Properties()
configProps.load(propInputStream)

newserverUrl = configProps.get("new.server.url")
newsystemModuleName = configProps.get("new.system.module.name")
newTragatedServerName = configProps.get("new.tragated.server.name")
newJmsServerName = configProps.get("new.jms.server.name")
newQueueName = configProps.get("new.queue.name")

oldserverUrl = configProps.get("old.server.url")
oldsystemModuleName = configProps.get("old.system.module.name")
oldTragatedServerName = configProps.get("old.tragated.server.name")
oldJmsServerName = configProps.get("old.jms.server.name")
oldQueueName = configProps.get("old.queue.name")

Username = configProps.get("username")
Password = configProps.get("password")

# Connecting to the Destination
connect(Username,Password,newserverUrl)
serverRuntime()

print 'Getting the traget...'
cd('/JMSRuntime/'+newTragatedServerName+'.jms/JMSServers/'+newJmsServerName+'/Destinations/'+newsystemModuleName +'!'+ newQueueName)
target = cmo.getDestinationInfo()
print 'Got the traget...'

disconnect()
print ''

# Connecting to the Source
connect(Username,Password,oldserverUrl)
serverRuntime()
cd('/JMSRuntime/'+oldTragatedServerName+'.jms/JMSServers/'+oldJmsServerName+'/Destinations/'+oldsystemModuleName +'!'+ oldQueueName)

print 'Moving the messages to the new traget...'
cmo.moveMessages('',target)
print 'Messages have been moved to the traget Successfully !!!'

print '===================================================================================='
print 'Messages from queue: "'+oldQueueName+'" have been moved to the new queue: "'+newQueueName+'" Successfully !!!'
print '===================================================================================='

Step3). Now Open a Command/Shell Prompt and then run the “setWLSEnv.sh” script to set the CLASSPATH and PATH environment variables. Run the “. ./setWLSEnv.sh” by adding two DOTs separated by a single space …..before the actual script like following : (use ‘cd’ command to move inside the <BEA_HOME>/wlserver_10.3/server/bin) then run the following command….
. ./setWLSEnv.sh

Note: Here The first DOT represents that set the Environment in the current Shell, AND the second ./ represents execute the script from the current directory.

Step4). Run the Above WLST Script like following:

java weblogic.WLST move_messages.py

Following would be the Output

java weblogic.WLST move_messages.py

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

Connecting to t3://localhost:8003 with userid weblogic ...
Successfully connected to managed Server 'MS-2' that belongs to domain 'Domain_8001'.

Warning: An insecure protocol was used to connect to the
server. To ensure on-the-wire security, the SSL port or
Admin port should be used instead.

Location changed to serverRuntime tree. This is a read-only tree with ServerRuntimeMBean as the root.
For more help, use help(serverRuntime)

Getting the traget...
Got the traget...
Disconnected from weblogic server: MS-2

Connecting to t3://localhost:8002 with userid weblogic ...
Successfully connected to managed Server 'MS-1' that belongs to domain 'Domain_8001'.

Warning: An insecure protocol was used to connect to the
server. To ensure on-the-wire security, the SSL port or
Admin port should be used instead.

Moving the messages to the new traget...
Messages have been moved to the traget Successfully !!!
====================================================================================
Messages from queue: "Q1" have been moved to the new queue: "Q2" Successfully !!!
====================================================================================

Note:

Pava you would have to change the line number – 35  & 45 as per your environment

Regards,
Ravish Mody


Copyright © 2010-2012 Middleware Magic. All rights reserved. |