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

يوصف بروتوكول ROSEU بالتفصيل
هنا .
لمقال ، نحن بحاجة فقط إلى معرفة مبدأ إقامة اتصال بين اثنين من عملاء EDI. يرسل كل منهم دعوة لإنشاء اتصال. نوع الدعوة إما "طلب" أو "استراحة".
لإنشاء اتصال ، يجب على كلا المشاركين في سير العمل إرسال دعوة من نوع "طلب". بعد ذلك ، يعتبر الاتصال المعمول بها.
إذا أرسل أحد المشاركين دعوة من النوع "Break" ، فسيتم قطع الاتصال.
في نظامنا ، وضعنا سبع حالات ممكنة للمشاركين EDI.
- فشل الاتصال - NO_CONNECTION
- لقد أرسل عميلنا دعوة للتجوال. لكننا لم نسلمها بعد. له ما يبرره من قبل عدم التزامن من مؤسسة التطبيق وإرساله إلى مركز التجوال. - INVITATION_SAVED
- تم تأسيس الاتصال بنجاح - ARE_CONNECTED
- تم إنهاء الاتصال بمبادرة من أحد المشاركين - CONNECTION_BROKEN
- جاءت دعوة خارجية ، ولم يرسل عميلنا أي شيء من قبل - INVITATION_RECEIVED
- تم قبول دعوة عملائنا من قِبل مركز التجوال - INVITATION_SEND
- خطأ في الاتصال - CONNECTION_ERROR
الأحداث المحتملة:
- أرسل عميلنا دعوة إلى "طلب". - النتيجة
- أرسل عميلنا دعوة "Break" - OUTCOME_REJECT
- أرسل عميل خارجي دعوة "طلب" - INCOME_INVITATION
- أرسل العميل الخارجي دعوة "Break" - INCOME_REJECT
- قبل مركز التجوال الدعوة بنجاح - RC_SUCCESS
- لم يقبل مركز التجوال الدعوة - RC_ERROR
حالة تبديل الجدول. السطر الأول هو الحالة الأولية. العمود الأول هو حدث. عند التقاطع - حالة جديدة.

يمكن تشفير تبديل الحالة هذا من خلال التبديل ، إذا ، إذا كان الأمر كذلك. ولكن من خلال آلة الدولة ، في رأيي ، سيكون هذا أكثر ملاءمة.
المنطق كالتالي - إذا انفصل شخص ما ، فيمكن لأي شخص إعادة تأسيسه. إذا حدث خطأ أثناء إنشاء الاتصال ، فلا يمكن القيام بأي شيء آخر ، يلزم إجراء تصحيح يدوي للمشكلة.
تم الحصول على وثائق مفصلة عن جهاز حالة الربيع
من هنا .
سنقوم بإنشاء السيارة من خلال البناء
StateMachineBuilder.Builder<ClientsState, ContractorEvent> builder = StateMachineBuilder.builder();
بعد ذلك ، وضعنا جميع الحالات الممكنة. يتم تعيين الحالة الأولية على الوضع الحالي للعملاء.
builder.configureStates() .withStates() .initial(initialState) .states(EnumSet.allOf(ClientsState.class));
نحن تكوين التشغيل التلقائي للسيارة. خلاف ذلك ، سوف تضطر إلى البدء يدويا
builder.configureConfiguration() .withConfiguration() .autoStartup(true);
بعد ذلك ، نصف شرائح.
المصدر - الحالة الأولية ،
الهدف - الحالة النهائية ،
الحدث - الحدث الذي يحدث فيه تبديل الحالة ،
الإجراء - يقوم بتحديث أوضاع العميل.
builder.configureTransitions() .withExternal() .source(NO_CONNECTION) .target(INVITATION_RECEIVED) .event(INCOME_INVITATION) .action(updateStateAction) .and() .withExternal() .source(NO_CONNECTION) .target(CONNECTION_BROKEN) .event(INCOME_REJECT) .action(updateStateAction)
بعد إنشاء جهاز الحالة ، ننقل
الحدث إلى مدخلاته. لكننا نحتاج في الواقع إلى معلومات إضافية لتحديث حالة العملاء. لذلك ، نلف
الحدث في
الرسالة ونضع البيانات اللازمة في
الرأس .
StateMachine<ClientsState, ContractorEvent> sm = builder.build(); Map<String, Object> clients = new HashMap<>(); clients.put("client1", "client11"); clients.put("client2", "client22"); MessageHeaders headers = new MessageHeaders(clients); Message<ContractorEvent> message = new GenericMessage<>(event, headers); sm.sendEvent(message); sm.stop();
كذلك في
العمل يتم استخراج هذه البيانات واستخدامها.
@Service public class UpdateStateAction implements Action<ClientsState, ContractorEvent> { @Override public void execute(StateContext<ClientsState, ContractorEvent> context) { System.out.println("Source state: " + context.getSource()); System.out.println("Target state: " + context.getTarget()); System.out.println("Event: " + context.getEvent()); MessageHeaders headers = context.getMessageHeaders(); System.out.println(headers.get("client1")); System.out.println(headers.get("client2")); } }
يمكنك أيضًا استخدام أداة
الحماية لمنع تغييرات الحالة ، لكن هذا ليس ضروريًا في حالتنا.
هذا هو الأساس ذلك. يمكن الحصول على الكود المصدري للمثال من
الرابط .
في المقالة ، درسنا كيفية استخدام جهاز حالة الربيع لتشفير جدول انتقال الحالة.
هذه ليست جميع قدراتها ، ولكن فقط الأكثر أساسية. آمل أن تكون المقالة مفيدة وشجعك على استخدام هذا الإطار.
إذا كان لديك تجربة شخصية في استخدامه ، فمرحباً بك في التعليق.
محدث
أثناء الاستخدام ، تم الكشف عن ميزة شيقة - في حالة حدوث استثناء في أحد الإجراءات الافتراضية ، لا يتم طرح الخطأ ، ولكن يتم تسجيله ببساطة. في هذه الحالة ، لا يتوقف تنفيذ الجهاز بالكامل. وحتى طريقة hasStateMachineError تقوم بإرجاع false.
كقرار ، اتخذنا إجراء AbstractAction نلاحظ فيه الاستثناء ونضعه في سياق آلة الحالة. بعد ذلك ، في حالة حدوث استثناء ، إرجاع hasStateMachineError صحيحًا ثم نقوم بمعالجته مرة أخرى.
@Override public void execute(StateContext<StatesEnum, OperationsEnum> context) { try { prepareContext(context); executeInternal(context); } catch (Exception e) { logger.error(" state machine", e); context.getStateMachine().setStateMachineError(e); } }