Activityカスタムイベントリスニングとメール通知

5482 ワード

Activityカスタムイベントリスニングとメール通知
Activity公式ドキュメント参照https://www.activiti.org/userguide/#eventDispatcher
まず、私たちのニーズを確立します.すなわち、タスクの作成、割り当て、完了がある場合、メールは対応するユーザに通知する.
完了手順は次のとおりです.
  • Activityは、イベントリスニングインタフェースを提供します.ActivitiEventListener
  • org.activiti.engine.delegate.event.ActivtivitiEventTypeは、様々なリスニング可能なイベントタイプ
  • を提供する.
  • は、対応するイベントを通じて、関連するユーザ、タスク名などを取得する.
  • public class OwnEventListener implements ActivitiEventListener {
    
        @Override
        public void onEvent(ActivitiEvent event) {
            System.out.println("Event received: " + event.getType());
    
            if (event.getType() == ActivitiEventType.TASK_CREATED
                    || event.getType() == ActivitiEventType.TASK_ASSIGNED
                    || event.getType() == ActivitiEventType.TASK_COMPLETED) {
                ActivitiEntityEvent entityEvent = (ActivitiEntityEvent) event;
                TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity();
                MailWrapper.getInstance().sendTaskMail(taskEntity.getOwner(), taskEntity.getAssignee(), taskEntity.getName(), event.getType());
            }
        }

    最も重要なステップは、Activity Eventをsub-interface(Activity Entity Event)に強制的に変換し、取得したEntityを特定のEntityに強制的に変換し、最終的に対応する情報を取得することです.
    メール送信モジュールでは、メールテンプレートを構築し、メールコンポーネントを一例化する必要があります.
    public class MailWrapper {
        private final Logger log = LoggerFactory.getLogger(MailWrapper.class);
    
        @Autowired
        private MailSender mailSender;
    
        private MailWrapper() {
        Velocity.init(PropertiesUtil.readPropertiesInEnv("vm.properties"));
        }
    
        private static class WrapperSingleton {
            static final MailWrapper mv = new MailWrapper();
        }
    
        public static MailWrapper getInstance() {
            return WrapperSingleton.mv;
        }
    
        public void sendTaskMail(String owner, String assignee, String taskName, ActivitiEventType eventType) {
            SimpleMailMessage msg = new SimpleMailMessage();
            String toEmailAddress = KeystoneClient.getInstance().findEmailByUserId(assignee);
            String ownerName = KeystoneClient.getInstance().findNameByUserId(owner);
            String assigneeName = KeystoneClient.getInstance().findNameByUserId(assignee);
    
            TaskMail tMail = new TaskMail(ownerName, assigneeName, taskName, eventType);
            VelocityContext model = new VelocityContext();
            model.put("task", tMail);
    
            Template template = Velocity.getTemplate("template/task_email.vm", "utf8");
    
            StringWriter w = new StringWriter();
            template.merge(model, w);
    
            msg.setSubject("hello world");
            msg.setTo(toEmailAddress);
            msg.setText(w.toString());
    
            try {
                mailSender.send(msg);
    
                log.info("mail has been sent to " + toEmailAddress);
            } catch (MailException e) {
                System.err.println(e.getMessage());
            }
        }
    }

    テンプレートの構築にはorgを用いる.apache.velocityコンポーネント、リソースプロファイルは次のとおりです.
    resource.loader = class
    class.resource.loader.description = Velocity Classpath Resource Loader
    class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

    velocityに、定義したテンプレートファイルをロードするときにclassloaderリソースパスを使用するように伝えます.もちろん、物理パスを配置することもできますが、具体的には公式サイトを参照してください.ここでは説明しません.