Criando o gerenciamento de status para um módulo de processamento de arquivos

5

O histórico

Uma das funcionalidades de um produto em que estou trabalhando atualmente é processar um conjunto de arquivos compactados (contendo arquivos XML) que serão disponibilizados periodicamente em um local fixo (local local ou remoto - não importa realmente por enquanto) e despejar o conteúdo de cada arquivo XML em um banco de dados. Eu cuidei do design de um módulo de análise genérico que deveria ser capaz de acomodar a análise de qualquer tipo de arquivo, como eu expliquei na minha pergunta abaixo. Não há necessidade de dar uma olhada no link a seguir para responder à minha pergunta, mas definitivamente forneceria um contexto melhor para o problema

Projeto de analisador de arquivos genéricos em Java usando o padrão de estratégia

O objetivo

Eu quero poder acompanhar o status de cada arquivo XML e o status de cada arquivo compactado que contém os arquivos XML. Eu provavelmente posso ter diferentes status definidos para os arquivos XML, como NOVO, PROCESSANDO, CARREGANDO, COMPLETO ou FALHOU. Eu posso derivar o status de um arquivo compactado com base no status dos arquivos XML dentro do arquivo compactado. Por exemplo, o status do arquivo compactado é COMPLETA se nenhum arquivo XML dentro do arquivo compactado estiver em um estado FAILED ou o status do arquivo compactado for FAILED se o status de pelo menos um arquivo XML dentro do arquivo compactado for FAILED.

Uma possível solução

O modelo

Eu preciso manter o status de cada arquivo XML e o arquivo compactado. Eu terei que definir alguns POJOs para manter as informações sobre um arquivo XML como mostrado abaixo. Observe que não há necessidade de armazenar o status de um arquivo compactado, pois o status de um arquivo compactado pode ser derivado do status de seus arquivos XML.

public class FileInformation {

    private String compressedFileName;
    private String xmlFileName;
    private long lastModifiedDate;
    private int status;

    public FileInformation(final String compressedFileName,
            final String xmlFileName, final long lastModified, final int status) {
        this.compressedFileName = compressedFileName;
        this.xmlFileName = xmlFileName;
        this.lastModifiedDate = lastModified;
        this.status = status;
    }
}

Eu posso então ter uma classe chamada StatusManager que agrega um mapa de instâncias de FileInformation e me fornece o status de um determinado arquivo a qualquer momento no tempo de vida da aplicação, conforme mostrado abaixo:

public class StatusManager {    
    private Map<String,FileInformation> processingMap = new HashMap<String,FileInformation>();  

    public void add(FileInformation fileInformation) {
        fileInformation.setStatus(0); // 0 will indicates that the file is in NEW state. 1 will indicate that the file is in process and so on..
        processingMap.put(fileInformation.getXmlFileName(),fileInformation);
    }

    public void update(String filename,int status) {        
        FileInformation fileInformation = processingMap.get(filename);
        fileInformation.setStatus(status);
    }   

}

Isso cuida do modelo por uma questão de explicação.

Então, qual é a minha pergunta?

Editado após comentários de Loki e resposta de Eric: -

Gostaria de saber se há algum padrão de design existente ao qual posso me referir ao criar um design. Eu também gostaria de saber como devo proceder para projetar as classes de gerenciamento de status.

Estou mais interessado em entender como posso modelar as classes de gerenciamento de status. Não estou interessado em saber como os outros componentes serão atualizados sobre uma mudança de status no momento, como sugerido por Eric.

    
por CKing 26.02.2013 / 15:22
fonte

1 resposta

1

O padrão State é usado para definir o comportamento de um objeto com base em seu estado atual, o que não é realmente adequado para esse problema se eu ler sua pergunta corretamente (embora eu tenha entendido o instinto de olhar para esse padrão). Funcionaria se você tivesse um código como:

if (status.equals("COMPLETED"))
{
    doSomethingForCompleted();
}
else if (status.equals("FAILED"))
{
    doSomethingForFailure();
}
// You get the idea...

Dada a forma como o seu exemplo está configurado, acho que você deseja uma combinação do padrão Observer, como o mosquito sugerido, e o Padrão do mediador , que você já está fazendo bastante com o seu StatusManager. O StatusManager pode notificar seu código com o novo conjunto de status após as chamadas add () ou update ().

    
por 26.02.2013 / 16:15
fonte