Dúvida sobre Classe 'ouvinte'

Opa :smiley:

Preciso criar uma classe que seria tipo um servlet, mas teria a diferença que ela seria chamada toda vez que determinada ação fosse executada ao invés de uma url.

Estou com dúvidas de como seria uma maneira legal de implementar ela e a maneira que eu to pensando, é criar uma classe singleton e chamar através de:

//demais açoes
singleton.getInstance().metodo(objeto);

Isso é uma boa solução? Alguém tem alguma outra maneira de implementar isso?

[]'s

Dá uma pesquisada sobre o padrao Observer. Se você quer desacoplar o seu “ouvinte”, vai ser bem melhor do que usar Singleton.

Pesquisei o padrão mas não sei se ele vai me ajudar mais que um Singleton. Fiquei com dúvidas em algumas definições dele e se bobiar, vou me perder pq não saquei direito o lance de observable e me complicou mais pq meu ManagedBean que teria que ser o Observable e isso atrapalhou meu raciocínio. Hehe

Acho que o Singleton iria cair melhor pq a cada cadastro feito, eu iria buscar o profissional adequado para o cadastro e mandar uma notificação. Seria algo como:

dao.save(object);
Singleton.getInstance().buscarProfissional(object);

Supondo que não encontre, iria rodar o comando novamente depois de um tempo até ele ter o status alterado no banco. É uma solução legal essa?

Vamos lá:

No seu cadastro, crie algo como:

private Set<OuvinteCadastro> ouvintes = new HashSet<OuvinteCadastro>();

public void addOuvinte(OuvinteCadastro novoOuvinte){
	ouvintes.add(novoOuvinte);
}

private void notificaProfissionalModificado(Profissional profissional){
	for(OuvinteCadastro ouvinte: ouvintes){
		ouvinte.profissionalModificado(profissional);
	}
}

Daí no seu método, ao invés de chamar um Singleton, você apenas notifica os ouvintes:

	...
	dao.save(profissional);
	notificaProfissionalModificado(profissional);
	...

OuvinteCadastro é uma somente uma interface, que pode ser implementada para fazer qualquer coisa relacionada ao evento:

public interface OuvinteCadastro{
	public void profissionalModificado(Profissional profissional);
}

Deste modo você pode ter múltiplos ouvintes sem modificar o cadastro, e este também não precisa conhecer o que cada ouvinte vai fazer quando for notificado.
O que acha?

É uma solução legal essa, gostei :smiley:

Mas ai surgem as dúvidas. Tenho um DAO, JavaBean e o ManagedBean ( JSF ). No caso, o usuário clica para salvar, ai chama meu método:

ProfissionalDAO dao = new ProfissionalDAO(ProfissionalBean.class);
logger.info("Cadastrar Profissional para Empresa de ID: " + getFuncionarioBean().getEmpresa().getId() + " | CPF do Funcionario Responsavel: " + getFuncionarioBean().getCPF());
dao.save(getProfissionalBean());

Isso seria dentro do ManagedBean, com o Observer, eu iria fazer o save() e depois chamar o notificaProfissionalModificado(profissional);, correto?

Primeira dúvida: esse notificaProfissionalModificado é um método, mas ele não deveria ter alguma espécia de Observer?

Segunda dúvida: pelo o que eu entendi, eu preciso implementar o Observable em alguma classe minha e teria que ser no ManagedBean pq é ele que tem o método que chama o salvar, to certo? Mas isso não seria legal pq vou ficar muito preso ao JSF. Pensei em criar uma terceira classe que implementasse o Observable, é uma prática melhor?

Essa interface, eu implemento ela juntamente com algumas das interfaces do Observer?

Obg

[]'s

[quote=davidpadilha]É uma solução legal essa, gostei :smiley:

Primeira dúvida: esse notificaProfissionalModificado é um método, mas ele não deveria ter alguma espécia de Observer?

[/quote]
Pelo que entendi do seu caso você não precisa de mais classes. Só o esquema de ouve/notifica já deve ser suficiente.

Você tem que implementar a interface OuvinteCadastro para executar alguma ação quando o profissional é modificado, e além desta classe, não vejo necessidade de mais classes. O seu managed bean pode ser configurado com múltiplos observers sem modificar sua implementacao (talvez direto no XML de configuração?), e acho que isso já te dará bastante flexibilidade, não?

Boa s4nchez

Acabei de implementar o que vc fez e, acho que, consegui entender.

Criei a interface CadastroListener e depois implementei ela numa classe isolada, a ProfissionalListener. Nessa nova classe, tem o método profissionalCadastrado(Profissional profissional) e este método cria uma Thread e inicializa minha outra classe que implementa Runnable para poder buscar o que for necessário.

O meu Set ficou parecido com o seu, e pelo o que entendi, eu posso adicionar vários listeners e ir chamando os métodos conforme a necessidade né?

Ex.:

ProfissionalListener profissionalListener =  new ProfissionalListener();
listeners.add(profissionalListener );
notificaProfissionalCadastrada(profissional);

Eu estava com uma grande dúvida pq nesse exemplo seu, nada implementava a Observer ou a Observable, ai eu fiquei perdido :frowning: hehe …

Acho que não tem mto a ver com o tópico, mas vamos lá…tem como eu ter um método que é chamado a cada intervalo de tempo dentro de uma observer?

[]'s