当另一个未完成时,创建一个新的流量豆



我在jsf(前面(和j2ee上工作。

我的应用程序中有两个不同的流程:

流程配置:

public class RequestFlow implements Serializable {
    @Produces
    @FlowDefinition
    public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
        String flowId = "requestFlow";
        flowBuilder.id("", flowId);
        flowBuilder.viewNode(flowId, "/inside/customer/request/flow/requestFlow.xhtml").markAsStartNode();
        flowBuilder.viewNode("requestFlowCart", "/inside/customer/request/flow/requestFlowCart.xhtml");
        flowBuilder.viewNode("requestFlowCheckout", "/inside/customer/request/flow/requestFlowCheckout.xhtml");
        flowBuilder.returnNode("finishRequest").fromOutcome("/inside/customer/request/requests.xhtml");
        return flowBuilder.getFlow();
    }
}

CDI的Flow Bean:

    @Named
    @FlowScoped("requestFlow")
    public class RequestFlowBean implements Serializable {
       //some logic
    }

第二个配置:

public class OrderFlow implements Serializable {
    @Produces
    @FlowDefinition
    public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
        String flowId = "orderFlow";
        flowBuilder.id("", flowId);
        flowBuilder.viewNode(flowId, "/inside/customer/order/flow/orderFlow.xhtml").markAsStartNode();
        flowBuilder.viewNode("orderFlowSelectRequests", "/inside/customer/order/flow/orderFlowSelectRequests.xhtml");
        flowBuilder.viewNode("orderFlowReviewRequests", "/inside/customer/order/flow/orderFlowReviewRequests.xhtml");
        flowBuilder.viewNode("orderFlowCheckoutOrder", "/inside/customer/order/flow/orderFlowCheckoutOrder.xhtml");
        flowBuilder.returnNode("finishOrder").fromOutcome("/inside/customer/order/orders.xhtml");
        return flowBuilder.getFlow();
    }
}

CDI的Flow Bean:

    @Named
    @FlowScoped("orderFlow")
    public class OrderFlowBean implements Serializable {
        //some logic
    }

我的案件:

  1. 用户打开页面,单击H:按钮启动"请求流"。(没有完成!(

  2. 他们使用菜单导航到另一页,并尝试启动"订单流"。通过单击H:按钮。

问题:&quot" orderflow"没有启动,控制台中没有错误。另外,第一个流仍在内存中,但根据文档必须被破坏。

当第一个未完成时,如何创建一个新的流量豆?

所以,正好在两个月的时间内找到答案。诀窍是您如何开始流程。如果您想运行新的JSF流,而没有完成其他JSF流,则必须从JSF上下文中删除任何流程的实例。为了做到这一点,您有控制器中的添加方法:

public String initFlow() {
    FacesContext context = FacesContext.getCurrentInstance();
    FlowHandler handler = context.getApplication().getFlowHandler();
    ExternalContext extContext = context.getExternalContext();
    String sessionKey = extContext.getClientWindow().getId() + "_flowStack";
    Map<String, Object> sessionMap = extContext.getSessionMap();
    if (sessionMap.containsKey(sessionKey)) {
        sessionMap.remove(sessionKey);
    }
    handler.transition(context, null, handler.getFlow(context, "", getFlowName()), null, "");
    return getFlowName();
}

和启动流页面的下一步:

<p:commandButton value="Start Flow"
    action="#{controller.initFlow}"/>
</p:panelGrid>

相关内容