2021SC@SDUSC
openmeetings项目分析(四)
1.介绍
前两篇文章分析完了flash目录下的代码,今天来看看核心部分service目录下,系统提供了哪些功能以及这些功能是怎么实现的。今天主要是分析第一个子目录calenda,日程表功能,可以按照计划完成通知对方开始meeting的操作
2.项目目录
和上一个小项目一样,主要的代码在src/main/java/org/apache/openmettings下,我们可以看到service目录下有五个子目录,里面对应着整个系统的五个功能:日历、信息邮件,通知,表和房间。
我们先来看calendar目录下实现了哪些功能
我们先来看appointmentlogic这个文件
该项目采用了spring 框架,所以很明显看@Component等注解,在我们的代码中调用了db文件下的类,所以我们先看看db文件夹。
这里包含了对invitation的数据库操作
预约逻辑中,通知对方,先在数据库中创建invitation,然后发送通知给对方。
public void doScheduledMeetingReminder() {
String baseUrl = getBaseUrl();
if (baseUrl == null || baseUrl.length() < 1) {
log.error("Error retrieving baseUrl for application");
return;
}
int minutesReminderSend = cfgDao.getInt(CONFIG_APPOINTMENT_REMINDER_MINUTES, DEFAULT_MINUTES_REMINDER_SEND);
if (minutesReminderSend == 0) {
log.warn("minutesReminderSend is 0, disabling reminder scheduler");
return;
}
long milliseconds = minutesReminderSend * 60 * 1000L;
Calendar start = Calendar.getInstance();
if (milliseconds < 0) {
start.setTimeInMillis(start.getTimeInMillis() + milliseconds);
}
Calendar end = Calendar.getInstance();
if (milliseconds > 0) {
end.setTimeInMillis(end.getTimeInMillis() + milliseconds);
}
for (Appointment a : appointmentDao.getInRange(start, end)) {
// Prevent email from being send twice, even if the cycle takes
// very long to send each
if (a.isReminderEmailSend()) {
continue;
}
TimeZone ownerZone = getTimeZone(a.getOwner());
Calendar aNow = Calendar.getInstance(ownerZone);
Calendar aStart = a.startCalendar(ownerZone);
aStart.add(Calendar.MINUTE, -minutesReminderSend);
if (aStart.after(aNow)) {
// to early to send reminder
continue;
}
// Update Appointment to not send invitation twice
a.setReminderEmailSend(true);
appointmentDao.update(a, null, false);
List<MeetingMember> members = a.getMeetingMembers();
sendReminder(a.getOwner(), a);
if (members == null) {
log.debug("doScheduledMeetingReminder : no members in meeting!");
continue;
}
// Iterate through all MeetingMembers
for (MeetingMember mm : members) {
log.debug("doScheduledMeetingReminder : Member " + mm.getUser().getAddress().getEmail());
Invitation inv = mm.getInvitation();
sendReminder(mm.getUser(), a, inv);
}
}
}
剩下的部分是按照schedule依此去完成remind操作
总结
预约逻辑这个文件封装了消息通知及日程读取的操作,实现了按照日程规化通知对方的功能