Bom dia galera!
Estou com a missão de continuar um sistema aqui da empresa que foi parado pois o funcionário antigo saiu e ninguém fez mais conta, e agora está em minhas mãos.
É um sistema de dados da empresa, feito com swing e vai ser usado por diversos clientes(outros setores, administrativo, marketing etc).
O problema que estou no momento é deixar ele concorrente, pois terão diversos clientes acessando ao mesmo tempo o banco de dados. A comunicação distribuída está sendo feita via RMI.
meu cliente da comunicação é esta classe:
public class Client{
private IRemote remote;
public void connectServer(int porta, String server) throws RemoteException, RecordNotFoundException, NotBoundException{
Registry registry = LocateRegistry.getRegistry(server,porta);
setRemote((IRemote) registry.lookup("server"));
}
public void delete(Entidade en){
getRemote.delete(en);
}
public Entidade create(Entidade en){
return getRemote.create(en);
}
//getters ands setters IRemote
minha classe servidor que recebe a chamada e chama o DAO pra executar no banco.
//IRemote é uma Interface que extends Remote
public class Remote implements IRemote {
private Dao dao;
private Registry registry;
public void connect(int porta) throws RemoteException {
try {
IRemote server = (IRemote)
UnicastRemoteObject.exportObject(this,0);
setRegistry(LocateRegistry.createRegistry(porta));
getRegistry().rebind("server", server);
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void delete(Entidade en){
dao.delete(en);
}
public Entidade create(Entidade en){
return dao.create(en);
}
agora desse jeito ele responde as chamadas, mas não está thread-safe obviamente, pois não usei thread em nada.
pensei no server fazer isso:
public class Remote implements IRemote extends Thread{
private Dao dao;
private Registry registry;
private Entidade en;
//getters and setters
public void run(){
while(true){
// this.delete() ou this. crete ou qualquer outro
// um dos problemas é como vou saber qual dos métodos abaixo foi invocado
// e chamar ele daqui do run()
}
}
public void connect(int porta) throws RemoteException {
//codigo connect acima
}
public void delete(){
dao.delete(this.en);
}
public Entidade create(){
return dao.create(this.en);
}
meus métodos na Dao estão todos preparados com syncronized para a concorreência.
entenderam meu problema ? não estou conseguindo implementar uma maneira boa de fazer essa concorrência funcionar.
Sugestões?