سؤال

عند تطوير تطبيق يستهلك موقع ويب خارجي قمت بإنشائه من المصادر من عنوان URL WSDL ثم قمت بإنشاء عميل:

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

نظرا لأن إنشاء هذا الوكيل يستغرق بعض الوقت أقوم بتعيين العميل كمسمة في فئة الخدمة الخاصة بي.

لكنني قلق من أن العميل ليس آمنا للخيط ويتم استخدام WebService بشكل كبير في التطبيق من خلال المواضيع المتزامنة (WebApp). لا يمكنني العثور على أي وثائق حول هذا.

كإجراء وقائي بدأت في استخدام مجموعة كائن من عملاء الصابون بدلا من مجموعة مشتركة.

هل هذه الاحتياطات غير الضرورية؟ ما هي أفضل الممارسات عند كتابة عملاء 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) ملاحظة واحدة هي أن القفل الأخير يبدو أنه في تنفيذ Jaxb وليس في Xfire. ماذا لو حاولت استخدام تطبيق Jaxb مختلف jaxme.?

2) أيضا الطريقة getjaxbcontext في Jaxbtype. مزامنة. وعلى الأرجح لأن المواضيع الخاصة بك تصل إلى نفس مثيل Jaxbtype قد يتم حظرها.

بالنظر إلى هذه الطريقة كنت قد نقلت في الواقع المزامنة إلى الطريقة بعد التحقق من مروع السياق:

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

سيسمح ذلك للعملاء الذين لديهم بالفعل JaxbContext تهيئة لتخطي المزامنة باهظة الثمن.

اقتراحي إما حاول إصلاح الكود بنفسك وإجراء اختبار أو إرسال خطأ إلى Xfire أو القيام بهما على حد سواء :).

نصائح أخرى

يعتمد على إصدار Xfire الذي تستخدمه، لأنها ثابتة عدد قليل من مشكلات سلامة الخيط في الإصدار 1.2.5. يمكنك التحقق من الخطأ الذي أثيرت في http://jira.codehaus.org/browse/xfire-886. ومشاهدة المزيد من التفاصيل حول ملاحظات الإصدار في HXXP: //xfire.codehaus.org/xfire+1.2.5+Release

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top