سؤال

هل Java EE 6 أحداث CDI المعاملات؟

إذا قمت بإطلاق حدث في معاملة ، وبعد ذلك تراجع المعاملة ، فهل تتراجع آثار مستمع الحدث أيضًا؟

هل يعتمد هذا السلوك على مستمع الحدث نفسه الذي يدعم المعاملات؟

ماذا عن إذا حاولت التراجع عن الاستثناء من داخل مستمع الحدث ، فهل يتدحرج المعاملة التي أطلقت الحدث؟

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

المحلول

من أحداث الفصل من مواصفات CDI 1.0 ، يمكن للمرء أن يحدد حدثًا ليكون "معاملات" من خلال تحديد معاملة معاملة ، حيث يكون معاملات هو أحد:

  • في تَقَدم،
  • قبل _completion ،
  • بعد الاتمام،
  • بعد_failure ،
  • بعد_SUCCESS

يشبه مثل هذا الإعلان:

void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }

إذا لم يتم إعلان المراقب أنه "معاملات" ، فإن الحاوية تستدعي المراقب فورًا ، وإلا فإنه يسجل طريقة المراقب للاستدعاء اللاحق أثناء مرحلة إكمال المعاملة ، باستخدام مزامنة JTA.

لكن:

أي يمكن أن تستدعي طريقة المراقب المسمى قبل الانتهاء من المعاملة setRollbackOnly () لفرض تراجع المعاملة. قد لا تبدأ طريقة المراقب مباشرة أو ارتكاب أو تراجع معاملات JTA.

إذا كانت طريقة Observer تطرح استثناء (وهي نفسها ليست "معاملات") ، فإن الاستثناء يعمل على إحباط معالجة الحدث.

لذلك ، لتحقيق السلوك الذي أبحث عنه ، أعتقد أنني سأسجل المراقب الخاص بي على أنه "معاملات" ، وتحديد معاملة معاملة Quaret_Completion. أود بعد ذلك الاتصال بـ setRollbackonly () إذا أردت تراجع المعاملة التي بدأت الحدث.

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