Dae galera, eu estou estudando um pouco sobre Threads e sincronização e me ocorreu a seguinte dúvida:
Como eu faço para sincronizar objetos de negócio utilizando por exemplo os Managed Bean do jsf ou o próprio Servlet?
Exemplo com Managed Bean:
[code]// Managed Bean com escopo de request
public class ContaMB implements Serializable {
private ContaService service = new ContaService();
private Conta conta;
public String debitar() {
FacesContext context = // Recupera o usuário logado por exemplo
Usuario usuario = context....
this.service.debitar( this.getConta().getValor(), usuario.getCodUsuario());
return null;
}
}[/code]
[code]// Service da conta
public class ContaService {
private RepositorioConta repositorio = null;
public void debitar( double valorADebitar, int codigoUsuario ) throws Exception {
// Verifica o usuario ....
// Verifica saldo atual
double saldoAtual = this.getSaldoAtual(codigoUsuario);
// Verifica se pode debitar da conta
if( saldoAtual > valorADebitar) {
repositorio.debita(valorADebitar, codigoUsuario);
} else {
throw new Exception("Saldo Insuficiente");
}
}
}[/code]
Como poderei sincronizar por exemplo o meu método debitar da classe ContaService sendo que cada requisição é uma Thread e consequentemente um novo objeto?
Assim funciona?:
[code]public class ContaService {
private RepositorioConta repositorio = null;
// Foi colocado o synchronized
public synchronized void debitar( double valorADebitar, int codigoUsuario ) throws Exception {
// Verifica o usuario ....
// Verifica saldo atual
double saldoAtual = this.getSaldoAtual(codigoUsuario);
// Verifica se pode debitar da conta
if( saldoAtual > valorADebitar) {
repositorio.debita(valorADebitar, codigoUsuario);
} else {
throw new Exception("Saldo Insuficiente");
}
}
}[/code]
A questão aqui é que cada requisição cria uma classe do ManagedBean e também do service, eu quero por exemplo conseguir evitar que outro browser logado com meu usuário consiga fazer o débito de forma que os dados fiquem inconsistentes.
Ah… desculpem algum erro no código, é que escrevi direto aqui no guj.
Abraço e valeu pela ajuda.