Freigeben über


Implementieren der FlushQueues-Methode

Gilt für: Outlook 2013 | Outlook 2016

Der MAPI-Spooler verwendet die IXPLogon::FlushQueues-Methode zum Herunterladen und Hochladen aller ausstehenden Nachrichten an und von einem Transportanbieter. In der Regel leert der MAPI-Spooler die Warteschlangen für alle Transportanbieter, die bei der Sitzung angemeldet sind, beginnend mit dem ersten Transportanbieter, wie im Abschnitt transport order des Benutzerprofils festgelegt. Das Leeren von Warteschlangen ist fast immer das Ergebnis einer direkten Anforderung durch den Benutzer, sodass das Senden und Empfangen von Nachrichten während des Leerens von Warteschlangen synchron mit dem MAPI-Spooler erfolgt. Da diese Aufrufe synchron sind, sollte der Transportanbieter sie so schnell wie möglich verarbeiten.

Transportanbieter müssen den FlushQueues-Aufruf wie in der folgenden Schrittfolge beschrieben verarbeiten, um eine ordnungsgemäße Nachrichtenverarbeitung zu ermöglichen und externe Ressourcen wie Modems zu ermöglichen, die von anderen Transportanbietern als Teil des FlushQueues-Vorgangs des MAPI-Spoolers verwendet werden können.

Schritt Komponente Implementierung
1. MAPI-Spooler
Ruft die FlushQueues-Methode für den ersten Transportanbieter auf, der in der Transportreihenfolge des Benutzerprofils aufgeführt ist, und übergibt die angeforderten Flags im ulFlags-Parameter . FlushQueues wird einmal aufgerufen, wobei alle Flags für den gesamten Upload- und Downloadvorgang festgelegt sind.
2. Transportanbieter
Es muss eine Reihe von Aktionen ausgeführt werden, bevor vom FlushQueues-Aufruf zurückgegeben wird. Wenn zuvor übermittelte Nachrichten zurückgestellt werden, sollte die IMAPISupport::SpoolerNotify-Methode mit festgelegtem NOTIFY_SENT_DEFERRED-Flag aufgerufen werden. Beachten Sie, dass es möglich ist, dass der MAPI-Spooler eine Nachricht abbrechen kann, die zurückgestellt wurde, bevor der Transportanbieter die Verarbeitung der Nachricht beenden kann. Wenn der Transportanbieter eine externe Ressource wie ein Modem verwendet, sollte die Verbindung mit der externen Ressource hergestellt werden. Das STATUS_OUTBOUND_FLUSH Bit in der eigenschaft PR_STATUS_CODE (PidTagStatusCode) der status Zeile des Transportanbieters muss mithilfe der IMAPISupport::ModifyStatusRow-Methode festgelegt werden. Der Transportanbieter sollte dann S_OK für den FlushQueues-Aufruf zurückgeben.
3. MAPI-Spooler
Überprüft die status Zeile des Transportanbieters auf das STATUS_OUTBOUND_FLUSH Bit und ruft IXPLogon::SubmitMessage für die erste Nachricht in der Warteschlange auf.
4. Transportanbieter
Verarbeitet die Nachricht und gibt vom SubmitMessage-Aufruf zurück.
5. MAPI-Spooler
Wenn der Transportanbieter S_OK von SubmitMessage zurückgibt, ruft der MAPI-Spooler IXPLogon::EndMessage für die Nachricht auf, wie dies bei regulärem Nachrichtenversand der Fall ist. Wenn der Transportanbieter einen anderen Wert als S_OK von SubmitMessage zurückgibt, behandelt der MAPI-Spooler den Wert entsprechend, bevor EndMessage aufgerufen wird oder bevor SubmitMessage erneut aufgerufen wird.
6. Transportanbieter
Gibt von EndMessage mit der Nachrichtenverarbeitung status im lpulFlags-Parameter zurück.
7. MAPI-Spooler und -Transportanbieter
Die SubmitMessage- EndMessage-Schleife wird fortgesetzt, bis alle Nachrichten in der Warteschlange heruntergeladen wurden.
8. MAPI-Spooler
Benachrichtigt den Transportanbieter, dass er das Herunterladen von Nachrichten abgeschlossen hat, indem er die IXPLogon::TransportNotify-Methode des Transportanbieters mit festgelegtem NOTIFY_END_OUTBOUND_FLUSH-Flag aufruft.
9. Transportanbieter
Gibt alle externen Ressourcen frei, die beim Senden ausgehender Nachrichten verwendet werden, sodass sie von anderen Transportanbietern verwendet werden können, um ihre Warteschlangen zu leeren. Das STATUS_INBOUND_FLUSH Bit in der PR_STATUS_CODE-Eigenschaft der status Zeile des Transportanbieters muss mithilfe von ModifyStatusRow festgelegt werden.
10. MAPI-Spooler
Überprüft die status Zeile des Transportanbieters auf das STATUS_INBOUND_FLUSH Bit und ruft IXPLogon::StartMessage auf, wenn es festgelegt ist.
11. Transportanbieter
Verarbeitet die Nachricht und gibt von StartMessage zurück. Wenn der Transportanbieter andere Nachrichten hochzuladen hat, sollte er SpoolerNotify mit festgelegtem NOTIFY_NEWMAIL-Flag aufrufen. Wenn der Transportanbieter keine Nachrichten zum Hochladen hat, sollte er IMAPIProp::SaveChanges für die Nachricht aufrufen, die der MAPI-Spooler in StartMessage übergeben und zurückgegeben hat.
12. MAPI-Spooler
Setzt den Aufruf von StartMessage fort, bis SaveChanges für eine Nachricht aufgerufen wird. Nachdem der Transportanbieter den Upload abgeschlossen hat, ruft der MAPI-Spooler TransportNotify mit festgelegtem NOTIFY_END_INBOUND_FLUSH-Flag auf.
13. Transportanbieter
Löscht das STATUS_INBOUND_FLUSH Bit in der PR_STATUS_CODE-Eigenschaft der status Zeile mithilfe von ModifyStatusRow und gibt alle externen Ressourcen frei, damit sie von anderen Transportanbietern verwendet werden können.
14. MAPI-Spooler
Ruft FlushQueues für den nächsten Transportanbieter auf, der in der Transportreihenfolge des Benutzerprofils aufgeführt ist.

