- 浏览: 323753 次
- 性别:
- 来自: 重庆
-
文章分类
- 全部博客 (286)
- 设计模式 (14)
- spring (5)
- 开发工具 (12)
- java (19)
- apache.commons工具 (7)
- ibaits (5)
- extjs4.0 (4)
- 数据库 (2)
- spring工具类 (2)
- jquery1.8 (32)
- 杂记 (1)
- linux (2)
- Quart (1)
- springMVC (2)
- webservice (1)
- oracle (5)
- dwr (6)
- jbmp3 (27)
- lucene3.5 (27)
- javascript (18)
- hibernate3.3.2 (27)
- spring事务管理 (10)
- nio (2)
- strust2 (3)
- jvm (7)
- jquery-easyui-1.2.6 (22)
- 多线程 (14)
- maven (3)
- 常用正则表达式 (4)
最新评论
-
HF_SKY000:
请问:
一、能否提供一下密钥库文件的生成方法?
二、密钥库的密 ...
Java sslSocket 聊天实例
public class JbpmFacadeImpl extends AbstractManager implements JbpmFacade {
private JbpmConfiguration jbpmConfiguration;
public long addProcessInstance(String processName, Document document) {
JbpmContext context = getJbpmContext();
ProcessDefinition def = context.getGraphSession().findLatestProcessDefinition(processName);
ProcessInstance instance = new ProcessInstance(def);
instance.getContextInstance().setVariable("document", document.getId());
//将公文标题也提交到流程实例变量中,以便在E-Mail中能够提示这个公文的名称
instance.getContextInstance().setVariable("docTitle", document.getTitle());
//将公文的相关属性设置进入流程实例变量
Map props = document.getProperties();
if(props != null){
Set entries = props.entrySet();
for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
String propertyName = (String)entry.getKey();
Object obj = document.getProperty(propertyName);
//将变量放入流程实例变量
instance.getContextInstance().setVariable(propertyName, obj);
}
}
context.save(instance);
return instance.getId();
}
public void delProcessDefinition(String processName) {
JbpmContext context = getJbpmContext();
List defs = context.getGraphSession().findAllProcessDefinitionVersions(processName);
for (Iterator iterator = defs.iterator(); iterator.hasNext();) {
ProcessDefinition def = (ProcessDefinition) iterator.next();
context.getGraphSession().deleteProcessDefinition(def);
}
}
public void delProcessInstance(long processInstanceId) {
JbpmContext context = getJbpmContext();
context.getGraphSession().deleteProcessInstance(processInstanceId);
}
public String deployProcessDefinition(byte[] processDef) {
JbpmContext context = getJbpmContext();
ProcessDefinition def = ProcessDefinition.parseXmlInputStream(
new ByteArrayInputStream(processDef)
);
context.deployProcessDefinition(def);
return def.getName();
}
public String nextStep(long processInstanceId, String actorId,
String transitionName) {
JbpmContext context = getJbpmContext();
ProcessInstance instance = context.getProcessInstance(processInstanceId);
//当前节点
String currentNodeName = instance.getRootToken().getNode().getName();
//起点的名称
String startNodeName = instance.getProcessDefinition().getStartState().getName();
//如果是在起点
if(startNodeName.equals(currentNodeName)){
if(transitionName == null){
instance.signal();
}else{
instance.signal(transitionName);
}
}else{
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator
.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if(ti.getProcessInstance().getId() == processInstanceId){
if(transitionName == null){
ti.end();
}else{
ti.end(transitionName);
}
break;
}
}
//查找所属组的任务实例
List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
for (Iterator iterator = pooledTaskInstances.iterator(); iterator
.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if(ti.getProcessInstance().getId() == processInstanceId){
if(transitionName == null){
ti.end();
}else{
ti.end(transitionName);
}
break;
}
}
}
//返回转向之后的节点名称
return instance.getRootToken().getNode().getName();
}
//回退
public Object[] backStep(long processInstanceId, String actorId) {
JbpmContext context = getJbpmContext();
//根据流程实例标识查找流程实例
ProcessInstance instance = context.getProcessInstance(processInstanceId);
Object[] os = new Object[2];
//搜索用户对应的所有的任务实例
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator
.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if(ti.getProcessInstance().getId() == processInstanceId){
//先判断是否是要回退到起点
Set set = ti.getToken().getNode().getArrivingTransitions();
for (Iterator iterator2 = set.iterator(); iterator2.hasNext();) {
Transition t = (Transition) iterator2.next();
//如果它需要回退到起点
if(t.getFrom().equals(ti.getProcessInstance().getProcessDefinition().getStartState())){
int docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document");
//结束当前的流程实例
ti.getProcessInstance().end();
//结束当前任务实例
ti.end();
//重新创建流程实例对象
ProcessInstance pi = new ProcessInstance(ti.getProcessInstance().getProcessDefinition());
pi.getContextInstance().setVariable("document", docId);
//将流程实例对象重新持久化到数据库
context.save(pi);
os[0] = Document.STATUS_NEW;
os[1] = pi.getId();
return os;
}
}
//如果不需要回退到起点
ti.end(CreateTransitionAction.BACK_TRANSITION);
break;
}
}
os[0] = instance.getRootToken().getNode().getName();
os[1] = processInstanceId;
return os;
}
public List searchMyTaskList(String actorId) {
JbpmContext context = getJbpmContext();
List docIds = new ArrayList();
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document");
docIds.add(docId);
}
//查找所属组的任务实例
List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
for (Iterator iterator = pooledTaskInstances.iterator(); iterator
.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document");
docIds.add(docId);
}
return docIds;
}
public List searchNextTransitions(long processInstanceId, String actorId) {
JbpmContext context = getJbpmContext();
ProcessInstance instance = context.getProcessInstance(processInstanceId);
//当前节点
String currentNodeName = instance.getRootToken().getNode().getName();
//起点的名称
String startNodeName = instance.getProcessDefinition().getStartState().getName();
Collection transitions = null;
//如果是在起点
if(startNodeName.equals(currentNodeName)){
transitions = instance.getRootToken().getAvailableTransitions();
}else{
List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
for (Iterator iterator = taskInstances.iterator(); iterator
.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if(ti.getProcessInstance().getId() == processInstanceId){
transitions = ti.getAvailableTransitions();
break;
}
}
//查找所属组的任务实例
List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
for (Iterator iterator = pooledTaskInstances.iterator(); iterator
.hasNext();) {
TaskInstance ti = (TaskInstance) iterator.next();
if(ti.getProcessInstance().getId() == processInstanceId){
transitions = ti.getAvailableTransitions();
}
}
}
List transitionNames = new ArrayList();
if(transitions != null){
//为了不把Transition对象直接暴露给OA系统,需要将其转换为名称列表
for (Iterator iterator = transitions.iterator(); iterator.hasNext();) {
Transition transition = (Transition) iterator.next();
transitionNames.add(transition.getName());
}
}
return transitionNames;
}
private JbpmContext getJbpmContext(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSession(getSession());
return context;
}
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
this.jbpmConfiguration = jbpmConfiguration;
}
}
发表评论
-
二十七、jbpm回退
2012-11-16 10:56 2094要实现JBPM的任务回退很 ... -
二十五、将JBPM集成到基于SSH的OA系统中
2012-11-15 22:43 961具体步骤如下: -
二十四、如何给角色分配任务,而且拥有此角色的用户必需要通过n个人的审批之后才能继续往下?
2012-11-15 21:33 812解决方案: 1、 在一个node-enter ... -
二十三、如何给角色分配任务,而且拥有此角色的用户只要有一个用户审批通过就可以继续往下
2012-11-13 14:41 801解决方案: 首先,是基于前一个解决方案,我们自己来给 ... -
二十二、如何给角色分配任务,而且拥有此角色的用户均需审批通过之后才能继续往下?
2012-11-13 14:18 870解决方法: * 在一个n ... -
二十一、如何在Jbpm的各种Handler中访问spring的bean
2012-11-13 11:42 1106import org.springframe ... -
二十、如何给角色分配任务
2012-11-13 11:12 1187实现AssignmentHandler接口,在接口的实现方法中 ... -
十九、会签(通过PooledActors或者在一个TaskNode中定义多个Task)来实现
2012-11-09 17:15 1049如何实现多人会签,而且只要其中一个人审批通过就继续往下? ... -
十八、自定义VariableResolver
2012-11-09 16:50 1075<decision name="decisio ... -
十七、Decision节点和DecisionHandler的使用
2012-11-09 16:15 1079<?xml version="1.0& ... -
十六、流程相关的用例图、流程图
2012-11-08 17:29 1037部署流程: ... -
十五、从中间的TaskNode节点出发如何得到下一步可选路径列表
2012-11-06 16:12 856在上一节中说到: Set&l ... -
十四、从起点(StartState)出发,如何得知下一步可选的路径列表
2012-11-06 11:59 1073<process-definition name=&q ... -
十三、Fork和Join节点的基本用法
2012-11-06 10:48 1118<?xml version="1.0&qu ... -
十二、查询公文流转到哪个节点
2012-11-06 10:43 1017//得到流程流转到的当前节点 @Test ... -
十一、流程流转
2012-11-06 10:43 1001提交公文到下一个节点(本节点不是开始节点) pr ... -
十、查询某个用户的公文列表
2012-11-05 10:27 885private void printTask(JbpmCont ... -
九、提交公文
2012-11-05 10:29 814//将公文提交到第一个环节 @Test ... -
八、创建公文
2012-11-05 10:29 8401、创建公文对象 public ... -
七、部署流程
2012-11-05 10:28 912测试代码如下: //部署流程定义:根据流程 ...
相关推荐
内容概要:本文详细介绍了医药洁净室空调箱的多模式控制程序,涵盖停止模式、生产模式、值班模式、消毒循环模式和消毒排风模式。文中强调了不同模式下的具体控制逻辑及其重要性,并深入探讨了西门子1500 PLC与昆仑通泰触摸屏在博途15编程环境中如何协同工作,实现精准控制。此外,还展示了部分PLC程序代码片段,帮助读者更好地理解和实施这些控制逻辑。 适用人群:从事医药洁净室设计、安装、维护的技术人员,以及对工业自动化控制系统感兴趣的工程师。 使用场景及目标:适用于医药洁净室项目的规划与实施阶段,旨在帮助技术人员掌握空调箱多模式控制的设计思路和技术细节,从而提升系统的可靠性和稳定性。 其他说明:文中提供的示例代码和控制逻辑对于实际工程项目具有较高的参考价值,有助于缩短开发周期,降低调试难度。同时,结合博途15和昆仑通泰触摸屏的实际应用案例,使理论与实践相结合,便于理解和操作。
内容概要:本文档主要介绍了HC-SR04超声波测距模块的工作原理及其在STM32F407ZET6平台上的应用。HC-SR04超声波测距模块能提供2cm-400cm范围内的非接触式距离感测,精度达3mm。其工作原理是通过TRIG引脚接收触发信号后,自动发送8个40kHz的方波并检测返回信号。若有返回信号,ECHO引脚将输出一个高电平,高电平持续的时间即为超声波往返的时间。根据这个时间可以计算出测试距离。文中还提供了基于STM32F407ZET6平台的C语言代码示例,详细说明了如何配置TRIG和ECHO引脚,以及如何通过测量ECHO引脚高电平持续时间来获取距离值。; 适合人群:对超声波测距模块有一定兴趣,具有嵌入式系统基础知识的研发人员或学生。; 使用场景及目标:①了解HC-SR04超声波测距模块的基本工作原理;②掌握如何在STM32平台上配置和使用HC-SR04模块进行测距。; 其他说明:此文档提供的代码和原理有助于开发者快速上手HC-SR04超声波测距模块的应用开发,建议读者结合实际硬件进行实验以加深理解。
内容概要:本文介绍了基于滚动优化的大规模电动汽车充放电策略优化的MATLAB代码实现。文中提出了针对大规模电动汽车调度问题的一种快速优化方法——滚动优化法,并将其与均衡负载法和全局优化法进行了对比。该方法通过将全局问题分解为多个局部子问题,降低了求解复杂度,提高了计算效率。模型考虑了电动汽车的随机到达分布及其充放电策略,目标是最小化电力系统的负荷波动并最大化电动汽车的充放电效益。实验结果显示,滚动优化法在保持电力系统稳定性的前提下显著提升了电动汽车的充放电效益。 适合人群:从事智能交通系统研究、电力系统优化、电动汽车调度等相关领域的研究人员和技术人员。 使用场景及目标:适用于需要优化大规模电动汽车充放电策略的研究项目或实际应用,旨在提升电力系统的稳定性和电动汽车的经济效益。 其他说明:代码基于MATLAB+CVX平台实现,附带详细注释,便于学习和复现。
内容概要:本文介绍了基于PLC(可编程逻辑控制器)的自助洗车机控制系统的设计与实现。系统采用博途软件编写,实现了从启动到结束的完整洗车流程,包括喷水、刷洗、喷洒清洁剂、吹干等步骤。文中详细描述了洗车机的动作流程、原点复位设计、系统架构、代码与控制逻辑分析,并提供了人机界面、接线图和IO分配表等辅助资料。此外,还强调了系统的稳定性和优质售后服务。 适合人群:从事自动化控制领域的工程师和技术人员,特别是对PLC编程和洗车机控制系统感兴趣的读者。 使用场景及目标:适用于需要了解或开发自助洗车机控制系统的场合,旨在帮助读者掌握PLC编程技巧和洗车机的工作原理,提高系统的稳定性和可靠性。 其他说明:本文不仅提供了详细的硬件和软件设计方案,还涵盖了故障处理和售后服务的内容,确保系统的长期稳定运行。
内容概要:本文档详细介绍了STM32F407ZET6的GPIO(通用输入输出接口)。GPIO在输出模式下能控制端口输出高低电平,适用于驱动LED、控制蜂鸣器等;在输入模式下可读取端口的高低电平或电压,如读取按键输入、ADC电压采集等。每个通用I/O端口包含多个32位配置寄存器、数据寄存器等。文档列举了GPIO的八个功能模式,重点解析了输出状态中的推挽输出和开漏输出,以及输入状态中的下拉电阻和上拉电阻的概念与工作原理。推挽输出可输出高低电平,由两个互补的晶体管提供较大电流驱动;开漏输出通常只能输出低电平,适合电平转换。输入状态方面,下拉电阻将信号初始化为低电平,上拉电阻则初始化为高电平,其本质分别是输出和注入电流。; 适合人群:嵌入式系统开发人员、电子工程师、对STM32微控制器有兴趣的学习者。; 使用场景及目标:①帮助开发者理解STM32F407ZET6的GPIO工作机制;②为实际项目中GPIO的应用提供理论指导,如控制外部设备、读取传感器数据等。; 其他说明:文档提供了详尽的寄存器配置信息和功能模式介绍,有助于深入理解和灵活运用GPIO接口。建议读者结合实际硬件操作进行学习,以加深理解。
内容概要:本文详细介绍了两电平三相并网逆变器的有限控制集模型预测控制(FCS-MPC)的代码实现方法。首先设置了系统的参数,如滤波电感、等效电阻、控制周期等。接着阐述了离散化状态方程和代价函数的设计,其中代价函数考虑了电流跟踪误差和开关损耗。然后展示了主控制循环的具体实现,通过遍历所有可能的开关状态选择最优的动作。最后对仿真效果进行了分析,指出了常见的问题及解决方案,如采样同步、权重系数调整和离散化精度等问题。 适合人群:电力电子领域的初学者和技术爱好者,尤其是对逆变器控制策略感兴趣的读者。 使用场景及目标:适用于需要理解和实现两电平三相并网逆变器FCS-MPC控制的人群。目标是掌握FCS-MPC的工作原理,能够独立完成相关代码编写,并能进行基本的参数调整和优化。 其他说明:文中提供了详细的代码片段和仿真波形图,帮助读者更好地理解理论与实践的结合。同时附有参考文献,方便进一步深入学习。
内容概要:本文详细介绍了利用CST微波工作室进行超表面仿真,将线极化波转化为圆极化波的技术实现过程。首先,构建了一个简单的十字形金属贴片作为超表面单元模型,设置了金属层和基板的具体参数。接着,通过调整X和Y方向的相位差达到90度来实现极化转换,并使用VBA脚本进行参数优化。最终,在12.5GHz频率处实现了低于3dB的轴比,验证了圆极化的成功转换。此外,还讨论了网格划分对仿真的影响,指出六边形网格相比矩形网格能更快收敛。 适合人群:从事电磁仿真、天线设计以及超表面研究的专业技术人员。 使用场景及目标:适用于需要深入了解线极化转圆极化技术原理及其实际应用的研究人员和技术开发者。目标是掌握CST仿真工具的操作技巧,理解极化转换的关键技术和优化方法。 其他说明:文中提供了详细的建模步骤、参数设置和代码片段,有助于读者快速上手并复现实验结果。同时提醒注意网格划分的选择,以提高仿真效率。
电子设计竞赛相关资源
内容概要:本文详细介绍了新版Modbus RTU从机源码针对STC32G和STC8系列单片机的优化改进。主要改进包括硬件CRC加速、动态内存分配机制、自动波特率检测等功能特性。文中对比了新旧版本的性能差异,特别是在CRC校验效率提升、内存管理和通信稳定性方面的显著进步。此外,还提供了与多种组态软件的适配方法,如威纶通触摸屏的地址映射技巧,以及ModbusPoll工具的预配置模板,帮助开发者快速搭建和调试系统。 适合人群:嵌入式系统开发工程师,尤其是熟悉STC系列单片机和Modbus协议的开发者。 使用场景及目标:适用于工业自动化控制系统中需要高效稳定通信的应用场景,旨在提高系统的实时性和可靠性,降低开发难度并缩短产品上市周期。 其他说明:文中提到的部分技术细节(如硬件CRC、动态内存分配)可能不适合所有应用场景,在具体项目中可根据实际情况选择是否采用。对于初次接触Modbus协议的新手来说,建议先掌握基础知识再深入研究本文提供的高级特性。
实训商业源码-工作场所技能必不可少的应用程序主页模板-毕业设计.zip
内容概要:本文详细介绍了110kV变电站电气一次设计的关键步骤和技术要点。首先,通过对原始参数的解读,明确了变电站的基本要求。接着,重点讨论了主接线方案的选择,通过案例分析展示了双母线接线方式的优势。随后,深入探讨了短路电流计算的重要性及其对电网安全的影响。最后,针对电气一次设备的选型进行了全面分析,强调了质量和效率的平衡。整个设计过程最终通过AutoCAD2014绘制出了详细的主接线A0大图。 适合人群:从事电力系统设计、运行和维护的专业技术人员,尤其是对110kV变电站电气一次设计感兴趣的工程师。 使用场景及目标:适用于新建设或改造110kV变电站项目,帮助设计师优化主接线方案,提高电网的安全性和可靠性,同时降低运营成本。 其他说明:文中提供了具体的CAD绘图命令片段作为参考,有助于读者更好地理解和应用相关设计方法。
实训商业源码-抽奖页面小程序模板-毕业设计.zip
内容概要:本文详细介绍了基于39节点故障数据的短路分析与负荷仿真实验。文中首先概述了故障数据的特点,指出故障主要集中在特定区域的多个节点上,短路持续时间和负荷水平存在显著差异。接着,文章描述了仿真的具体过程和方法,强调了采用先进技术进行多场景下电网运行的模拟。仿真结果显示,短路点分布广泛,短路持续时间从数小时到数天不等,负荷水平变化范围大。此外,还讨论了数据处理技术和仿真模型构建的关键步骤,提出了故障应对中的安全保障措施。最后,作者总结了研究的重要性和对未来工作的建议,如加强电网监控、提升应急响应能力和推进智能化电网建设。 适合人群:从事电力系统研究、电网管理和维护的技术人员及研究人员。 使用场景及目标:适用于希望深入了解电网故障分析和负荷仿真技术的专业人士,旨在提高电网运行的可靠性和稳定性。 阅读建议:读者可以通过本文了解电网故障的具体表现形式及其对电网运行的影响,掌握先进的仿真技术和数据处理方法,从而为实际工作中遇到的问题提供解决方案。
MCP插件(addon.py):Blender插件,在Blender中创建一个套接字服务器来接收和执行命令
内容概要:本文介绍了利用Qt框架实现Prim和Kruskal两种最小生成树算法的动态可视化项目。该项目不仅展示了这两种算法的具体执行过程,还提供了详细的源代码和技术解析。Prim算法通过维护两个节点集合之间的最短边进行构建,而Kruskal算法则借助并查集防止形成环路。两者均实现了动态展示,使算法执行过程如同观看动画般直观。此外,文中还提到了一些实现细节,如优先队列的特殊使用方法、多线程环境下的数据同步以及图形化界面的设计。 适合人群:计算机科学专业学生、算法爱好者、软件开发者。 使用场景及目标:本项目的应用场景主要是在教学环境中用于讲解最小生成树算法的工作机制,帮助学习者更好地理解和掌握相关概念;同时也适用于希望深入研究这两类算法实现方式的研究人员。 其他说明:附带完整的源代码和一份详尽的技术报告,涵盖从理论分析到实际编码过程中遇到的问题及解决方案。
内容概要:本文详细介绍了基于滞环电流控制的VIENNA整流器的技术特点和工作原理。首先概述了VIENNA整流器作为一种高效AC-DC转换器的独特优势,如高功率因数、低谐波失真和高效率。接着阐述了滞环电流控制技术的基本原理,即通过实时检测和比较实际电流与给定电流的偏差,控制开关器件的通断,实现电流的精确控制。然后具体解释了基于滞环电流控制的VIENNA整流器的工作机制,强调其快速响应、高精度和低噪声的特点。最后总结了该整流器的多项优点,包括高效率、快速响应、高功率因数和较低的谐波失真,指出其在未来电力电子系统中的广泛应用前景。 适合人群:从事电力电子技术研究和开发的专业人士,以及对高效AC-DC转换器感兴趣的工程技术人员。 使用场景及目标:适用于需要深入了解VIENNA整流器及其控制技术的研究人员和技术人员,旨在提升对电力转换系统的理解和优化能力。 其他说明:本文不仅提供了理论分析,还讨论了实际应用中的优化策略,有助于推动相关技术的进步和发展。
实训商业源码-单个商品销售系统源码-毕业设计.zip
电子设计竞赛相关资源
samtec-signal-integrity-handbook
南京大学ppt模板红色风论文答辩PPT模板