سؤال

أرغب في معرفة الطريقة الصحيحة/الأفضل للتعامل مع التزامن مع خدمة ويب Axis2.

على سبيل المثال، بالنظر إلى هذا الرمز:

public class MyServiceDelegate
{
    @Resource
    UserWebService service; // Injected by spring

    public CustomerDTO getCustomer()
    {
       String sessionString = getSessionStringFromCookies();
       service.setJSESSIONID(sessionString);
       CustomerDTO customer = service.getCustomerFromSessionID();
    }
}

لاحظ أنه فيما سبق أن UserWebService عبارة عن واجهة برمجة تطبيقات تابعة لجهة خارجية.تتطلب الخدمة أنه عند إجراء المكالمات، نقوم بتمرير ملف تعريف الارتباط مع JSESSIONID من جلسة موثقة.

هل أنا على حق في افتراض أن هذا البيان ليس مؤشر ترابط آمن؟أي، بالنظر إلى موضوعين، هل من الممكن أن يحدث ما يلي؟

  • الموضوع أ : service.setJSESSIONID("threadA")
  • الموضوع ب : service.setJSESSIONID("threadB")
  • الموضوع أ : service.getCustomerFromSessionID // service.sesionID == "threadB"

إذا كان الأمر كذلك، ما هي الطريقة الأنسب للتعامل مع هذا الوضع؟هل يجب علي استخدام تجمع الموارد للخدمة؟أم يجب أن أعلن أن الخدمة متزامنة؟

    public CustomerDTO getCustomer()
    {
       synchronized( service ) {
          service.setJSESSIONID(sessionString);
          CustomerDTO customer = service.getCustomerFromSessionID();
       }
    }

أم أن هناك طريقة أخرى أكثر ملاءمة للتعامل مع هذه المشكلة؟

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

المحلول

هل سيكون لكل مؤشر ترابط كائن مفوض خاص به وبالتالي خدمة UserWebService الخاصة به؟

في الحالة البسيطة، إذا تم إنشاء المفوضين على المكدس، فستكون مؤشرات الترابط مستقلة.

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

نصائح أخرى

هل UserWebService أحد فصولك الدراسية؟إذا كان الأمر كذلك، أعتقد أنني سأغير توقيع الطريقة إلى:

public CustomerDTO getCustomer()
{
      CustomerDTO customer = service.getCustomerFromSessionID(sessionString);
}

ولا تحافظ على حالة UserWebService الخاصة بك، وبهذه الطريقة ستكون آمنة بطبيعتها

كما قلت، الوظيفة ليست آمنة للخيط.لدى Java طريقة بسيطة لإنشاء شاشات، وهي عبارة عن كائن يسمح فقط لخيط واحد بالوصول إلى وظيفة ما في المرة الواحدة.مزيد من المعلومات حول المراقبين

لجعله مؤشر ترابط آمنًا، يمكنك وضع المزامنة إما، كما فعلت، حول التعبير، أو قبل اسم الوظيفة:

public synchronized CustomerDTO getCustomer(){
    service.setJSESSIONID(sessionString);
    CustomerDTO customer = service.getCustomerFromSessionID();
}

الفرق بين الاثنين هو الكائن الذي تحوله إلى شاشة.

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