ДоступОткрыто с помощью Item.bind () из subscribeToStreamingNotifications - PullRequest
0 голосов
/ 10 октября 2019

Мы подписываемся на потоковые уведомления в 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 () завершается неудачно с помощью:

"Доступ запрещен. Проверьте учетные данные и повторите попытку., Процесс не смог получить правильные свойства., ErrorCode = 'ErrorAccessDenied'"

ИЛИ

"Указанный объектне был найден в хранилище., процессу не удалось получить правильные свойства., errorCode = 'ErrorItemNotFound' "

Это не факт, что

  • учетные данные действительны иможет быть успешно использован для вызова service.findFolders (WellKnownFolderName.MsgFolderRoot, folderView);
  • Мы используем олицетворение Exchange. Права олицетворения были назначены для всех почтовых ящиков.
  • Якорный почтовый ящик установлен: service.getHttpHeaders (). Put ("X-AnchorMailbox", почтовый ящик);
  • X-PreferServerAffinity установлен: service.getHttpHeaders (). Put ("X-PreferServerAffinity "," true ");

Может кто-нибудь сообщить, почему мы будем получать ошибки ErrorAccessDenied и ErrorItemNotFound? Это связано с обработкой сообщений или папок, связанных с системой Exchange? Как мы можем обработать эти элементы или если мы не можем, как их можно пропустить, не вызывая ненужную загрузку на сервере Exchange?

1 Ответ

0 голосов
/ 15 октября 2019

В моем случае мой код выдавал себя за неправильный почтовый ящик. Оказывается, мне нужно было поддерживать карту следующим образом:

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

Затем в методе messagesEventDelegate (..) ...

Вызов

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) {
                   ...
                }
            }
      }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...