كيفية إنهاء CXF WebService Call داخل إلغاء المستقبل عند الإلغاء في المستقبل

StackOverflow https://stackoverflow.com/questions/1120783

سؤال

يحرر

لقد مر هذه السؤال من خلال بعض التكرارات الآن، لذلك لا تتردد في النظر في المراجعات لرؤية بعض المعلومات الأساسية حول التاريخ والأشياء التي حاولت.


أنا أستخدم الانتهاء من الانتهاء من التنفيذ في التنفيذ وقابل للاستيلاد، لاستدعاء عدد الوظائف بشكل متزامن على عدد قليل من مواقع الويب المختلفة من خلال التعليمات البرمجية التي تم إنشاؤها cxf .. هذه الخدمات تساهم جميعها بمعلومات مختلفة تجاه مجموعة واحدة من المعلومات التي أستخدمها مشروعي. ومع ذلك، يمكن أن تفشل الخدمات في الاستجابة لفترة طويلة من الزمن دون إلقاء استثناء، وإطالة انتظار المجموعة المشتركة من المعلومات.

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

إليك بعض الكود المبسطة للغاية لتوضيح ما أقوم به بالفعل:

private Callable<List<Feature>> getXXXFeatures(final WiwsPortType port, 
final String accessionCode) {
    return new Callable<List<Feature>>() {
        @Override
        public List<Feature> call() throws Exception {
            List<Feature> features = new ArrayList<Feature>();
            //getXXXFeatures are methods of the WS Proxy
            //that can take anywhere from second to never to return
            for (RawFeature raw : port.getXXXFeatures(accessionCode)) {
                Feature ft = convertFeature(raw);
                features.add(ft);
            }
            if (Thread.currentThread().isInterrupted())
                log.error("XXX was interrupted");
            return features;
        }
    };
}

والرمز الذي يبدأ باستمرار مكالمات WS:

WiwsPortType port = new Wiws().getWiws();
List<Future<List<Feature>>> ftList = new ArrayList<Future<List<Feature>>>();
//Counting wrapper around CompletionService, 
    //so I could implement ccs.hasRemaining()
CountingCompletionService<List<Feature>> ccs = 
        new CountingCompletionService<List<Feature>>(threadpool);
ftList.add(ccs.submit(getXXXFeatures(port, accessionCode)));
ftList.add(ccs.submit(getYYYFeatures(port accessionCode)));
ftList.add(ccs.submit(getZZZFeatures(port, accessionCode)));

List<Feature> allFeatures = new ArrayList<Feature>();
while (ccs.hasRemaining()) {
            //Low for testing, eventually a little more lenient
    Future<List<Feature>> polled = ccs.poll(5, TimeUnit.SECONDS);
    if (polled != null)
        allFeatures.addAll(polled.get());
    else {
        //Still jobs remaining, but unresponsive: Cancel them all
        int jobsCanceled = 0;
        for (Future<List<Feature>> job : ftList)
            if (job.cancel(true))
                jobsCanceled++;
        log.error("Canceled {} feature jobs because they took too long",
                        jobsCanceled);
        break;
    }
}

المشكلة التي أواجهها مع هذا الرمز هي أن القذائف CADABLES غير ملغاة فعلا عند انتظار المنفذ. كما ترون من if (Thread.currentThread().isInterrupted()) log.error("XXX was interrupted"); تصريحات العلم المقاطعة يكون تعيين بعد Port.getFeatures إرجاع، هذا متاح فقط بعد اكتمال مكالمة WebService بشكل طبيعي، بدلا منه تمت مقاطعةه عندما اتصلت بالإلغاء.

هل يمكن لأحد أن يقول لي ما أفعله خطأ وكيف يمكنني إيقاف تشغيل مكالمة تشغيل WebService تشغيل CXF بعد فترة زمنية معينة، وتسجيل هذه المعلومات في طلبي؟

مع أطيب التحيات، تيم

هل كانت مفيدة؟

المحلول

تحرير 3. إجابة جديدة.

أرى هذه الخيارات:

  • أضف مشكلتك في Apache CXF كطلب ميزة
  • إصلاح ACXF بنفسك وفضح بعض الميزات.
  • ابحث عن خيارات لدعم استدعاء WS غير متزامن داخل Apache CXF
  • النظر في التبديل إلى مزود WS مختلف (JAX-WS؟)
  • هل اتصل بك باستخدام نفسك باستخدام API مريح إذا كانت الخدمة تدعمها (مثل طلب HTTP عادي مع المعلمات)
  • بالنسبة لخبراء OÜBER فقط: استخدم مجموعة الخيوط الحقيقية / مجموعة الموضوع وقتل المواضيع بطرق غير تقليدية.

نصائح أخرى

لدى مستندات CXF بعض التعليمات لإعداد مهلة القراءة على httpurlconnection:http://cwiki.apache.org/cxf20doc/client-http-transport-including-ssl-support.html.

من شأنه أن يلبي احتياجاتك. إذا كان الخادم لا يستجيب في الوقت المناسب، فسيتم رفع استثناء وسيحصل الاتصال على الاستثناء. (إلا أن هناك خطأ حيث قد يتعطل بدلا من ذلك. لا أستطيع أن أتذكر ما إذا كان ذلك ثابتا مقابل 2.2.2 أو إذا كان ذلك في اللصائح الآن.)

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