Hashtable might fix the problem you're seeing, but it won't fix the underlying thread safety issue: the 'put' could be executed multiple times. Maybe it's not a big deal, but isEnumClassSub might still be called more than once for a given class *and* the 'put' might modify Entry.next while a 'get' is in progress. Using a Hashtable won't necessarily solve that. Safest to synchronize the whole method (or put the code in a block synchronized to enumMap). Chris
-----Original Message----- From: Alsarraf, Laheeb (NIH/OD) [C] [mailto:[EMAIL PROTECTED] Sent: Tuesday, January 31, 2006 11:36 To: axis-user@ws.apache.org Subject: RE: Generated code not Thread safe I tested that the web service is Not causing the lock. I opened multiple JVMs and ran the same code as simultaneously as I could press the enter button. Below is the thread dump on Windows. The lock happens in org.apache.axis.utils.JavaUtils.java method isEnumClass(): Attribute enumMap is not Thread safe. Maybe Axis should replace HashMap with Hashtable: private static HashMap enumMap = new HashMap(); public static boolean isEnumClass(Class cls) { Boolean b = (Boolean)enumMap.get(cls); if(b == null) { b = isEnumClassSub(cls) ? Boolean.TRUE : Boolean.FALSE; enumMap.put(cls, b); } return b.booleanValue(); } ======================================================================= Full thread dump Java HotSpot(TM) Client VM (1.4.2_08-b03 mixed mode): ======================================================================= "Thread-5" prio=5 tid=0x00a620f8 nid=0xb5c runnable [304f000..304fd8c] at java.util.HashMap.get(HashMap.java:325) at org.apache.axis.utils.JavaUtils.isEnumClass(JavaUtils.java:1060) at org.apache.axis.encoding.ser.BeanSerializerFactory.init(BeanSerialize rFactory.java:49) at org.apache.axis.encoding.ser.BeanSerializerFactory.<init>(BeanSeriali zerFactory.java:42) at org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(Base SerializerFactory.java:235) at org.apache.axis.client.Call.registerTypeMapping(Call.java:2315) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.createCall(EUt ilsServiceSoapStub.java:10286) - locked <0x10589da0> (a gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceS oapStub) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.run_eSummary(E UtilsServiceSoapStub.java:10513) at gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSClient.run(NIHMSClient.java :77) "Thread-4" prio=5 tid=0x00a61f78 nid=0x848 runnable [300f000..300fd8c] at java.util.HashMap.get(HashMap.java:325) at org.apache.axis.utils.JavaUtils.isEnumClass(JavaUtils.java:1060) at org.apache.axis.encoding.ser.BeanSerializerFactory.init(BeanSerialize rFactory.java:49) at org.apache.axis.encoding.ser.BeanSerializerFactory.<init>(BeanSeriali zerFactory.java:42) at org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(Base SerializerFactory.java:235) at org.apache.axis.client.Call.registerTypeMapping(Call.java:2315) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.createCall(EUt ilsServiceSoapStub.java:10286) - locked <0x10589de8> (a gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceS oapStub) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.run_eSummary(E UtilsServiceSoapStub.java:10513) at gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSClient.run(NIHMSClient.java :77) "Thread-3" prio=5 tid=0x00a84be8 nid=0x148 runnable [2fcf000..2fcfd8c] at java.util.HashMap.get(HashMap.java:325) at org.apache.axis.utils.JavaUtils.isEnumClass(JavaUtils.java:1060) at org.apache.axis.encoding.ser.BeanSerializerFactory.init(BeanSerialize rFactory.java:49) at org.apache.axis.encoding.ser.BeanSerializerFactory.<init>(BeanSeriali zerFactory.java:42) at org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(Base SerializerFactory.java:235) at org.apache.axis.client.Call.registerTypeMapping(Call.java:2315) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.createCall(EUt ilsServiceSoapStub.java:10286) - locked <0x10589e30> (a gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceS oapStub) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.run_eSummary(E UtilsServiceSoapStub.java:10513) at gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSClient.run(NIHMSClient.java :77) "Thread-2" prio=5 tid=0x00a84a88 nid=0x8ac runnable [2d7f000..2d7fd8c] at java.util.HashMap.get(HashMap.java:325) at org.apache.axis.utils.JavaUtils.isEnumClass(JavaUtils.java:1060) at org.apache.axis.encoding.ser.BeanSerializerFactory.init(BeanSerialize rFactory.java:49) at org.apache.axis.encoding.ser.BeanSerializerFactory.<init>(BeanSeriali zerFactory.java:42) at org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(Base SerializerFactory.java:235) at org.apache.axis.client.Call.registerTypeMapping(Call.java:2315) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.createCall(EUt ilsServiceSoapStub.java:10286) - locked <0x10589e78> (a gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceS oapStub) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.run_eSummary(E UtilsServiceSoapStub.java:10513) at gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSClient.run(NIHMSClient.java :77) "Thread-1" prio=5 tid=0x00a58d00 nid=0x914 runnable [2d3f000..2d3fd8c] at java.util.HashMap.get(HashMap.java:325) at org.apache.axis.utils.JavaUtils.isEnumClass(JavaUtils.java:1060) at org.apache.axis.encoding.ser.BeanSerializerFactory.init(BeanSerialize rFactory.java:49) at org.apache.axis.encoding.ser.BeanSerializerFactory.<init>(BeanSeriali zerFactory.java:42) at org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(Base SerializerFactory.java:235) at org.apache.axis.client.Call.registerTypeMapping(Call.java:2315) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.createCall(EUt ilsServiceSoapStub.java:10286) - locked <0x10589ec0> (a gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceS oapStub) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.run_eSummary(E UtilsServiceSoapStub.java:10513) at gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSClient.run(NIHMSClient.java :77) "Thread-0" prio=5 tid=0x00a58ba0 nid=0xbb8 runnable [2cff000..2cffd8c] at java.util.HashMap.get(HashMap.java:325) at org.apache.axis.utils.JavaUtils.isEnumClass(JavaUtils.java:1060) at org.apache.axis.encoding.ser.BeanSerializerFactory.init(BeanSerialize rFactory.java:49) at org.apache.axis.encoding.ser.BeanSerializerFactory.<init>(BeanSeriali zerFactory.java:42) at org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(Base SerializerFactory.java:235) at org.apache.axis.client.Call.registerTypeMapping(Call.java:2315) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.createCall(EUt ilsServiceSoapStub.java:10286) - locked <0x10589f08> (a gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceS oapStub) at gov.nih.nlm.ncbi.www.soap.eutils.EUtilsServiceSoapStub.run_eSummary(E UtilsServiceSoapStub.java:10513) at gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSClient.run(NIHMSClient.java :77) "Signal Dispatcher" daemon prio=10 tid=0x009fefe8 nid=0x81c waiting on condition [0..0] "Finalizer" daemon prio=9 tid=0x009fc640 nid=0xafc in Object.wait() [2bbf000..2b bfd8c] at java.lang.Object.wait(Native Method) - waiting on <0x104fa938> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111) - locked <0x104fa938> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) "Reference Handler" daemon prio=10 tid=0x009fb2c0 nid=0xe00 in Object.wait() [2b 7f000..2b7fd8c] at java.lang.Object.wait(Native Method) - waiting on <0x104fa748> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:429) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:115) - locked <0x104fa748> (a java.lang.ref.Reference$Lock) "main" prio=5 tid=0x00036108 nid=0xd34 in Object.wait() [7f000..7fc38] at java.lang.Object.wait(Native Method) - waiting on <0x104fa750> (a gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSC lient) at java.lang.Thread.join(Thread.java:1001) - locked <0x104fa750> (a gov.nih.nihms.www.soap.nihmssrv1_cgi.NIHMSClien t) at java.lang.Thread.join(Thread.java:1054) at gov.nih.nihms.www.soap.nihmssrv1_cgi.ThreadsTest.main(ThreadsTest.jav a:33) "VM Thread" prio=5 tid=0x00a3b6e8 nid=0x280 runnable "VM Periodic Task Thread" prio=10 tid=0x00a55fe8 nid=0x8dc waiting on condition "Suspend Checker Thread" prio=10 tid=0x009fe6a0 nid=0xc88 runnable Laheeb Alsarraf -----Original Message----- From: Ferguson, Neil, VF-NZ [mailto:[EMAIL PROTECTED] Sent: Monday, January 30, 2006 4:59 PM To: axis-user@ws.apache.org Subject: RE: Generated code not Thread safe Hi. You've probably considered this already, but it's worth noting that it may not necessarily be the Axis client that's hanging, but could be the remote service. Have you checked to see whether the call is getting as far as the remote service? (the org.apache.axis.utils.tcpmon tool may be useful for this). Anyway, like Cyrille says, you should try and generate a thread dump (hit CTRL-Break in the JVM in Windows). Neil. -----Original Message----- From: Alsarraf, Laheeb (NIH/OD) [C] [mailto:[EMAIL PROTECTED] Sent: Tuesday, 31 January 2006 6:02 a.m. To: axis-user@ws.apache.org Subject: RE: Generated code not Thread safe Neil, I checked out the discussion thread and I do use a new Stub object but the generated code still hangs unless I use Synchronize around my call. Here is the run() method I use in my test class which extends Thread. public void run(){ System.out.println("Starting Thread:" + threadName); try{ EUtilsServiceLocator eUtilService = new EUtilsServiceLocator(); EUtilsServiceSoap utils = eUtilService.geteUtilsServiceSoap(); ESummaryRequest params = new ESummaryRequest(); params.setDb("pubmed"); params.setId(pubMedId); Date startTimeEsum_ = new Date(); System.out.println("Thread:" + threadName + ". " + "Calling utils.run_eSummary ===================="); // When I use this line as is then the code hangs. ESummaryResult eSummaryRes = utils.run_eSummary(params); /* When I replace the above code line with this commented code then the client returns successfully. ObjectLock obj = ObjectLock.getInstance(); synchronized(obj) { ESummaryResult eSummaryRes = utils.run_eSummary(params); } */ }catch(Exception e){ System.out.println("Exception in Thread:" + threadName + "\n" + e); stop(); } }// End run() Thanks Laheeb Alsarraf -----Original Message----- From: Ferguson, Neil, VF-NZ [mailto:[EMAIL PROTECTED] Sent: Sunday, January 29, 2006 7:17 PM To: axis-user@ws.apache.org Subject: RE: Generated code not Thread safe Hi. You might find this recent discussion on this mailing helpful: http://marc.theaimsgroup.com/?l=axis-user&m=113771126214607&w=2 Basically, the generated stub doesn't seem to be thread-safe, but it doesn't seem to be very expensive to create a new stub each time you want one. The service locator does seem to be thread-safe (and is relatively expensive to create), so you can cache this. Hope this helps. Neil. -----Original Message----- From: Alsarraf, Laheeb (NIH/OD) [C] [mailto:[EMAIL PROTECTED] Sent: Saturday, 28 January 2006 8:51 a.m. To: axis-user@ws.apache.org Subject: Generated code not Thread safe Hello, I have used axis 1.1.2 and axis 1.1.3 to generate client code for a web service. I tested the generated code for multithreading and the program deadlocks. I added "Synchronized" keyword in the method createCall() of the generated code and that solved the problem. Has anyone had thread safety problems with web service client code generated using axis. Here is the command I use to generate the code: java -cp %AXISCP% org.apache.axis.wsdl.WSDL2Java --timeout -1 %* Thanks Laheeb Alsarraf ------------------------------------------------------------------------ ----------------------- Have you seen our website?.... http://www.vodafone.co.nz Manage Your Account, check your Vodafone Mail and send web2TXT online: http://www.vodafone.co.nz/myvodafone CAUTION: This correspondence is confidential and intended for the named recipient(s) only. If you are not the named recipient and receive this correspondence in error, you must not copy, distribute or take any action in reliance on it and you should delete it from your system and notify the sender immediately. Thank you. Unless otherwise stated, any views or opinions expressed are solely those of the author and do not represent those of Vodafone New Zealand Limited. Vodafone New Zealand Limited 20 Viaduct Harbour Avenue, Private Bag 92161, Auckland 1030 Telephone + 64 9 355 2000 Facsimile + 64 9 355 2001 ------------------------------------------------------------------------ ----------------------- Have you seen our website?.... http://www.vodafone.co.nz Manage Your Account, check your Vodafone Mail and send web2TXT online: http://www.vodafone.co.nz/myvodafone CAUTION: This correspondence is confidential and intended for the named recipient(s) only. If you are not the named recipient and receive this correspondence in error, you must not copy, distribute or take any action in reliance on it and you should delete it from your system and notify the sender immediately. Thank you. Unless otherwise stated, any views or opinions expressed are solely those of the author and do not represent those of Vodafone New Zealand Limited. Vodafone New Zealand Limited 20 Viaduct Harbour Avenue, Private Bag 92161, Auckland 1030 Telephone + 64 9 355 2000 Facsimile + 64 9 355 2001