2009-08-06 3 views
1

나는 WSDL-URL에서 소스를 생성하고 클라이언트 만든 외부 웹 서비스 소비 애플리케이션 개발 :이 프록시를 생성하기 때문에xfire 클라이언트 프록시 스레드가 안전합니까?

GeoIPServiceClient service = new GeoIPServiceClient(); 
GeoIPServiceSoap geoIPClient = service.getGeoIPServiceSoap(); 

내가 속성으로 클라이언트를 설정 시간이 좀 걸립니다 내 봉사반에서.

는하지만 클라이언트가 스레드로부터 안전하지 않습니다 있다는 걱정이 웹 서비스는 크게 동시 스레드 (웹 애플리케이션)하여 응용 프로그램에 사용됩니다. 이것에 대한 문서를 찾을 수 없습니다.

예방책으로 공용 클라이언트 대신 비누 클라이언트의 개체 풀을 사용하기 시작했습니다.

이것은 불필요한 예방 조치입니까? xfire 클라이언트를 작성할 때 가장 좋은 방법은 무엇입니까? 나는 정기적으로, 높은 부하, 스레드를 차단하고,이 응용 프로그램이 충돌의 결과로 얻을 이후

나는 XFire 메신저와 동시성 문제가 어떤 종류의를 생각한다. 다음은 부분 스레드 덤프입니다.

"http-xx.xx.xx.xx-80-17" daemon prio=10 tid=0x00007f560d437000 nid=0x66cb waiting for monitor entry [0x00000000412b8000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at com.sun.xml.bind.v2.runtime.reflect.opt.Injector.inject(Injector.java:174) 
    - waiting to lock <0x00007f561d44e1c0> (a com.sun.xml.bind.v2.runtime.reflect.opt.Injector) 
    at com.sun.xml.bind.v2.runtime.reflect.opt.Injector.inject(Injector.java:85) 
    at com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector.prepare(AccessorInjector.java:87) 
    at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:165) 
    at com.sun.xml.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:253) 
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.<init>(TransducedAccessor.java:231) 
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor.get(TransducedAccessor.java:173) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty.<init>(SingleElementLeafProperty.java:83) 
    at sun.reflect.GeneratedConstructorAccessor165.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.sun.xml.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:124) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:171) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:481) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:315) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:139) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:117) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:188) 
    at sun.reflect.GeneratedMethodAccessor176.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:128) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:277) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:337) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:244) 
    at org.codehaus.xfire.jaxb2.JaxbType.getJAXBContext(JaxbType.java:306) 
    - locked <0x00007f565b3aee60> (a org.codehaus.xfire.jaxb2.JaxbType) 
    at org.codehaus.xfire.jaxb2.JaxbType.writeObject(JaxbType.java:230) 
    at org.codehaus.xfire.aegis.AegisBindingProvider.writeParameter(AegisBindingProvider.java:229) 
    at org.codehaus.xfire.service.binding.AbstractBinding.writeParameter(AbstractBinding.java:273) 
    at org.codehaus.xfire.service.binding.WrappedBinding.writeMessage(WrappedBinding.java:90) 
    at org.codehaus.xfire.soap.SoapSerializer.writeMessage(SoapSerializer.java:80) 
    at org.codehaus.xfire.transport.http.HttpChannel.writeWithoutAttachments(HttpChannel.java:56) 
    at org.codehaus.xfire.transport.http.OutMessageRequestEntity.writeRequest(OutMessageRequestEntity.java:51) 
    at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499) 
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114) 
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398) 
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) 
    at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.send(CommonsHttpMessageSender.java:369) 
    at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:123) 
    at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48) 
    at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26) 
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) 
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79) 
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114) 
    at org.codehaus.xfire.client.Client.invoke(Client.java:336) 
    at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77) 
    at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57) 
    at $Proxy143.getMyMethod(Unknown Source) 

스레드 덤프에는 이와 유사한 많은 차단 된 스레드가 있습니다.

답변

1

스레드는 개체 데이터가 손상되지 않기 때문에 클라이언트는 실제로 스레드로부터 안전합니다. 하지만 좋은 방법으로 동시성을 처리하지 않는다고 동의합니다.

1) 하나 명의 관찰은 최종 잠금 JAXB 구현에서가 아니라있는 XFire 것 같다 것입니다. JaxMe과 같은 다른 JAXB 구현을 사용하려고하면 어떻게 될까요?

2)도 JaxbType의 방법 getJAXBContext 동기화된다. 그리고 스레드가 차단 된 동일한 JaxbType 인스턴스에 액세스하고 있기 때문에 가능성이 큽니다. 상황에 맞는 presense 체크 후 그 방법을 보면

사실 방법으로 동기화를 이동합니다 :

if (context == null) { 
    synchronized (this) { 
     ... 

이 이미 JAXBContext에 비싼 동기화를 건너 초기화가 고객을 위해 수 있습니다.

나의 제안 중 하나가 코드를 직접 수정 시도하고 테스트를하거나있는 XFire에 버그를 제출하거나 둘 :)을 할 수 있습니다.

1

버전 1.2.5에서 몇 가지 스레드 안전 문제가 수정되어 사용중인 Xfire 버전에 따라 다릅니다. http://jira.codehaus.org/browse/XFIRE-886에서 제기 된 버그를 확인하고 hxxp : //xfire.codehaus.org/XFire+1.2.5+Release+Notes의 릴리스 정보에 대한 자세한 내용을 참조하십시오.

관련 문제