[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]

osworkflow 入门基础2的更多相关文章

  1. osworkflow 入门基础

    OSWorkFlow入门指南目的 这篇指导资料的目的是介绍OSWorkflow的所有概念,指导你如何使用它,并且保证你逐步理解OSWorkflow的关键内容. 本指导资料假定你已经部署OSWorkfl ...

  2. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  3. 01shell入门基础

    01shell入门基础 为什么学习和使用shell编程 shell是一种脚本语言,脚本语言是相对于编译语言而言的.脚本语言不需要编译,由解释器读取程序并且执行其中的语句,而编译语言需要编译成可执行代码 ...

  4. Markdown入门基础

    // Markdown入门基础 最近准备开始强迫自己写博文,以治疗严重的拖延症,再不治疗就“病入骨髓,司命之所属,无奈何”了啊.正所谓“工欲善其事,必先利其器”,于是乎在写博文前,博主特地研究了下博文 ...

  5. JavaScript入门基础

    JavaScript基本语法 1.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=).算术运 ...

  6. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  7. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

  8. Linux shell入门基础(六)

    六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...

  9. Linux shell入门基础(一)

    Linux shell入门基础(一): 01.增加删除用户: #useradd byf   userdel byf(主目录未删除)  userdel -r byf   该用户的属性:usermod 用 ...

随机推荐

  1. MySQL随机字符串函数批量插入数据

      简单举个例子: drop table if exists demo1 create table demo1 ( id int primary key auto_increment, name ) ...

  2. LoadRunner参数化详解

    LoadRunner参数化详解 距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又 ...

  3. kubernetes排错系列:(二)、运行很久的kubernetes集群,创建出来的pod都是pending状态

    1.查看pod信息 # 查看pod 报错信息kubectl get pods发现pod的ip没有 生成,也没有分配到某个node节点 # 查看pod详细时间kubectl describe pods发 ...

  4. padding的计算方法

    转自https://blog.csdn.net/qq_34599526/article/details/83755275 VALID:如果卷积核超出特征层,就不再就计算,即卷积核右边界不超出Featu ...

  5. configmap使用-完整的configmap文档

    转发 https://www.jianshu.com/p/cf3e2218f283 转发 https://www.kubernetes.org.cn/3138.html 注意:configmap不用也 ...

  6. PTA --- 天梯赛 L1-028 判断素数

    L1-028 判断素数 (10 point(s))   本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2​31​ ...

  7. Django-MVC框架和MTV框架

    MVC框架 全称Model View Controller,分为三个基本部分:模型Model.视图View和控制器Controller,具有耦合性低.重用性高.生命周期低等优点. 结构 View层,操 ...

  8. 【AMAD】transitions -- 一个python实现的轻量级,面向对象的有限状态机

    简介 个人评分 简介 Transitions1是使用python实现的有限状态机2. 而有限状态机是实现经典模式 -- 状态模式3的前提. 这个库的API相当优雅,简洁. 另外博客园有人发布博客4介绍 ...

  9. ORACLE 正则匹配

    1.正则匹配 select CONCAT(TO_NUMBER(REGEXP_REPLACE('019年','[^0-9]')),'年') from dual;

  10. 【VS开发】C++线程安全

    我们是多么渴望各种C++类都是多线程安全的,然而一旦涉及到对象间的交互,这样的渴望可能就只能是奢望了.下面,我们以设计一个双向链结点为例,看看要使其多线程安全将会带来一些什么问题. class Dou ...