Axis locators not thread safe (java.util.ConcurrentModificationException: 
concurrent access to HashMap attempted by Thread)
---------------------------------------------------------------------------------------------------------------------------

                 Key: AXIS-2800
                 URL: https://issues.apache.org/jira/browse/AXIS-2800
             Project: Axis
          Issue Type: Bug
          Components: Basic Architecture
    Affects Versions: 1.4
         Environment: Axis version: 1.4
Jre version: 1.5
windows server 2003 R2 Service pack 2
Websphere version : 6.1.0.25
            Reporter: pawan bhole


i am creating locators only once and storing those in HashMap. And at every 
service call (by multiple threads parallely) I am just retriving locators from 
HashMap and using those for creating methode call.

Code:

public class WsClientRetriever {

    protected final Log log = LogFactory.getLog(getClass());
    
    protected final HashMap<Class<? extends Service>,Object> servicesMapCache = 
new HashMap<Class<? extends Service>, Object>();
    
    /**
     * The url for the services
     */
    private String rootUrl;
    
    /**
     * This generic method will return the WebService class using the given web 
service locator class
     * @param serviceLocatorClass
     * @return
     * @throws ServiceRetrievalException if the service could not be retrieved 
in any ways
     */
    public synchronized Object getWebService(Class<? extends Service> 
serviceLocatorClass) throws ServiceRetrievalException {
        Object locator = servicesMapCache.get(serviceLocatorClass);
        Object result = null;
        // it's not in our cache, we have to get it using reflexion
        try {
                if (locator == null) {
                        locator = serviceLocatorClass.newInstance();
                        servicesMapCache.put(serviceLocatorClass, locator);
                }
            Method[] methods = serviceLocatorClass.getMethods();
            // we look for the method that needs an URL as parameter and starts 
with get
            for (int i = 0; i < methods.length; i++) {
                Method method = methods[i];
                if (method.getName().startsWith("get") && 
(method.getParameterTypes().length == 1) && (method.getParameterTypes()[0] == 
URL.class)){
                    // we found it, we need to call it
                    result = method.invoke(locator, 
getWSURL(serviceLocatorClass));
                }
                
            }
        } catch (Exception e) {
            throw new ServiceRetrievalException(serviceLocatorClass, e);
        }
        // now we are sure to have it
        return result;
    }

    
    /**
     * Creates the URL to access the web service
     * @param serviceLocatorClass service locator class name
     * @return URL of the service where deployed
     */
    private URL getWSURL(Class<? extends Service> serviceLocatorClass) {

        String slClassName = serviceLocatorClass.getName();

        String serviceClassName = 
slClassName.substring(slClassName.lastIndexOf('.') + 1, 
slClassName.lastIndexOf("ServiceLocator"));
        String serviceURLString = rootUrl + serviceClassName;
        URL serviceURL = null;
        try {
            serviceURL = new URL(serviceURLString);
            return serviceURL;
        } catch (MalformedURLException e) {
            log.debug("caught an exception", e);
            throw new WebServiceRetrievalException(serviceURLString, e);
        }
    }

    /**
     * @param rootUrl the rootUrl to set
     */
    public void setRootUrl(String rootUrl) {
        this.rootUrl = rootUrl;
        if (this.rootUrl != null && !this.rootUrl.endsWith("/")) {
            this.rootUrl += "/";
        }
    }

}
    
*********************************************************************************************************************************


stack trace :

[8/13/09 16:55:21:077 IST] 00000026 ExceptionUtil E   CNTR0020E: EJB threw an 
unexpected (non-declared) exception during invocation of method "onMessage" on 
bean 
"BeanId(ProPayEAR#ProPayEJB-1.2-ENGINE-SPR7-IT1-SNAPSHOT.jar#MessageProcessor, 
null)". Exception data: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
com.ibm.ejs.jms.listener.ServerSessionDispatcher.dispatch(ServerSessionDispatcher.java:37)
        at com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java:96)
        at com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java:132)
        at com.ibm.ejs.jms.listener.ServerSession.run(ServerSession.java:492)
        at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1497)
Caused by: java.lang.RuntimeException: 
com.te.jpay.exception.EnvironmentalException: Failure trying to get the Call 
object; nested exception is: 
        java.util.ConcurrentModificationException: concurrent access to HashMap 
attempted by Thread[MessageListenerThreadPool : 0,5,main]
        at 
com.te.jpay.ejb.messagesreceiver.MessagesProcessorBean.onMessage(MessagesProcessorBean.java:62)
        at 
com.ibm.ejs.jms.listener.MDBWrapper$PriviledgedOnMessage.run(MDBWrapper.java:302)
        at 
com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63)
        at 
