Activiti 驳回代码尝试修改

本文介绍了一个针对Activiti工作流引擎的驳回功能改进方案。通过创建新任务而非简单更改现有任务状态来实现驳回操作,确保了流程历史记录的完整性。详细介绍了实现这一功能的具体步骤。

Activiti 驳回代码尝试修改

      之前根据jbpm改过来的驳回代码是 把当前的任务直接改变成驳回到任务 ,偶以为相当的不妥 , 以后就没办法对驳回进行追踪,应该新建驳回的任务比较靠谱 ,于是进行了一番修改。

/*
     *  activityId 驳回节点ID
     *  activityName 驳回节点名称
     *  taskId 当前任务ID
     *  variables 流程参数
     * */
    @Override
    @Transactional
    @SuppressWarnings("rawtypes")
    public boolean rejectTaskCommon(String taskId, String activityId,
            String activityName, Map variables) throws Exception {

        //找到当前任务
        TaskEntity task = (TaskEntity) baseService.getTaskService()
                .createTaskQuery().taskId(taskId).singleResult();

        if (task == null) {
            return false;
        }

        //找到流程实例
        ProcessInstance processInstance = baseService.getRuntimeService()
                .createProcessInstanceQuery()
                .processInstanceId(task.getProcessInstanceId()).singleResult();

        if (processInstance == null) {
            return false;
        }

        //取得流程定义
        ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) baseService
                .getRepositoryService()).getDeployedProcessDefinition(task
                .getProcessDefinitionId());

        if (processDefinition == null) {
            return false;
        }

        // 更换其Execution
        ExecutionEntity exeImpl = (ExecutionEntity) processInstance;

        // 更换其活动的定义
        ActivityImpl preActivity = ((ProcessDefinitionImpl) processDefinition)
                .findActivity(activityId);
        exeImpl.setActivity(preActivity);

        //取得要驳回到的节点的任务定义
        TaskDefinition taskDef = ((ProcessDefinitionEntity) processDefinition)
                .getTaskDefinitions().get(preActivity.getId());

        try {
            TaskEntity newTask = (TaskEntity) baseService.getTaskService()
                    .newTask();

            newTask.setName(activityName);
            newTask.setDescription(task.getDescription());
            newTask.setExecution(exeImpl);
            newTask.setCreateTime(new Date());

            newTask.setExecutionId(task.getExecutionId());
            newTask.setProcessInstanceId(task.getProcessInstanceId());
            newTask.setProcessDefinitionId(task.getProcessDefinitionId());
            newTask.setProcessInstance(task.getProcessInstance());

            // 更换流程任务的定义
            if (taskDef != null) {
                newTask.setTaskDefinition(taskDef);
            } else {
                return false;
            }

            //保存新的任务
            baseService.getTaskService().saveTask(newTask);
            
            
            //加入之前节点被分派的人员
            List<HistoricTaskInstance> targetTaskList = baseService
                    .getHistoryService().createHistoricTaskInstanceQuery()
                    .processInstanceId(task.getProcessInstanceId())
                    .taskDefinitionKey(activityId).list();
            if (targetTaskList != null && targetTaskList.size() > 0) {
                for (HistoricTaskInstance ht : targetTaskList) {
                    baseService.getTaskService().addCandidateUser(
                            newTask.getId(), ht.getAssignee());
                }
            }
            
            //完成当前任务
            baseService.getTaskService().deleteTask(task.getId());

        } catch (Exception e) {
            logger.error("", e);

            return false;
        }

        return true;
    }
Apache ActiveMQ Artemis是一个开源的企业消息中间件,它支持多种协议和消息模式,包括点对点、发布/订阅和请求/响应等。然而,ActiveMQ Artemis本身并不直接提供"驳回"功能,这个术语通常用于事务处理中的消息确认机制,例如在某些场景下如果消费者无法成功处理消息,会向生产者发送一个"REJECT"信号。 如果你想要模拟这样的“驳回”行为,你需要自定义一些逻辑或者利用ActiveMQ提供的回调机制。以下是一个简单的例子,展示了如何在Java中使用ActiveMQ Artemis的Consumer回调来实现“拒绝”: ```java import org.apache.activemq.artemis.api.core.Message; import org.apache.activemq.artemis.api.core.client.ClientConsumer; public class RejectionExample { private ClientConsumer consumer; public void startReceiving() throws Exception { // 创建消费者 consumer = session.createConsumer(queue); // 设置消费者监听message arrival事件 consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { try { // 检查消息是否需要驳回 if (shouldReject(message)) { // 拒绝消息 拒绝对应的消息ID,如:message.reject(); System.out.println("Rejected message: " + message.getBody().toString()); } else { // 正常处理消息 processMessage(message); } } catch (Exception e) { // 处理错误 log.error("Error processing message", e); // 这里可以尝试重新发送或记录错误 // message.nack(); // 如果你想标记消息已失败并从队列移除 } } }); } // ...定义需要检查的拒绝条件以及处理消息的方法 // 相关问题:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值