Um nó TimeoutControl é associado a um nó TimeoutNotification, sendo ambos os nós configurados com o mesmo Identificador. A amostra ControlledTimeout mostra que mais de um nó TimeoutControl pode ser associado a um nó TimeoutNotification. Esse cenário significa que é possível atualizar ou cancelar pedidos de tempo limite processados através de um nó TimeoutControl usando qualquer um dos outros nós TimeoutControl associados ao mesmo nó TimeoutNotification.
Se quiser testar esse cenário, o método mais simples é editar os arquivos .mbtest de cancelamento, o que grava os mesmos em outra fila de entrada para que sejam processados por outro nó. Uma opção mais avançada é alterar o campo AllowOverwrite no pedido de tempo limite para TRUE, o que significa que o nó TimeoutControl descarta o pedido de tempo limites atualmente em execução em favor do novo que está sendo recebido (conforme correspondido pela tag Identificador no pedido de tempo limite em si). Você também pode criar novas mensagens de pedido de tempo limite com diferentes identificadores de tempo limite para testar o processamento de vários tempos limites simultâneos.
Na amostra, o pedido de tempo limite fica contido no corpo da mensagem. É possível que seja passado em qualquer parte da árvore de mensagens e, a menos que informado o contrário no tempo de configuração, o nó TimeoutControl procura no ambiente local por ele. Para usar esse comportamento, um nó Compute deve ser incluído em algum lugar antes do nó TimeoutControl para incluir essas informações, conforme mostrado por esta ESQL, que também mostra como é possível configurar o Identificador de tempo limite para dinâmico e evitar conflitos:
CREATE COMPUTE MODULE Timeout_Set
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
SET OutputLocalEnvironment.TimeoutRequest.Action = 'SET';
SET OutputLocalEnvironment.TimeoutRequest.Identifier = OutputRoot.XMLNSC.Data.UniqueId;
SET OutputLocalEnvironment.TimeoutRequest.StartDate = 'TODAY';
SET OutputLocalEnvironment.TimeoutRequest.StartTime = 'NOW';
SET OutputLocalEnvironment.TimeoutRequest.Count = 10;
SET OutputLocalEnvironment.TimeoutRequest.Interval = 5;
RETURN TRUE;
END;
END MODULE;
Não se esqueça de configurar seu nó Compute para Pass Message and LocalEnvironment. Deve-se, então, alterar seu nó TimeoutControl para ter um Local de Pedido em branco, se tiver sido alterado do valor padrão:
Este ESQL mostra como configurar um tempo limite único para 60 segundos no futuro, gerando um tempo relativo:
CREATE COMPUTE MODULE UT_CONTROL_TIMEOUT_10
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
DECLARE jump INTERVAL;
SET jump = INTERVAL '60' SECOND;
DECLARE start TIME;
SET start = CURRENT_TIME + jump;
SET OutputLocalEnvironment.TimeoutRequest.Action = 'SET';
SET OutputLocalEnvironment.TimeoutRequest.Identifier = 'control';
SET OutputLocalEnvironment.TimeoutRequest.StartDate = 'TODAY';
SET OutputLocalEnvironment.TimeoutRequest.StartTime = start;
RETURN TRUE;
END;
END MODULE;