com.ibm.ejs.jms.listener.MDBWrapper.callOnMessage(MDBWrapper.java:271)
        at com.ibm.ejs.jms.listener.MDBWrapper.onMessage(MDBWrapper.java:240)
        at com.ibm.mq.jms.MQSession.run(MQSession.java:1691)
        at com.ibm.ejs.jms.JMSSessionHandle.run(JMSSessionHandle.java:975)
        at 
com.ibm.ejs.jms.listener.ServerSession.connectionConsumerOnMessage(ServerSession.java:957)
        at 
com.ibm.ejs.jms.listener.ServerSession.onMessage(ServerSession.java:667)
        at 
com.ibm.ejs.jms.listener.ServerSession.dispatch(ServerSession.java:634)
        ... 9 more
Caused by: com.te.jpay.exception.EnvironmentalException: Failure trying to get 
the Call object; nested exception is: 
        java.util.ConcurrentModificationException: concurrent access to HashMap 
attempted by Thread[MessageListenerThreadPool : 0,5,main]
        at 
com.te.jpay.backendintegration.tietoapps.jdir.CreditMechanismHelperWsImpl.getCreditMechanism(CreditMechanismHelperWsImpl.java:75)
        at 
com.te.jpay.backendintegration.tietoapps.jdir.CreditMechanismHelperWsImpl.assignCreditMechanism(CreditMechanismHelperWsImpl.java:101)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at 
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:77)
        at 
org.perf4j.aop.AbstractTimingAspect.doPerfLogging(AbstractTimingAspect.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
        at 
org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:64)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
        at 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy73.assignCreditMechanism(Unknown Source)
        at 
com.te.jpay.backendintegration.tietoapps.jdir.JDirectoryClientImpl.assignCreditMechanism(JDirectoryClientImpl.java:123)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at 
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:77)
        at 
org.perf4j.aop.AbstractTimingAspect.doPerfLogging(AbstractTimingAspect.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
        at 
org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:64)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
        at 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy76.assignCreditMechanism(Unknown Source)
        at 
com.te.jpay.processing.InwardDDCollectionReceiverImpl.performGroupLevelProcessing(InwardDDCollectionReceiverImpl.java:110)
        at 
com.te.jpay.processing.InwardDDCollectionReceiverImpl.doBusinessLogic(InwardDDCollectionReceiverImpl.java:64)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at 
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:77)
        at 
org.perf4j.aop.AbstractTimingAspect.doPerfLogging(AbstractTimingAspect.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
        at 
org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:64)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
        at 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy77.doBusinessLogic(Unknown Source)
        at 
com.te.jpay.dispatch.DefaultPaymentDispatcher.dispatchMessageFromBulker(DefaultPaymentDispatcher.java:108)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at 
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:77)
        at 
org.perf4j.aop.AbstractTimingAspect.doPerfLogging(AbstractTimingAspect.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:618)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
        at 
org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
        at 
org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:64)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
        at 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at 
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy78.dispatchMessageFromBulker(Unknown Source)
        at 
com.te.jpay.ejb.messagesreceiver.MessagesProcessorBean.onMessage(MessagesProcessorBean.java:49)
        ... 18 more
Caused by: Failure trying to get the Call object; nested exception is: 
        java.util.ConcurrentModificationException: concurrent access to HashMap 
attempted by Thread[MessageListenerThreadPool : 0,5,main]
        at 
com.te.prodirectory.ws.client.mechanism.MechanismWSSoapBindingStub.createCall(MechanismWSSoapBindingStub.java:384)
        at 
com.te.prodirectory.ws.client.mechanism.MechanismWSSoapBindingStub.getMechanismParameterByCodeword(MechanismWSSoapBindingStub.java:460)
        at 
com.te.jpay.backendintegration.tietoapps.jdir.CreditMechanismHelperWsImpl.getCreditMechanism(CreditMechanismHelperWsImpl.java:73)
        ... 108 more
Caused by: java.util.ConcurrentModificationException: concurrent access to 
HashMap attempted by Thread[MessageListenerThreadPool : 0,5,main]
        at java.util.HashMap.onExit(HashMap.java:226)
        at java.util.HashMap.transfer(HashMap.java:690)
        at java.util.HashMap.resize(HashMap.java:676)
        at java.util.HashMap.addEntry(HashMap.java:1049)
        at java.util.HashMap.put(HashMap.java:561)
        at 
org.apache.axis.encoding.TypeMappingImpl.internalRegister(TypeMappingImpl.java:263)
        at 
org.apache.axis.encoding.TypeMappingImpl.register(TypeMappingImpl.java:221)
        at 
org.apache.axis.encoding.TypeMappingDelegate.register(TypeMappingDelegate.java:73)
        at org.apache.axis.client.Call.registerTypeMapping(Call.java:2285)
        at org.apache.axis.client.Call.registerTypeMapping(Call.java:2322)
        at 
com.te.prodirectory.ws.client.mechanism.MechanismWSSoapBindingStub.createCall(MechanismWSSoapBindingStub.java:369)
        ... 110 more



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to