Wenn eine Clientanwendung IMAPIStatus::FlushQueues für das status-Objekt eines Transportanbieters aufruft, sollte der Transportanbieter das entsprechende Bit in seiner status Zeile mit ModifyStatusRow festlegen. Der MAPI-Spooler ruft dann die IXPLogon::FlushQueues-Methode des Transportanbieters nach Belieben des MAPI-Spoolers auf. Wenn die IXPLogon::FlushQueues-Methode des Transportanbieters als Ergebnis des IMAPIStatus::FlushQueues-Aufrufs einer Clientanwendung aufgerufen wird, erfolgt der Vorgang asynchron für die Clientanwendung. Andernfalls funktioniert IXPLogon::FlushQueues synchron mit dem MAPI-Spooler.

Aus Leistungsgründen ruft der MAPI-Spooler die FlushQueues-Methode eines Transportanbieters nur auf, wenn die flags STATUS_INBOUND_FLUSH und STATUS_OUTBOUND_FLUSH in der status Zeile des Transportanbieters festgelegt sind. Daher kann ein Transportanbieter den FlushQueues-Vorgang jederzeit beenden, indem er die STATUS_OUTBOUND_FLUSH und STATUS_INBOUND_FLUSH Flags in seiner status Zeile löscht. Wenn der MAPI-Spooler heruntergefahren wird und den FlushQueues-Vorgang beenden muss, ruft er TransportNotify auf, wobei sowohl die flags NOTIFY_END_INBOUND_FLUSH als auch NOTIFY_END_OUTBOUND_FLUSH festgelegt sind. Der Transportanbieter sollte alle externen Ressourcen freigeben und zurückgeben.