AccessDenied with Item.bind() from subscribeToStreamingNotif



我们通过以下方法订阅MS Exchange 2016的流式通知:

service.subscribeToStreamingNotificationsOnAllFolders(EventType.Copied,EventType.Created, EventType.Deleted, EventType.Modified, EventType.Moved, EventType.NewMail);
switch (itemEvent.getEventType()) {
case Deleted:
delete(mailbox, itemEvent.getItemId());
break;
case Moved:
try {
delete(mailbox, itemIdNoChangeKey(itemEvent.getOldItemId()));
} finally {
create(mailbox, Item.bind(service, itemIdNoChangeKey(itemEvent.getItemId())));
}
break;
case Modified:
update(mailbox, Item.bind(service, itemIdNoChangeKey(itemEvent.getItemId()), itemProp()));
break;
case Copied:
case Created:
create(mailbox, Item.bind(service, itemIdNoChangeKey(itemEvent.getItemId()), itemProp()));
break;
}

有时上述调用会成功,但通常情况下,Items.bind(( 会失败,并显示:

"访问被拒绝。检查凭据并重试,进程无法获取正确的属性,错误代码='错误访问被拒绝'">

"在存储中找不到指定的对象,进程无法获取正确的属性,错误代码='错误项未找到'">

这是可惜的事实

  • 凭据有效,可以成功用于调用 service.findFolder(WellKnownFolderName.MsgFolderRoot, folderView(;
  • 我们正在使用交易所模拟。 已为所有邮箱分配了模拟权限。
  • 锚邮箱设置:service.getHttpHeaders((.put("X-AnchorMailbox", mailbox(;
  • X-PreferServerAffinity
  • is set: service.getHttpHeaders((.put("X-PreferServerAffinity", "true"(;

任何人都可以告知为什么我们会收到ErrorAccessDened和ErrorItemNotFound错误吗?是否与处理与 Exchange 系统相关的邮件或文件夹有关?我们如何处理这些项目,或者如果我们不能,如何跳过它们而不会在 Exchange 服务器上造成不必要的负载?

就我而言,我的代码模拟了错误的邮箱。 事实证明,我需要维护一张地图,如下所示:

private Map<StreamingSubscription, String> reverseSubscriptions = Collections.synchronizedMap(new HashMap<>());

然后在通知事件委托(..( 方法中...

String mailbox = reverseSubscriptions.get(args.getSubscription());

处理项目事件时...

private void processItemEvent(ExchangeService service, String mailbox, ItemEvent itemEvent) throws Exception {
synchronized(service) {
service.setImpersonatedUserId(impersonateAccount(mailbox));
service.getHttpHeaders().put("X-AnchorMailbox", mailbox);
service.getHttpHeaders().put("X-PreferServerAffinity", "true");
try {
...
} catch (Exception ie) {
...
}
}
}

}

最新更新