Implementando o método FlushQueues
Aplica-se a: Outlook 2013 | Outlook 2016
O spooler MAPI usa o método IXPLogon::FlushQueues para baixar e carregar mensagens pendentes de e para um provedor de transporte. Normalmente, o spooler MAPI libera as filas para todos os provedores de transporte conectados à sessão, começando com o primeiro provedor de transporte conforme definido na seção de ordem de transporte do perfil do usuário. A liberação de filas é quase sempre o resultado de uma solicitação direta do usuário, portanto, o envio e o recebimento de mensagens enquanto as filas estão sendo liberadas é síncrono para o spooler MAPI. Como essas chamadas são síncronas, o provedor de transporte deve processá-las o mais rápido possível.
Os provedores de transporte devem lidar com a chamada FlushQueues , conforme descrito na sequência de etapas a seguir para habilitar o processamento de mensagens adequado e permitir que recursos externos, como modems, sejam usados por outros provedores de transporte como parte da operação FlushQueues do carreador MAPI.
Etapa | Componente | Implementação |
---|---|---|
1. | Spooler MAPI |
Chama o método FlushQueues para o primeiro provedor de transporte listado na ordem de transporte do perfil do usuário, passando os sinalizadores solicitados no parâmetro ulFlags . O FlushQueues é chamado uma vez com todos os sinalizadores definidos para toda a operação de upload e download. |
2. | Provedor de Transporte |
Precisa fazer várias coisas antes de retornar da chamada FlushQueues . Se as mensagens enviadas anteriormente estiverem sendo adiadas, o método IMAPISupport::SpoolerNotify deverá ser chamado com o conjunto de sinalizadores NOTIFY_SENT_DEFERRED. Observe que é possível que o spooler MAPI cancele uma mensagem que foi adiada antes que o provedor de transporte tenha a chance de concluir o processamento da mensagem. Se o provedor de transporte usar um recurso externo, como um modem, a conexão com o recurso externo deverá ser estabelecida. O bit STATUS_OUTBOUND_FLUSH na propriedade PR_STATUS_CODE (PidTagStatusCode) da linha status do provedor de transporte deve ser definido usando o método IMAPISupport::ModifiStatusRow. Em seguida, o provedor de transporte deve retornar S_OK para a chamada FlushQueues . |
3. | Spooler MAPI |
Verifica a linha status do provedor de transporte para o bit STATUS_OUTBOUND_FLUSH e chama IXPLogon::SubmitMessage para a primeira mensagem na fila. |
4. | Provedor de transporte |
Manipula a mensagem e retorna da chamada SubmitMessage . |
5. | Spooler MAPI |
Se o provedor de transporte retornar S_OK do SubmitMessage, o spooler MAPI chamará IXPLogon::EndMessage para a mensagem como faz com o envio regular de mensagens. Se o provedor de transporte retornar um valor diferente de S_OK do SubmitMessage, o spooler MAPI manipulará o valor adequadamente antes de chamar EndMessage ou antes de chamar SubmitMessage novamente. |
6. | Provedor de transporte |
Retorna do EndMessage com seu status de processamento de mensagens no parâmetro lpulFlags. |
7. | Provedor de transporte e spooler MAPI |
O loop SubmitMessage- EndMessage continua até que todas as mensagens na fila sejam baixadas. |
8. | Spooler MAPI |
Notifica o provedor de transporte que terminou de baixar mensagens chamando o método IXPLogon::TransportNotify do provedor de transporte com o conjunto de sinalizadores NOTIFY_END_OUTBOUND_FLUSH. |
9. | Provedor de transporte |
Libera todos os recursos externos usados no envio de mensagens de saída para que possam ser usados por outros provedores de transporte para liberar suas filas. O bit STATUS_INBOUND_FLUSH na propriedade PR_STATUS_CODE da linha status do provedor de transporte deve ser definido usando ModifiStatusRow. |
10. | Spooler MAPI |
Verifica a linha status do provedor de transporte para o bit STATUS_INBOUND_FLUSH e chama IXPLogon::StartMessage se ele estiver definido. |
11. | Provedor de transporte |
Processa a mensagem e retorna do StartMessage. Se o provedor de transporte tiver outras mensagens para carregar, ele deve chamar SpoolerNotify com o conjunto de sinalizadores NOTIFY_NEWMAIL. Se o provedor de transporte não tiver mensagens para carregar, ele deve chamar IMAPIProp::SaveChanges na mensagem que o spooler MAPI passou em StartMessage e retornar. |
12. | Spooler MAPI |
Continua chamando StartMessage até que SaveChanges seja chamado em uma mensagem. Depois que o provedor de transporte terminar de carregar, o spooler MAPI chama TransportNotify com o conjunto de sinalizadores NOTIFY_END_INBOUND_FLUSH. |
13. | Provedor de transporte |
Limpa o bit STATUS_INBOUND_FLUSH na propriedade PR_STATUS_CODE de sua linha status usando ModifiStatusRow e libera todos os recursos externos para que eles estejam disponíveis para uso por outros provedores de transporte. |
14. | Spooler MAPI |
Chama FlushQueues para o próximo provedor de transporte listado na ordem de transporte do perfil do usuário. |
Se um aplicativo cliente chamar IMAPIStatus::FlushQueues no objeto status de um provedor de transporte, o provedor de transporte deverá definir o bit apropriado em sua linha status com ModifiStatusRow. O spooler MAPI então chama o método IXPLogon::FlushQueues do provedor de transporte na conveniência do spooler MAPI. Quando o método IXPLogon::FlushQueues do provedor de transporte é chamado como resultado da chamada IMAPIStatus::FlushQueues de um aplicativo cliente, a operação ocorre de forma assíncrona para o aplicativo cliente. Caso contrário , IXPLogon::FlushQueues funciona de forma síncrona com o spooler MAPI.
Por motivos de desempenho, o spooler MAPI só chamará o método FlushQueues de um provedor de transporte se os sinalizadores STATUS_INBOUND_FLUSH e STATUS_OUTBOUND_FLUSH forem definidos na linha status do provedor de transporte. Consequentemente, um provedor de transporte pode interromper a operação FlushQueues a qualquer momento limpando os sinalizadores STATUS_OUTBOUND_FLUSH e STATUS_INBOUND_FLUSH em sua linha status. Se o spooler MAPI estiver sendo desligado e precisar encerrar a operação FlushQueues , ele chamará TransportNotify com o conjunto de sinalizadores NOTIFY_END_INBOUND_FLUSH e NOTIFY_END_OUTBOUND_FLUSH. O provedor de transporte deve liberar todos os recursos externos e retornar.