Как выйти из потока?

После того, как я вошел в поток лиц, я хочу выйти из него, перейдя на любую страницу, которая не является частью потока.

Проблема в том, что поток не будет разрушен, если я выхожу на улицу, например, через h:link, Действительно, если я снова нажму на h:commandButton чье действие - идентификатор потока, я возвращаюсь к предыдущему потоку вместо создания нового потока.

Как выйти из потока без необходимости явно нажимать на h:commandButton чье действие соответствует возвратному узлу потока? Это вообще возможно?

Редактировать:

Давайте возьмем этот поток для примера (из примеров JEE 7)

@Produces @FlowDefinition
public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
    String flowId = "flow1";
    flowBuilder.id("", flowId);
    flowBuilder.viewNode(flowId, "/" + flowId + "/" + flowId + ".xhtml").markAsStartNode();

    flowBuilder.returnNode("taskFlowReturn1").
            fromOutcome("#{flow1Bean.returnValue}");
    flowBuilder.returnNode("goHome").
            fromOutcome("#{flow1Bean.homeValue}");

    flowBuilder.inboundParameter("param1FromFlow2", "#{flowScope.param1Value}");
    flowBuilder.inboundParameter("param2FromFlow2", "#{flowScope.param2Value}");

    flowBuilder.flowCallNode("call2").flowReference("", "flow2").
            outboundParameter("param1FromFlow1", "param1 flow1 value").
            outboundParameter("param2FromFlow1", "param2 flow1 value");

    return flowBuilder.getFlow();
}

Поток будет прерван, если пользователь нажмет на

<h:commandButton id="index" value="home" action="goHome" />

или же

<h:commandButton id="return" value="return" action="taskFlowReturn1" />

Но что, если пользователь нажимает на

<h:link outcome="someOutcomeUnrelatedToTheFlow"/>

Или, если пользователь изменяет URL в браузере, не удаляя jfwid? Кажется, что поток не завершен, но пользователь фактически просматривает вне потока.

Это кажется мне немного странным: я не могу найти какой-либо способ выйти из потока (и освободить компоненты поддержки) без какого-либо конкретного действия пользователя по команде commandButton/commandLink.

Кстати: я тестирую это на WildFly 8 CR1.

1 ответ

Решение

Вы правы. В текущей версии спецификация требует навигации с использованием компонентов UICommand, чтобы определить, завершен ли поток или нет. Однако этого недостаточно для сценария достойного использования, когда навигация происходит с использованием GET.

Несмотря на концептуальный пробел в спецификациях, решение может быть реализовано, и я ожидаю увидеть его в следующих версиях библиотек JSF (на самом деле, OmniFaces - хорошая ставка, так как BalusC и Arjan Tijms сосредоточены на исправлении вещей, которые были оставлены в спецификации;-)).

Технически говоря, решение может выглядеть следующим образом: jfwid параметр уже добавлен, когда h:linkили же h:button используется. Таким образом, PhaseListener может использоваться для завершения текущего потока, если запрашивается представление вне определения потоков. Тем не менее, это просто основная идея, и могут быть камни преткновения, которые я еще не учел.

Итак, чтобы дать ответ на ваш вопрос: в настоящее время единственный правильный способ выхода из потока - это либо перейти к выходному узлу, либо использовать h:commandLinkили же h:commandButton для навигации по страницам, поскольку это также завершит поток, когда запрашивается представление вне определения потоков.

Другие вопросы по тегам