Por uma série de restrições no ambiente que nossa aplicação está rodando vamos precisar persistir as mensagens (JMS) em disco.
A idéia é que o MDB vai ler as respostas da fila de retorno, gravá-las em arquivos texto (uma mensagem por arquivo??) e um WS vai ser chamado pelo cliente perguntando se existem respostas para serem enviadas.
A idéia é que eu teria um classe que verificaria todos os arquivos de mensagens, criaria uma array com as mensagens e mandaria para o “cara” que chamou o Web Service. Nesse processo eu teria que apagar as mensagens lidas para que outra instância da aplicação não acesse o mesmo arquivo e a resposta seja enviada duas (ou mais) vezes.(A aplicação roda em cluster)
Estou bem preocupado com todo esse problema de concorrência no arquivo texto!
Alguém teria uma sugestão para algo robusto, mesmo que não necessariamente super performático?
OBS: Não posso usar nenhum framework, tem que ser o velho e bom Java 1.4.
Coloque uma thread só procurando por arquivos e um pool consumindo eles.
código pseudo-java-de-quem-não-usa-isso-a-2-anos:
using java.util.concurrent;
ThreadPool pool = new ThreadPool ();
while(true){
for(File f : new File(".").getFiles()) {
if (!f.getName().endsWith("__processing")) {
f.renameTo (f.getName() + "__processing");
pool.queueMoreStuff (new ProcessFile (f));
}
}
}
clas ProcessFile implements Runnable {
File f;
public ProcessFile (File f) { this.f = f;}
public void run() {
MyFileUtilsLalala.DáTrêsPulosEUmaVoltinha (f);
}
}
Se você está usando Java 5 as regras são as seguintes:
-Se está usando threads explicitamente, você deve estar fazendo errado;
-Se está usando locks, você deve estar fazendo errado;
-Se está controlando concorrencia com nome de arquivos ou variaveis, você deve estar fazendo muito errado;
-Pensou denovo e ainda está usando thread, deve estar fazendo besteira mesmo;
-Sério, new Thread() com Java5 deveria lançar um YouAreNotDougLeaException;
-Assim como synchronized/wait deveria lançar um DougLeaNotInTheRoomException
Falo sério, se você não come Java Concurrency in Practice com sucrilhos todo dia no café da manha, não
brinque com isso no trabalho porque não tem graça.
Use algo como Executors.newFixedThreadPool(System.getAvailableProcessors() * COEFICIENTE_DE_ESPERA_IO_E_USO_DE_CPU) e seja feliz. COEFICIENTE_DE_ESPERA_IO_E_USO_DE_CPU pode ser um número entre 2 e ** dependendo da característica da sua carga. Esse vou deixar como
dever de casa para tí.