This is the case when we are dealing with the thread of a currently running page request.
But sometimes it needed to kill some threads which are created by some other page request and the execution of the thread hung or taking too many times. At that time we can kill those type threads using the following user defined functions in coldfusion.
<cffunction name="getAllActiveThreads" access="public" description="Returns all currently active threads." output="false" returntype="Array">The above function will return all the active threads information in an array Collection Object. Now we can display the information in the UI. If we will dump the thread information then it looks like:
<cfargument name="CFAdminPW" required="true" type="string" hint="The password to the cf admin." default="#application.CFAdminPW#" />
<cfscript>
local.returnedObject = arrayNew(1);
try{
//Creating admin and servermonitoring Object
local.adminObj = createobject("component","cfide.adminapi.administrator");
local.monitorObj = createobject("component","cfide.adminapi.servermonitoring");
//Login to Admin API
local.adminObj.login(arguments.CFAdminPW);
//Get all active thread information
local.returnedObject = local.monitorObj.getAllActiveCFThreads();
//log out from the admin API login
local.adminObj.logout();
} catch(Any e){
}
return local.returnedObject;
</cfscript>
</cffunction>
Now, in the second step we will kill any specific thread. From the above dump image you will find fields "THREADNAME" and "CFTHREADNAME". Here THREADNAME is the name assigned to the thread by the system and CFTHREADNAME is the name assigned to a thread in the "name" parameter during thread creation. So, when you are trying to kill one thread forcefully then always pass the THREADNAME instead of CFTHREADNAME as it will be unique always.
Below is the coldfusion function to kill a thread.
<cffunction name="killActiveThread" access="public" description="Kill One Hung active cfthread" output="false" returntype="any">Hope you will enjoy with the code. :)
<cfargument name="threadName" required="true" type="string" hint="The thread name. It can be cfthread name or THREADNAME of the thread Object" />
<cfargument name="CFAdminPW" required="true" type="string" hint="The password to the cf admin." default="#application.CFAdminPW#" />
<cfscript>
try{
//Creating Object Of Admin and Server monitoring API
local.adminObj = createobject("component","cfide.adminapi.administrator");
local.monitorObj = createobject("component","cfide.adminapi.servermonitoring");
//login to admin API
local.adminObj.login(arguments.CFAdminPW);
//kill the thread whose is present the argument
local.killedThread = local.monitorObj.abortCFThread(arguments.threadName);
//logout from admin API
local.adminObj.logout();
return "The thread:#arguments.threadName# has been killed sucessfully!";
} catch(Any e) {
return e.message;
}
</cfscript>
</cffunction>
Hi, thanks a ton for this post. It came in very handy at a time when I had been splitting my hair over external thread control.
ReplyDeleteJust one pint of note though, the killActiveThread() function requires the THREADNAME of the thread Object and not the cfthreadname.
Great post! Thanks again. :)
Very glad that this post help you. I understand your point. But, for each thread we are creating our system generates an unique thread name even though we are trying to create threads with same name. So to avoid confusion it is better to use system generated thread name during thread killing.
DeleteIf you will say again that we can not create two threads with same name from the same page request. Then we can create two thread with the same name using two different page request.
If you have any confusion then I can help you.
I guess admin password is required?
ReplyDeleteYes, we need that.
Delete