[ 
https://issues.apache.org/jira/browse/AXIS-2800?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andreas Veithen updated AXIS-2800:
----------------------------------

    Labels: thread-safety  (was: )
    
> 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
>              Labels: thread-safety
>
> 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.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to