osworkflow 入门基础2

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


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

/*
 * 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>




运行结果:
引用
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
                           


猜你喜欢

转载自a153870727.iteye.com/blog/2306819