From time to time, I have problems consuming webservices via ColdFusion. Usually these problems have to do with changes in the webservice's code or configuration or corruption of the stub objects for the webservice on the calling ColdFusion server. To get around this: I wrap all foreign webservices calls in a <cftry> <cfcatch>; in the catch I reset the webservice; and retry the original webservice call.
To do this call the following code:
<cffunction access="private" name="reset_webservice" output="false" returntype="void" description="Reset the webservice in the Server Factory.">
<cfargument name="wsdl" type="string" required="yes" hint="The url of the the wsdl file of the webservice to reset." />
<cfobject type="JAVA" action="Create" name="factory" class="coldfusion.server.ServiceFactory" />
<cfset RpcService = factory.XmlRpcService />
<cfset RpcService.refreshWebService("#arguments.wsdl#") />
</cffunction>
UPDATE: Sean Corfield schooled me a bit, but it's hard to see how elegant his code is in my comments, so I've reproduced it up here:
Don't forget that the above code is not thread-safe unless you add 'var' declarations for both factory and RpcService:
<cfset var factory = createobject("java", "coldfusion.server. ServiceFactory")>
<cfset var RpcService = factory.XmlRpcService>
<cfset RpcService.refreshWebService(arguments.wsdl)>
(you don't need "#..#" there)
Of course you could do the whole thing in one line and be thread-safe like this:
<cfset createObject("java", "coldfusion.server.ServiceFactory").XmlRpcService.refreshWebService(arguments.wsdl) />
7 response s so far ↓
1 Sean Corfield // Feb 16, 2006 at 1:44 AM
cfset var factory = createobject("java", "coldfusion.server. ServiceFactory")
cfset var RpcService = factory.XmlRpcService
cfset RpcService. refreshWebService (arguments.wsdl)
(you don't need "#..#" there)
Of course you could do the whole thing in one line and be thread-safe like this:
cfset createObject("java", "coldfusion.server. ServiceFactory"). XmlRpcService. refreshWebService (arguments.wsdl)
2 Sean Corfield // Feb 16, 2006 at 1:47 AM
3 Terrence Ryan // Feb 16, 2006 at 3:18 PM
4 cfJeff // Feb 16, 2006 at 4:53 PM
5 Rich Rein // Feb 17, 2006 at 10:41 AM
<cftry>
<!--- try to consume web service --->
<cfcatch type="any">
<cfset reset_webservice(wsdl_URL) />
<!--- try to consume web service again --->
</cfcatch>
</cftry>
where your web service call would happen a maximum of two times before erroring out?
6 Rich Rein // Feb 17, 2006 at 10:42 AM
cftry
call webservice
cfcatch type="any"
reset_webservice(wsdl_url)
call webservice again
/cfcatch
/cftry
Also, would this be useful for noticing a change in a local webservice and reloading it, rather than having to restart the CF service?
7 Terrence Ryan // Feb 17, 2006 at 10:46 AM
As for this as an alternative to restartings: Absolutely. It's the equivalent and reloading the webservice in the cfide/administrator console.
Leave a Comment