Activityカスタムイベントリスニングとメール通知
5482 ワード
Activityカスタムイベントリスニングとメール通知
Activity公式ドキュメント参照https://www.activiti.org/userguide/#eventDispatcher
まず、私たちのニーズを確立します.すなわち、タスクの作成、割り当て、完了がある場合、メールは対応するユーザに通知する.
完了手順は次のとおりです. Activityは、イベントリスニングインタフェースを提供します.ActivitiEventListener org.activiti.engine.delegate.event.ActivtivitiEventTypeは、様々なリスニング可能なイベントタイプ を提供する.は、対応するイベントを通じて、関連するユーザ、タスク名などを取得する.
最も重要なステップは、Activity Eventをsub-interface(Activity Entity Event)に強制的に変換し、取得したEntityを特定のEntityに強制的に変換し、最終的に対応する情報を取得することです.
メール送信モジュールでは、メールテンプレートを構築し、メールコンポーネントを一例化する必要があります.
テンプレートの構築にはorgを用いる.apache.velocityコンポーネント、リソースプロファイルは次のとおりです.
velocityに、定義したテンプレートファイルをロードするときにclassloaderリソースパスを使用するように伝えます.もちろん、物理パスを配置することもできますが、具体的には公式サイトを参照してください.ここでは説明しません.
Activity公式ドキュメント参照https://www.activiti.org/userguide/#eventDispatcher
まず、私たちのニーズを確立します.すなわち、タスクの作成、割り当て、完了がある場合、メールは対応するユーザに通知する.
完了手順は次のとおりです.
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リソースパスを使用するように伝えます.もちろん、物理パスを配置することもできますが、具体的には公式サイトを参照してください.ここでは説明しません.