更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
1、上一节说到RedisReceiver ,这里有调用了NbcioRedisListener自定义业务监听,如下:
package com.ruoyi.common.redis.listener; import com.ruoyi.common.base.BaseMap; /** * 自定义消息监听 * @author nbacheng * @date 2023-09-20 */ public interface NbcioRedisListener { void onMessage(BaseMap message); }
2、实现这个代码如下:
package com.ruoyi.common.websocket; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.common.base.BaseMap; import com.ruoyi.common.constant.CommonSendStatus; import com.ruoyi.common.redis.listener.NbcioRedisListener; import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; /** * 监听消息(采用redis发布订阅方式发送消息) */ @Slf4j @Component public class SocketHandler implements NbcioRedisListener { @Autowired private WebSocketServer webSocket; @Override public void onMessage(BaseMap map) { log.info("【SocketHandler消息】Redis Listerer:" + map.toString()); String userId = map.get("userId"); String message = map.get("message"); if (ObjectUtil.isNotEmpty(userId)) { webSocket.pushMessage(userId, message); //app端消息推送 webSocket.pushMessage(userId+CommonSendStatus.APP_SESSION_SUFFIX, message); } else { webSocket.pushMessage(message); } }
这里进行了websocket的服务器给用户推送,同时之前第一个节里公共类方法也同时往两个表增加数据,以便失败后后续可以进行发送,以确保能真正通知到用户。
3、接下来就是需要在用户提起流程发给审批人进行消息发送了
package com.ruoyi.flowable.listener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; import org.flowable.common.engine.api.delegate.event.FlowableEvent; import org.flowable.common.engine.api.delegate.event.FlowableEventListener; import org.flowable.common.engine.api.delegate.event.FlowableEventType; import org.flowable.engine.HistoryService; import org.flowable.engine.RepositoryService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.springframework.stereotype.Component; import com.ruoyi.common.core.service.CommonService; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.model.LoginUser; import javax.annotation.Resource; /** * 全局监听-工作流待办消息提醒 * * @author nbacheng */ @Slf4j @Component @RequiredArgsConstructor public class TaskCreateListener implements FlowableEventListener { private final TaskService taskService; @Resource private CommonService commonService; @Resource protected RepositoryService repositoryService; @Resource protected HistoryService historyService; @Override public void onEvent(FlowableEvent flowableEvent) { FlowableEventType type = flowableEvent.getType(); if (type == FlowableEngineEventType.TASK_ASSIGNED) { if(flowableEvent instanceof org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl ) { TaskEntity taskEntity = (TaskEntity) ((org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl) flowableEvent).getEntity(); String taskId = taskEntity.getId(); String procInsId = taskEntity.getProcessInstanceId(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(procInsId) .singleResult(); String businessKey = historicProcessInstance.getBusinessKey(); String deployId = historicProcessInstance.getDeploymentId(); String startUserId = historicProcessInstance.getStartUserId(); //获取任务接收人 String receiver = taskEntity.getAssignee(); if (StringUtils.isNotEmpty(receiver)) { //发送提醒消息 String category = ""; if(taskService.getVariables(taskId).get("category") != null) { category = taskService.getVariables(taskId).get("category").toString(); } LoginUser loginUser = commonService.getLoginUser(); String taskMessageUrl; if(StringUtils.isNotBlank(businessKey)) { taskMessageUrl = "<a href=" + commonService.getBaseUrl() + "?procInsId=" + procInsId + "&deployId=" + deployId + "&taskId=" + taskId + "&businessKey=" + businessKey + "&category=" + category + "&finished=true" + ">点击这个进行处理</a>" ; } else { taskMessageUrl = "<a href=" + commonService.getBaseUrl() + "?procInsId=" + procInsId + "&deployId=" + deployId + "&taskId=" + taskId + "&businessKey" + "&category=" + category + "&finished=true" + ">点击这个进行处理</a>" ; } String msgContent = "流程待办通知" + taskMessageUrl; if(!StringUtils.equals(startUserId, receiver) || !StringUtils.equals((loginUser.getUserId()).toString(),receiver)) {//发起人或登录人自己不发送 log.info("流程待办通知给:" + receiver); commonService.sendSysNotice(loginUser.getUserId().toString(), receiver, "流程待办通知", msgContent, Constants.MSG_CATEGORY_3);//setMsgCategory=3是待办 } } } } } @Override public boolean isFailOnException() { return false; } @Override public boolean isFireOnTransactionLifecycleEvent() { return false; } @Override public String getOnTransaction() { return null; } }