从上篇文章《Outlook&钉钉日程双向同步方案》发布至今,又发现了几个较为头痛的问题,不过随着使用量的上升,同步程序也在逐步趋于稳定。下面把几个问题进行分享,供后来者参考。
1.双向同步死循环问题
无论是从Outlook新建日程同步至钉钉还是从钉钉同步至Outlook,我们肯定希望得到这样一个讯息,是否能知道这个日程到底是用户在客户端新建的,还是通过API接口新建的,换句话说就是我想知道这个日程到底需不需要同步,能不能给他设置一个标志来表示呢?下面分两步来看:
1.1从Outlook客户端新建
从Outlook同步至钉钉,我们调用钉钉开放平台的接口创建对应的日程,从钉钉开放平台接口-创建日程是没有办法去设置附加参数(与日程本身无关的参数)的,所以我们只能通过接口的返回结果和放回状态来判断是否创建成功,不过好在钉钉API的成功率还是相当之高的,基本够用,同时,我们也希望钉钉官方能否在后期的更新中能否增加一个附加字段,供调用侧作为业务逻辑处理使用,原样返回即可。
1.2从钉钉客户端新建
这种情况下,我们其实是可以通过设置Outlook日程的附加参数来实现,关键代码如下:
ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "DingtalkEventId", MapiPropertyType.String);
appointment.setExtendedProperty(extendedPropertyDefinition, "142142353252525");
这样我们就可以设置一个名为DingtalkEventId的属性,然后通过这个属性是否为空得知此日程到底是钉钉同步过来的还是客户创建的。
2.Exchange Server 服务抽风
在使用ews创建日程过程中,最近经常出现如下的错误“服务当前对此请求不可用,因为目标站点中没有一个客户端访问服务器可以处理请求”,但是实际呢,接口却调用成功,这就有点恶心了,因为我们无法一步到位的将ews创建的日程的ID同步到数据库中,那么就会存在重复新建的风险,可能会导致又从Outlook侧再同步到钉钉的尴尬现象,不过,这种情况不用慌,从上面1.2我们设置了附加属性,获取到了附加属性说明是从钉钉同步过来的,可以进行屏蔽处理,同时更新老的数据即可。导致这个状态的原因初步判断为Exchange Server集群中有某台或者某几台服务出现故障。
3.循环日程差异
当在Outlook新建月度循环会议中,可选择第几个工作日(Weekday)或第几个周末(WeekendDay),例如,每月的第四个工作日,那就是从第一个工作日开始计数,到第四个工作日;每月的第2个周末,那就是周六或者周日,计算规则为从第一天周末开始计数,周六周日分别算两天。这种模式在钉钉中不支持,此种情况需要单独处理,不同步或者将同步程序改为单词同步,只同步第一次的日程。
4.ExchangeService service 401
在同步过程中我们经常遇到如下错误
microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. The request failed. The remote server returned an error: (401)Unauthorized
这说明当前的ExchangeService,已经失效,这个失效的原因不甚明了,如果有研究的朋友可以私信告知,不胜感激,所以,建议在一个session中使用时采取即用即取的策略,用完直接ExchangeService.close()调用,释放连接。
5.会议室权限问题:
今天遇到一个新的问题,获取会议室日程面板时报错“存储中找不到指定的文件夹”,需要将会议室的权限由LimitedDetails 改为 reviewer
6.通讯组问题
当参会人中有通讯组的存在时,要特别注意,尤其当一个人属于两个通讯组分别出现在可选和必选参与人两栏时,要进行去重操作,删去重复的可选参与人。
7.钉钉会议组织则为外部人员
当钉钉的会议组织者为外部人员,邀请了组织内的人员时,也会触发日程的通知,因此,需要判断此日程的组织者是否为组织内人员,再进行同步
后续会不断更新所踩得坑,供参考,可以加QQ群共同讨论对策,群号:341386140