سؤال

انا استخدم Apache Commons SCXML, ، وأود أن أعرف ما إذا كان من الممكن إخبار آلة الحالة (SCXMlexecutor) بالانتقال إلى حالة معينة.

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

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

المحلول

في الحالة العامة ، من الجيد حقًا القفز إلى دولة دون أن تكون آلة الدولة "تدرك" ، لأنه قد تكون هناك شروط مسبقة لإعدام دولة معينة غير راضية (سيكون ذلك إذا وصلت إلى الدولة "بالطريقة العادية. تتمثل الفكرة الأفضل في تصميم آلة الحالة بإمكانية "إعادة التشغيل" ، وتنفيذها كحدث "إعادة التشغيل" والولايات والتحولات اللازمة للتعامل معها.

نصائح أخرى

هذا سؤال قديم ، لكنني فقط ضربت هذا وأحتاج إلى إجابة عليه أيضًا واعتقدت أنه قد يساعد الآخرين على الإجابة عليه. أنا أستخدم هذا كجزء من اختبار الوحدة ، حيث من المفيد للغاية الوصول إلى حالة معينة (أريد أن أتأكد هناك بعد العبث مع آلة الحالة XML!)

لقد وجدت أخيرًا هذا الرمز في SCXMLTESTHELPER وعمل. ما عليك سوى الاتصال به مع المنفذ وحالة الوجهة.

public static void setCurrentState(SCXMLExecutor exec, final String id) throws IllegalArgumentException{
    try {
        exec.reset();
    } catch (ModelException me) {
        throw new IllegalArgumentException("Provided SCXMLExecutor "
                + "instance cannot be reset.");
    }
    TransitionTarget active = (TransitionTarget) exec.getStateMachine().
            getTargets().get(id);
    if (active == null) {
        throw new IllegalArgumentException("No target with id '" + id
                + "' present in state machine.");
    }
    Set current = exec.getCurrentStatus().getStates();
    current.clear();
    current.add(active);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top