java - 2 种方式与谷歌日历/Outlook 同步

标签 java c# outlook calendar fullcalendar

我正在使用 FullCalendar在我的应用程序中显示通过我们自己的应用程序创建的事件。

我有一个用于创建/更新事件的添加/编辑表单。这些事件存储在应用程序使用的数据库中。

我需要更进一步,需要将 Google 和 Outlook 日历同步到我的日历中。这应该是 2 路同步,即

如果我在我的日历中创建/编辑/更新一个事件,它应该在 Google/Outlook 日历中创建/编辑/删除。

反之亦然。

如果我在 Google/Outlook 日历中做一些更改,它应该在我的日历中可见。

我想知道您对实现这个的想法:

  1. 我是否应该获取 Google/Outlook 的所有事件并将它们导入我的数据库,然后在我的日历 View 中显示它们。这在技术上是否可行?即,将一个 channel 的整个事件集导入我的数据库。

  2. 我是否应该通过 Google/Outlook API 执行 GET 以获取我现在在我的日历中的特定 View 的事件(我将拥有我的日历 View 的开始数据和结束日期)并且只是将它们显示到我的日历中(即我没有将这些外部事件存储在我的数据库中)。如果用户想要对应该通过创建/更新和删除 API 调用直接更新到 Google/Outlook 日历的事件进行任何更改。

最好的方法应该是什么?

编辑:

我去了https://calendar.sunrise.am/ (日历同步网络应用程序之一)并注意到

enter image description here

即他们允许将许多不同的应用程序日历/任务同步到他们的日历中。

看到这一切,我觉得将所有那些应用程序的所有事件存储到我们自己的应用程序的数据库中是不可行的。如果通过我的应用程序对这些事件进行了任何更改,我应该调用这些应用程序的 API 以将更改添加到它们的应用程序(Google 日历、Outlook 等)中。

你的想法是什么?

最佳答案

为了能够创建可靠的同步解决方案,您需要几样东西。最重要的是对方(这里是google calendar和outlook)应该配合你,提供一个api来进行增量同步。我没有查看 Outlook,但 Google Calendar API 为您提供了所需的一切。

首先回答您的问题 - 是的,您需要获取所有事件(尽管您可以跳过过去的事件)并将它们存储在您自己的数据库中。始终对所有 外部源(加上您自己的数据库)进行查询很慢,使同步变得更加困难并且给您带来很多限制,因为您无法轻松地过滤或搜索多个源的事件。下面我假设我们只使用谷歌日历,希望 Outlook 是类似的(但我没有检查)。

所以你需要的 list :

  1. 您自己的事件数据库,其中事件表有几个重要的元数据列:Created\Updated(上次创建或更新事件的时间,与事件本身的日期无关) , Source(此事件的来源,如 Google Calendar、Outlook 或您自己的应用程序)、UpdatedAtSource(上次修改此事件的来源)、EventID(事件的唯一标识符 - 重要的是在某些情况下防止重复)。

  2. 最初从目标提供商获取所有事件并将它们存储在您的数据库中。 Here是对 Google 日历事件结构的引用,您会看到所有必需的元数据字段(创建的、更新的、id)都在那里。

  3. 现在您需要监视来自提供商的新事件。您可以通过轮询(定期检查是否有新事件)或向您发送提供商推送事件来执行此操作。 Google 日历支持这两个选项。 Here是描述如何实现推送通知和 here 的链接是描述如何获取 新事件的链接,即您(您的应用程序)之前没有看到的事件。请注意,您不需要每次都需要获取整个列表,也不需要提供一些过滤器选项(例如“给我 2016-06-21 之后创建的所有事件”)。所有这些都是不可靠的,但是 Google Calendar 开发人员知道如何制作好的同步 api,所以他们为您处理了这个问题。只需获取并存储提供的 nextSyncToken 并使用它来发出 future 的请求。如果您使用推送通知 - 总是也会定期轮询事件,但不经常(例如每隔几个小时一次)。推送通知并非 100% 可靠,有些可能会被遗漏 - 您需要使用 nextSyncToken api 来处理这些通知。

  4. 将您自己的应用所做的更改推送到目标提供商。但是,在进行更改时,不要立即执行此操作。而是使用后台进程,一对一地推送每个用户+提供者对的更改。会有网络故障,会有冲突,所以你必须按顺序而不是并行地推送更改(同样,按顺序为每个用户 + 提供者对,而不是全局)。存储最后一次成功推送更改的时间戳(同样,对于每个用户 + 提供者),如果流程被中断 - 您知道从哪里重新开始。
  5. 我不会在这里过多介绍,但您会发生冲突 - 即当用户在多个源中修改同一事件时。但是,如果您使用推送通知 - 冲突将非常罕见。您仍然必须至少在用户界面中为它们做好计划。如果您检测到无法解决的冲突 - 暂停同步过程并询问用户如何解决它。

所以您看到有一些工作要做,但最终您会发出少量请求并在每次向提供商请求时获取少量数据,您的用户会很高兴看到来自他们的 Google 的新事件立即在您的应用程序中添加 Calendar\Outlook(反之亦然)。

关于java - 2 种方式与谷歌日历/Outlook 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886302/

相关文章:

java - 存储在 LinkedList<T> 中的对象无法在 JAX-WS RPC 调用中存活?

c# - DataWriter的正确使用方法?

java - Android,Glide图像加载库: NullPointerException, ProviderInfo

c# - 调用 Application.Exit() 后,应用程序仍在内存中运行

c# - 类 PerformanceCounter 文档

vba - 如何共享 Outlook VBA

powershell - 将 Outlook 电子邮件导出或打印为 PDF

javascript - Outlook 2016 桌面应用程序中使用的是哪个版本的 IE?

带有 Spring Boot 执行器和 Tomcat 的 java.lang.StackOverflowError

java - Linux 平台上的 Desktop#browse 是否仅支持 Gnome 桌面?