桃园悬赏任务查询器处理的任务是()

定时任务查询数据库并处理 - ITeye问答
目前有一个需求是,定时任务把数据库中的数据查出来,然后处理,处理完了之后,更新数据库状态为处理成功或失败,采用的是,生产者和消费者,一个线程去查询数据库未处理的记录1000条,查询出来之后马上把数据库中这1000条记录更新为正在处理,然后放入队列中,消费线程从队列中取数据,然后更新数据库中的标志为成功或失败。
现在的问题是,我取了1000条,然后马上把这1000条数据更新为正在处理,效率很低,因为sql语句中update用的是in操作,但是又没想到其他好的办法,有知道的兄弟指点一下吗?
可以采用多线程来解决
创建一个线程池,每次取一定的数据进行update,只要控制队列中的数据避免资源冲突,应该是可以提高效率的。
另外你update的时候需要获取where条件的字段可以建立索引
你可以使用jdbc里批量更新。不要用 in语句。in 效率比较低。
我百度了一下,看到这个doc,可以参考一下. .cn/s/blog_662e56ec0100jtg5.html
“我取了1000条,然后马上把这1000条数据更新为正在处理”
怎么取的?是否走索引的?批量取?能够批量更新?
已解决问题
未解决问题博客分类:
首先是我们已经对Activiti流程的开启有了了解之后,在进行下文
流程中用到最多的就是用户任务了,包括谁办理,什么时候办理,办理结果是什么,办理历史等等
下文先介绍下用户任务的办理相关操作
用户任务分类:
分为4中状态:未签收/待办理、已签收/办理中、运行中/办理中、已完成/已办结
首先,我们要了解下 TaskService 这个服务的作用:
1、查询分配给用户或组的任务
2、创建独立运行任务。这些任务与流程实例无关。
3、手工设置任务的执行者,或者这些用户通过何种方式与任务关联。
4、认领并完成一个任务。认领意味着一个人期望成为任务的执行者, 即这个用户会完成这个任务。完成意味着“做这个任务要求的事情”。 通常来说会有很多种处理形式。
通过TaskService来获得任务
从类 org.activiti.engine.impl.ServiceImpl 继承的字段
所有已实现的接口:TaskService
TaskService taskService = processEngine.getTaskService();
//这边我定义了几个通用 变量
//String userId = "Ypp";
//String userGroup = new String["Ypp1","Ypp101"];
1、未签收/待办理
那么流程开启之后,如何能让下一个办理人取得待办任务呢?
通过下面几种的方法,将取得指定签收人/办理人的待办数据
//单人待签收/待办理
List&Task& tasks = taskService.createTaskQuery().taskCandidateUser(userId).list();
//用户组待签收/待办理
List&Task& tasks = taskService.createTaskQuery().taskCandidateGroup(userGroup).list();
//进行签收操作,也就是将要接收办理这个任务
//这边可以使用循环,也可以通过其他方法,常用的是先加载一个任务待办列表到页面上,签收任务传递后台一个taskId
//task.getId() = taskId
taskService.claim(task.getId(), userId);//完成签收这个时候就任务Task的Assignee属性就有了值
//已经签收过的任务列表,某种意义上我理解为真正的办理人
List&Task& tasks = taskService.createTaskQuery().taskAssignee(userId).list();
通过 1、未签收/待办理 中取得需要办理的任务Task之后
//调用 task.getId() = taskId 完成任务的办理,taskService服务自动流转到下一个办理节点
plete(task.getId());
//plete()方法 提供了重载,提供了3种方式供你选择
complete(String taskId)
complete(String taskId, Map&String,Object& variables)
complete(String taskId, Map&String,Object& variables, boolean localScope)
如果更深的了解如何流转的可以查看源码
---------------------------------------------------------------------------
任务并不一定要先签收再办理,可以直接到待办理中,而不是待签收中
taskService.claim(task.getId(), userId);方法
setAssignee(String taskId, String userId)
经过以上步骤,任务已经在 办理中状态了
3、已完成/已办结
任务的已完成(调用过complete方法)是指当前待办的任务状态,而非整个流程实例的完成状态
流程中数据使用到 historyService 服务
//查询指定用户发起的流程 (流程历史 用户发起 )
//finished
完成的流程
//unfinish
还在运行中的流程
List&HistoricActivityInstance& hais = 下面的3中方法
historyService.createHistoricProcessInstanceQuery().finished().startedBy(name).orderByProcessInstanceStartTime().desc().listPage(firstResult, maxResults);
//查询指定用户参与的流程信息 (流程历史
用户参与 )
List hpis = historyService.createHistoricProcessInstanceQuery().involvedUser(name).orderByProcessInstanceStartTime().desc().listPage(firstResult, maxResults);
//查询指定流程的任务流转路径 (流程历史 任务 流转 路经)
historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).orderByHistoricTaskInstanceEndTime().asc().list();
//查看流程是否完整的运行完毕方法也有好几种
for (HistoricActivityInstance hai : hais) {
//如果下面的方法返回不是空,那就是已办结
hai.getEndTime()
//查看ACT_RU_TASK表
Long long = taskService.createTaskQuery().processInstanceId("processInstanceId").taskId("taskId").count();
//如果long为空,那么也是办结了
taskService.createTaskQuery()查询条件是可选的
taskService.createTaskQuery().processInstanceId("processInstanceId")
taskService.createTaskQuery().taskId("taskId")
或者其他更多条件
//流程在流转中对于当前办理人/组和签收人/组来说,都是可以进行动态调整变化的
//需要对程序进行特殊处理,添加***或者其他方法
//得到用户组待签收
TaskService taskService = processEngine.getTaskService();
//单人待签收
//List&Task& tasks = taskService.createTaskQuery().taskCandidateUser(userId).list();
List&Task& tasks = taskService.createTaskQuery().taskCandidateGroup(userGroup).list();
for (Task task : tasks) {
taskService.claim(task.getId(), userId);
//得到用户待办
tasks = taskService.createTaskQuery().taskAssignee(userId).list();
for (Task task : tasks) {
plete(task.getId());
//顺便查看历史看看
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();
对于更复杂的业务还在整理中,也有不足的地方,望大家共同进步。
文章是在Notepad++中编写的,格式上有差异谅解
浏览: 74645 次
来自: 北京
新人路过,表示对我有帮助
根据数据库里的字段来动态添加grid列,你实现了么?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'BOS项目笔记 第天
今天内容安排:
1、流程实例管理(查询、查看运行状态)
2、将系统中的用户和角色同步到的用户和组表
3、设计物流配送流程
4、启动物流配送流程
5、组任务操作(查询、拾取)
6、个人任务操作(查询、办理)
1.&流程实例管理
1.1&查询流程实例列表
第一步:创建一个流程实例管理Action,提供方法,查询流程实例列表数据
第二步:配置struts.xml
第三步:提供processinstance.jsp页面,展示列表数据
&s:iterator&value="list"&
&& &td&${id }&/td&
&& &td&${processDefinitionId }&/td&
&& &td&${activityId }&/td&
&& &div&id="div${id }"&&/div&
&& &script&type="text/javascript"&
&& //根据流程实例id查询流程变量
&& $.post("${pageContext.request.contextPath}/processInstanceAction_findData.action",{"id":'${id}'},function(data){
&& $("#div${id}").html(data);
&& &/script&
&& &script&type="text/javascript"&
&& function&showPng(id){
&& window.showModalDialog("${pageContext.request.contextPath}/processInstanceAction_showPng.action?id="+id);
&& &/script&
&& &a&onclick="showPng('${id}');"&href="#"&查看流程图&/a&
&& &/s:iterator&
第四步:在Action中提供的方法,根据流程实例查询对应的流程变量数据
1.2&查询流程实例运行状态
第一步:为“查看流程图”按钮绑定事件
&script&type="text/javascript"&
&& function&showPng(id){
&& //弹出模式对话框
&& window.showModalDialog("${pageContext.request.contextPath}/processInstanceAction_showPng.action?id="+id);
&& &/script&
&& &a&class="easyui-linkbutton"&data-options="iconCls:'icon-search'"&
&& onclick="showPng('${id}');"&href="#"&查看流程图&/a&
第二步:在Action中提供showPng方法,根据流程实例查询坐标、部署、图片名称
&* 根据流程实例id查询坐标、部署id、图片名称
public&String&showPng(){
//1、根据流程实例id查询流程实例对象
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
//2、根据流程实例对象查询流程定义id
String processDefinitionId = processInstance.getProcessDefinitionId();
//3、根据流程定义id查询流程定义对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
//4、根据流程定义对象查询部署id
deploymentId&= processDefinition.getDeploymentId();
imageName&= processDefinition.getDiagramResourceName();
//查询坐标
//1、获得当前流程实例执行到哪个节点
String activityId = processInstance.getActivityId();//usertask1
//2、加载bpmn(xml)文件,获得一个流程定义对象
ProcessDefinitionEntity pd = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);//查询act_ge_bytearray
//3、根据activitiId获取含有坐标信息的对象
ActivityImpl findActivity = pd.findActivity(activityId);
int&x = findActivity.getX();
int&y = findActivity.getY();
int&width = findActivity.getWidth();
int&height = findActivity.getHeight();
ActionContext.getContext().getValueStack().set("x", x);
ActionContext.getContext().getValueStack().set("y", y);
ActionContext.getContext().getValueStack().set("width", width);
ActionContext.getContext().getValueStack().set("height", height);
return&"showPng";
第三步:配置struts.xml,跳转到页面
第四步:提供image.jsp页面
&!-- 1.获取到规则流程图 --&
&img&style="position: absolute;top: 0px;left: 0px;"
&src="processInstanceAction_viewImage?deploymentId=${deploymentId }&imageName=${imageName}"&
&!-- 2.根据当前活动的坐标,动态绘制DIV --&
&div&style="position:border:1top:${y-1}left:${x-1}width:${width}height:${height}"&
第五步:在Action中提供viewImage方法,根据部署和图片名称获得对应的输入流
第六步:配置struts.xml
2.&将bos系统中用户和角色同步到
2.1&将角色同步到act_id_group表
修改RoleServiceImpl中的save方法
2.2&将用户同步到act_id_user表
修改UserServiceImpl的方法
3.&设计物流配送流程
l&流程定义的id:
l&使用排他网关:
l&使用组任务:
l&任务的id(对应中的方法名):
4.&启动物流配送流程
l&修改工作单类
l&修改工作单hbm映射文件
4.1&查询工作单列表数据
第一步:在工作单管理Action中提供方法,查询为的工作单
Service代码:
第二步:配置struts.xml
第三步:提供startransfer.sjp页面,展示工作单列表数据
4.2&根据key启动流程实例
第一步:修改列表页面中启动按钮绑定事件
第二步:在工作单Action中提供方法,启动物流配送流程对应的流程实例
第三步:在工作单Service中提供方法
5.&组任务操作
5.1&查询组任务
第一步:创建一个TaskAction,提供查询组任务的方法
第二步:配置struts.xml
第三步:提供grouptask.jsp页面,展示任务列表数据
&table&class="easyui-datagrid"&fit="true"&nowrap="false"&
&th&data-options="field:'id',width:120"&任务编号&/th&
&th&data-options="field:'name',width:120"&任务名称&/th&
&th&data-options="field:'data',width:520"&业务数据&/th&
&th&data-options="field:'pick',width:120"&拾取任务&/th&
&script&type="text/javascript"&
function&showData(taskId){
//查询流程变量数据
$.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
$("#div"+taskId).html(data);
function&toggleData(taskId){
$("#div"+taskId).toggle();
&s:iterator&value="list"&var="task"&
&td&&s:property&value="id"/&&&/td&
&td&&s:property&value="name"/&&/td&
&a&onclick="toggleData('${id}')"&class="easyui-linkbutton"&查看业务数据&/a&
&div&style="display: none" id="div${id }"&
&script&type="text/javascript"&
showData('${id}');
&s:a&action="taskAction_takeTask"&namespace="/"&cssClass="easyui-linkbutton"&拾取
&s:param&name="taskId"&value="id"&&/s:param&
&/s:iterator&
5.2&拾取组任务
第一步:修改jsp页面中拾取按钮事件
第二步:在TaskAction中提供拾取任务的方法
第三步:配置struts.xml
6.&个人任务操作
6.1&查询个人任务
第一步:在TaskAction中提供findPersonalTask,查询当前登录人的个人任务
第二步:配置struts.xml
第三步:提供personaltask.jsp页面,展示个人任务列表数据
&table&class="easyui-datagrid"&fit="true"&nowrap="false"&
&th&data-options="field:'id',width:120"&任务编号&/th&
&th&data-options="field:'name',width:120"&任务名称&/th&
&th&data-options="field:'data',width:520"&业务数据&/th&
&th&data-options="field:'pick',width:120"&办理任务&/th&
&script&type="text/javascript"&
function&showData(taskId){
$.post("${pageContext.request.contextPath}/taskAction_showData.action",{"taskId":taskId},function(data){
$("#div"+taskId).html(data);
function&toggleData(taskId){
$("#div"+taskId).toggle();
&s:iterator&value="list"&var="task"&
&td&&s:property&value="id"/&&&/td&
&td&&s:property&value="name"/&&/td&
&a&onclick="toggleData('${id}')"&class="easyui-linkbutton"&查看业务数据&/a&
&div&style="display: none" id="div${id }"&
&script&type="text/javascript"&
showData('${id}');
&s:a&action="taskAction_%{taskDefinitionKey}"&namespace="/"&cssClass="easyui-linkbutton"&
&s:param&name="taskId"&value="id"&&/s:param&
&/s:iterator&
6.2&办理个人任务
6.2.1&办理审核工作单任务
第一步:修改personaltask.jsp页面中办理任务按钮的事件
第二步:在TaskAction中提供方法,处理审核工作单任务
&* 办理审核工作单任务
public&String checkWorkOrderManage() {
// 根据任务id查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
// 根据任务对象查询流程实例id
String processInstanceId = task.getProcessInstanceId();
// 根据流程实例id查询流程实例对象
ProcessInstance processInstance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
String workordermanageId = processInstance.getBusinessKey();
Workordermanage workordermanage = workordermanageService.findById(workordermanageId);
if(check&== null){
//跳转到审核页面
// 跳转到一个审核工作单页面,展示当前对应的工作单信息
ActionContext.getContext().getValueStack().set("map", workordermanage);
return&"check";
workordermanageService.checkWorkordermanage(taskId,check,workordermanageId);
return&"topersonaltasklist";
第三步:如果是跳转页面,配置struts.xml
第四步:提供check.jsp页面,展示审核工作单表单页面
第五步:在工作单Service中提供方法,处理审核工作单任务
6.2.2&办理其他任务
阅读(...) 评论()

参考资料

 

随机推荐