Usando o nó DatabaseInput, é possível criar fluxos de mensagens que reagem rapidamente às mudanças nos dados do aplicativo mantidos nos bancos de dados. O nó recupera os dados atualizados diretamente a partir do banco de dados.
O diagrama a seguir mostra a sequência de eventos. Quando uma mudança é introduzida na tabela de dados do aplicativo, um acionador é disparado e a tabela de eventos é preenchida com informações suficientes para determinar quais linhas foram alteradas.
A estrutura das tabelas de dados do aplicativo usada nessa amostra é mostrada no seguinte diagrama:
Por exemplo, se alguma entrada for inserida em uma tabela do cliente, as linhas inseridas nas tabelas do cliente e evento se parecerão com a seguinte tabela.
PKEY | FIRSTNAME | LASTNAME | CCODE |
---|---|---|---|
cust1 | Joe | Bloggs | sales |
A tabela de eventos é uma tabela de banco de dados criada pelo usuário, geralmente no mesmo esquema que a tabela ou tabelas de aplicativo nas quais os eventos devem ser armazenados. A tabela de eventos descreve o tipo da mudança feita para uma tabela de aplicativo e um identificador para a linha alterada. A tabela a seguir mostra algumas colunas típicas em uma tabela de eventos e as razões para incluí-la.
Nome da Coluna | Função da coluna | Valor de exemplo |
---|---|---|
EVENT_ID | Necessário. A chave primária, que identifica qual evento está sendo processado a qualquer momento. | 1 |
OBJECT_KEY | Necessário. O elemento de identificação da linha alterada na tabela de aplicativo, normalmente o elemento da linha na coluna da chave primária. | cust1 |
OBJECT_VERB | Opcional. A mudança executada, normalmente um de CREATE, UPDATE ou DELETE. Esse evento é usado para diferenciar um evento DELETE, porque nesse caso, a tabela de aplicativo não contém nenhuma linha para recuperar quando a mensagem para o fluxo for construída. | CREATE |
OBJECT_NAME | Opcional. O nome da tabela de aplicativo que foi alterada. Essa coluna será necessária se o nó DatabaseInput estiver sendo usado para suportar as atualizações para mais de uma tabela de Aplicativo. | customer |
EVENT_PRIORITY | Opcional. A prioridade do evento, por exemplo, se pode ser usado para assegurar que as transações de alta prioridade são calculadas antes do valor inferior. | 1 |
EVENT_TIME | Opcional. A hora na qual a operação foi executada. Geralmente, usado para efetuar login ou para executar monitoramento de criação de log ou de desempenho do fluxo. | 2010-10-19T17:10:00 |
EVENT_STATUS | Opcional. Usado para determinar se o evento já foi processado. Necessário se os eventos não tiverem que ser excluídos ou arquivados após o processamento. | 0 |
EVENT_COMMENT | Opcional. Campo de formato livre, por exemplo, que pode ser usado para armazenar o resultado do processamento de mensagens se o evento não foi excluído após o processamento. | Processado com exceções |
Nota:
No exemplo a seguir, a tabela de eventos é muito básica, com apenas três colunas. Uma adição à tabela de aplicativos resulta na seguinte nova linha na tabela de eventos:
EVENT_ID | OBJECT_KEY | OBJECT_VERB |
---|---|---|
1 | cust1 | Criar |
Um novo cliente foi criado com a chave primária cust1. O nó DatabaseInput responde à mudança e processa a nova linha em um fluxo de mensagens.
Quando o fluxo concluir o processamento de um evento, uma das três formas é usada para concluir o processamento:
Essa amostra usa a primeira opção e exclui os eventos na conclusão com sucesso.
Os detalhes do fluxo de mensagens e o processamento que ele desempenha são mostrados nas seções a seguir:
O fluxo de mensagens DatabaseInput usa as mudanças no banco de dados, as mapeia para um formato de mensagem de saída e coloca-as em uma fila do WebSphere MQ:
Note que o fluxo inclui um segundo nó MQOutput para capturar exceções que podem ter ocorridas. Essa ação evita novas tentativas e processamento repetitivo desnecessários de ESQL malformado ou de um banco de dados ou de tabela configurado incorretamente.
Três scripts SQL são usados nesta amostra:
INSERT INTO DBINPUT_CUSTOMER VALUES ('cust1', 'Fred', 'Flintstone', 'Dev');
UPDATE DBINPUT_CUSTOMER SET FIRSTNAME = 'Barney', LASTNAME = 'Rubble' WHERE PKEY='cust1';
DELETE FROM DBINPUT_CUSTOMER WHERE PKEY='cust1';