zoukankan      html  css  js  c++  java
  • osworkflow 入门基础2

    [quote]前篇我引入了互联网上找来的一篇文章,接着上篇讲:osworkflow 工作流是非常轻量级的,虽然2006就停止活动了,互联网上的资料也不是很多,官网也没过多的说明,比起jbpm 和activiti来说资料是相当少,但是不妨碍我们学习这个轻量级的工作流引擎。闲话少说[/quote]

    [quote]demo1 入门
    需要导入依赖:
    lib/commons-logging.jar
    oscore-2.2.5.jar
    osworkflow-2.8.0.jar
    propertyset-1.4.jar
    [/quote]

    /*
    * Copyright 1999-29 Nov 2015 Alibaba.com All right reserved. This software is the
    * confidential and proprietary information of Alibaba.com ("Confidential
    * Information"). You shall not disclose such Confidential Information and shall
    * use it only in accordance with the terms of the license agreement you entered
    * into with Alibaba.com.
    */
    package com.osworkflow;

    import com.opensymphony.workflow.*;
    import com.opensymphony.workflow.basic.BasicWorkflow;
    import com.opensymphony.workflow.loader.WorkflowDescriptor;

    import java.util.HashMap;
    import java.util.List;

    /**
    * @author liuy 29 Nov 2015 4:17:44 pm
    */
    public class OsWorkflow {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws InvalidActionException, InvalidRoleException, InvalidInputException, InvalidEntryStateException, WorkflowException {
    String caller = "testUser";
    String params1 = "params1";
    String docTitle = "docTitle";
    long workflowId = 1;
    HashMap inputs = new HashMap();

    Workflow workflow = new BasicWorkflow(caller);
    inputs.put("params1", params1);
    inputs.put("docTitle", docTitle);
    workflowId = workflow.initialize("mytest", 100, inputs);

    //执行第1步动作
    workflow.doAction(workflowId, 1, inputs);
    WorkflowDescriptor wd = workflow.getWorkflowDescriptor(workflow.getWorkflowName(1));
    System.out.println(wd);
    List list= workflow.getCurrentSteps(1);
    System.out.println(list);
    System.out.println("finished");
    }
    }


    要执行的业务函数:这里我用simulate 模拟打开一个浏览器的操作

    /*
    * Copyright 1999-29 Nov 2015 Alibaba.com All right reserved. This software is the
    * confidential and proprietary information of Alibaba.com ("Confidential
    * Information"). You shall not disclose such Confidential Information and shall
    * use it only in accordance with the terms of the license agreement you entered
    * into with Alibaba.com.
    */
    package com.osworkflow;

    import com.nnk.selenium.win.PayEditInputTyper;
    import com.opensymphony.module.propertyset.PropertySet;
    import com.opensymphony.workflow.FunctionProvider;
    import com.opensymphony.workflow.WorkflowException;
    import org.apache.commons.logging.impl.Log4JCategoryLog;
    import org.apache.log4j.Logger;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedCondition;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.Assert;

    import java.util.List;
    import java.util.Map;


    /**
    * 类TestFunction.java的实现描述:TODO 类实现描述
    * @author liuy 29 Nov 2015 5:19:17 pm
    */
    public class TestFunction implements FunctionProvider {
    private Logger logger = Logger.getLogger(TestFunction.class);
    @Override
    public void execute(Map arg0, Map arg1, PropertySet arg2) throws WorkflowException {
    // 改状态
    System.out.println("change status...");
    System.out.println(arg0);
    System.out.println(arg1);
    System.out.println(arg2);
    System.out.println(arg1.get("context"));
    System.setProperty("webdriver.firefox.bin", "E:/Program Files (x86)/Mozilla Firefox/firefox.exe");
    Log4JCategoryLog log = (Log4JCategoryLog) arg0.get("log");
    log.info("hello");
    //声明一个火狐浏览器driver对象
    WebDriver driver= new FirefoxDriver();
    //设置窗口最大化
    driver.manage().window().maximize();

    //打开360搜索
    driver.get("http://www.007ka.cn/007kaWeb/");
    //找到搜索框元素
    WebElement searchInput= driver.findElement(By.id("mobno"));
    //向搜索框输入“selenium”
    searchInput.sendKeys("13267191379");

    WebElement searchInput2= driver.findElement(By.name("czval"));
    // Select value = new Select(searchInput2);
    // value.selectByVisibleText("200元");
    //向搜索框输入“selenium”
    searchInput2.sendKeys("400");
    //找到搜索按钮
    WebElement searchButton= driver.findElement(By.id("commit"));
    //点击搜索按钮
    searchButton.click();
    waitForElementToLoad(driver,2000,By.name("mob"));
    driver.findElement(By.name("mob")).sendKeys("13267191379");

    WebElement submit = driver.findElement(By.name("Submit"));

    submit.click();
    driver.findElement(By.className("button")).click();
    List<WebElement> interface1 = driver.findElements(By.name("card_type"));
    for(WebElement e:interface1){
    String value = e.getAttribute("value");
    if(value.equals("5")){
    e.click(); break;
    }
    }
    driver.findElement(By.className("button")).click();
    boolean ret = waitForElementToLoad(driver,2000,By.xpath(".//*[@id='divWP']/div[2]/div[2]/div/div/span[2]"));
    // Assert.assertEquals(ret, true);
    driver.findElement(By.xpath(".//*[@id='divWP']/div[2]/div[2]/div/div/span[2]")).click();

    try {
    PayEditInputTyper.setPassword("MozillaWindowClass", "招商银行网上支付[SZG] - Mozilla Firefox", "42342234253434323433");
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    try{
    //这里我们暂时用sleep方式等待页面条状,后续会讲到如何智能等待
    Thread.sleep(2000);
    } catch(InterruptedException e) {
    e.printStackTrace();
    }
    //跳转之后的页面关键字输入框元素
    // WebElement keywordInput= driver.findElement(By.id("keyword"));
    //验证输入框的内容是不是selenium
    // Assert.assertEquals(keywordInput.getAttribute("value"), "selenium");
    //关闭浏览器
    // driver.quit();
    }
    public static boolean waitForElementToLoad(WebDriver driver,int timeOut,final By by){
    try {
    new WebDriverWait(driver, timeOut).until(new ExpectedCondition<Boolean>() {

    @Override
    public Boolean apply(WebDriver driver) {
    // TODO Auto-generated method stub
    WebElement element = driver.findElement(by);
    System.out.println("find zhe element");
    return element.isDisplayed();
    }
    });
    } catch (Exception e) {
    // TODO: handle exception
    Assert.fail("超时!! " + timeOut + " 秒之后还没找到元素 [" + by + "]", e);
    }
    return false;
    }
    }


    查看下osworkflow 的工作流配置:
    workflows:

    <workflows>
    <workflow name="mytest" type="resource" location="myworkflow.xml" />
    </workflows>

    osworkflow.xml:
    <osworkflow>
    <persistence
    class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore" />
    <factory
    class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
    <property key="resource" value="workflows.xml" />
    </factory>
    </osworkflow>


    myworkflow.xml


    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE workflow PUBLIC
    "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"
    "http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
    <workflow>
    <registers>
    <register type="class" variable-name="log">
    <arg name="class.name">com.opensymphony.workflow.util.LogRegister</arg>
    <arg name="addInstanceId">true</arg>
    <arg name="Category">workflow</arg>
    </register>
    </registers>
    <initial-actions>
    <action id="100" name="Start Workflow">
    <results>
    <unconditional-result old-status="Finished"
    status="Queued" step="1" />
    </results>
    </action>
    </initial-actions>
    <steps>
    <step id="1" name="First Draft">
    <actions>
    <action id="1" name="Start First Draft">
    <restrict-to>
    <conditions>
    <condition type="class">
    <arg name="class.name">
    com.opensymphony.workflow.util.StatusCondition
    </arg>
    <arg name="status">Queued</arg>
    </condition>
    </conditions>
    </restrict-to>
    <pre-functions>
    <function type="class">
    <arg name="class.name">
    com.osworkflow.TestFunction
    </arg>
    <arg name="context">
    aaaaaa
    </arg>
    </function>
    </pre-functions>
    <results>
    <unconditional-result old-status="Finished"
    status="queue" step="2" owner="${caller}" />
    </results>
    </action>
    <action id="2" name="Finish First Draft">
    <restrict-to>
    <conditions type="AND">
    <condition type="class">
    <arg name="class.name">
    com.opensymphony.workflow.util.StatusCondition
    </arg>
    <arg name="status">Underway</arg>
    </condition>
    <condition type="class">
    <arg name="class.name">
    com.opensymphony.workflow.util.AllowOwnerOnlyCondition
    </arg>
    </condition>
    </conditions>
    </restrict-to>
    <results>
    <unconditional-result old-status="Finished"
    status="Queued" step="2" />
    </results>
    </action>
    </actions>
    </step>
    <step id="2" name="finished" />
    </steps>
    </workflow>




    运行结果:[quote]change status...
    {params1=params1, store=com.opensymphony.workflow.spi.memory.MemoryWorkflowStore@7c9139fc, descriptor=com.opensymphony.workflow.loader.WorkflowDescriptor@22760f48, entry=com.opensymphony.workflow.spi.SimpleWorkflowEntry@74e551a4, docTitle=docTitle, context=com.opensymphony.workflow.basic.BasicWorkflowContext@7b5321f0, actionId=1, configuration=com.opensymphony.workflow.config.DefaultConfiguration@ed952d1, log=org.apache.commons.logging.impl.Log4JCategoryLog@5dcc1ef4, currentSteps=[SimpleStep@1[owner=, actionId=0, status=Queued]]}
    {class.name=
    com.osworkflow.TestFunction
    , context=
    aaaaaa
    }
    com.opensymphony.module.propertyset.memory.MemoryPropertySet {
    }


    aaaaaa
    [/quote]
  • 相关阅读:
    优秀程序员的45个习惯
    linq 解决winForm中控件CheckedListBox操作的问题。
    培养人脉的100个技巧
    如果可以,我想谁也不喜欢跳槽
    真我的风采
    c# 正则表代式的分组和匹配模式
    Hishop 网店系统,去版权,注册机,商业版授权
    IIS7 下 AjaxPro 失效, AjaxPro不能用,的解决办法
    Windows Server 2008 上 sql server 2008 无法连接问题
    环保,IT也需要环保,世界需要环保.
  • 原文地址:https://www.cnblogs.com/lameclimber/p/10842008.html
Copyright © 2011-2022 走看看