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

Reply via email to