Uploaded image for project: 'Axis'
  1. Axis
  2. AXIS-2800

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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.4
    • None
    • Basic Architecture
    • Axis version: 1.4
      Jre version: 1.5
      windows server 2003 R2 Service pack 2
      Websphere version : 6.1.0.25

    Description

      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)
        Unknown macro: { 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

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              pawan.l.bhole pawan bhole
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated: