【问题标题】:Exchange Web Services API findItems won't find anything on 2nd execution if first did not have results如果第一次没有结果,Exchange Web 服务 API findItems 在第二次执行时将找不到任何内容
【发布时间】:2018-01-15 13:50:23
【问题描述】:

我正在编写一个测试(groovy 语言\spock 框架,如果相关)

最初它使我们的应用程序将电子邮件发送到特定的交换(Office 365,如果相关)邮箱。之后我需要登录该邮箱并验证应用程序发送的电子邮件。

我使用 EWS Java API 与 EWS 通信 (com.microsoft.ews-java-api 2.0)

连接到交换服务后,我执行以下操作:

SearchFilter searchFilter = new SearchFilter.ContainsSubstring(EmailMessageSchema.Body, "search string")
Awaitility.await()
            .atMost(180, TimeUnit.SECONDS)
            .until({
        exchangeService.findItems(WellKnownFolderName.Inbox, searchFilter, new ItemView(1)).totalCount > 0
    })

这里的Awaitility.await() 本质上是一个动态等待——它重试代码直到满足条件。它可以替换为任何类型的具有线程休眠和中断条件的循环。

在第一次尝试时 findItems 调用从未找到电子邮件 - 通常需要大约一分钟才能发送电子邮件\到达。

问题在于,在任何后续尝试中,findItems 都没有成功找到该项目。但是,如果我在它上面设置一个断点,直到我看到邮箱中的电子邮件 - 它会成功运行。

所以对我来说,一旦搜索失败(没有找到任何东西)再次执行该方法就不会做任何事情。我做错了什么?

【问题讨论】:

  • 我看到了同样的问题。如果第一次执行没有返回任何内容,则循环 findItems 调用不会返回任何结果。我刚刚尝试每次都更新 exchangeService,看看这是否可能有助于/防止以某种方式缓存?

标签: office365 exchangewebservices


【解决方案1】:

我建议您在进行 FindItem 调用之间休息一下,因为您没有给服务器时间限制以在后续调用之间进行更新。此外,您的 SearchFilter 非常耗费资源,因为它执行消息正文的子字符串。如果您想跟踪消息的传递,为什么不在发送消息时设置 InternetMessageId Internet Message ID FROM EWS Managed API Send Email c# 然后创建一个 SearchFilter 只查找具有该 Id 的消息。

【讨论】:

  • 睡眠已经存在 - Awaitility.await() 会这样做(每次内部条件失败时睡眠时间都会增加)。正如我所写 - 我正在做一个测试。不幸的是,被测系统不会在任何地方跟踪互联网消息 ID;另外,测试是一天一次,邮箱里没有很多邮件(而且是office 365,所以没在意负载)
  • 你说的“服务器时间限制”是什么?
  • 当您创建 SearchFilter EWS 将创建一个临时限制,请参阅technet.microsoft.com/en-us/library/cc535025(exchg.80).aspx 了解更多详细信息。使用 SearchFilter 的替代方法是使用 AQS msdn.microsoft.com/en-us/library/office/…(具有 ClearCache 属性)。或者,如果您在正文中搜索的文本是静态的,请创建一个 SearchFolder 并轮询该文件夹。
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多