Duvidas referente a RMI e JAX-WS

Boa tarde,

Estou com um problema e gostaria de algumas idéias…

Tenho um trabalho de sistemas distribuidos e não to conseguindo nem começar(na veradade comecei a parte menos importante :frowning: ). É o seguinte:

Tenho que fazer um sisteminha para uma empresa que tem algumas filiais que fazem algumas operações (CRUD basicamente), o trabalho é deixar com que continuem funcionando como antes (localmente) mas que tenham operações que possam ser feitas entre filiais, tipo pesquisar coisas em outra filial, tenho que usar JAX-WS e RMI, só que vi a teoria e quase não tive prática, e agora to meio perdido…
Fiz a parte dos cadastros tudo ok(a parte que eu ja saiba:) ) mas não sei por onde começar a parte de RMI e Webservice, o que fica no webservice, o que fica na filial, como manterei atualizadas as informações para que após uma cadastrar algo eu ja possa ver em outra filial… Pode ser tudo em localhost, apenas com varios programas rodando simulando uma filial cada…

Se puderem me dar uma luz agradeço muito, vi alguns tutoriais na internet, mas não ajudou muito, tipo vi uns exemplinhos de fazer um metodo para somar 2 numeros, mas não sei como enviar novamente respostas para que de outra filial eu possa capturar…

ps. não quero o trabalho pronto:) se possível apenas o caminho pra que eu chegue lá, os passos que devo seguir por exemplo…

Grato,
Jeferson Neves

Ola, pelo que entendi cada filial terá sua própria base de dados, então para que haja consistencia nos dados, terás que sincronizar com uma base central, para não ficar sincronizando a cada operação terias que usar uma espécie de cache que voce mesmo teria que elaborar no seu sistema. Esta é uma questão bem complexa de se tratar, muitas empresas enfrentam problemas com isso, pense bem antes de entrar nessa.
Já trabalhei muito com webservice, se todas empresas terão um acesso a internet eu recomendaria fazer apenas pelo webservice com apenas uma base central para todas empresas, pois em questão de performance não vai ficar muito atras. Mas ai ja não sei como lhe foi solicitado que faça, já que é para a disciplina. o unico ponto ruim de mudar para uma so base remota seria quando as empresas ficarem sem internet, nenhuma mais acessaria os dados do sistema, ai sim é interessante usar outro banco como cache…

Eu só não consegui compreender qual o motivo de você ter que usar Web Service e RMI. Podes informar ?
E já adianto que pensar em um banco de dados distribuídos é bem mais complexo do que parece. Se cada filial tiver independência em seus dados e apenas tiver de enviar informações a matriz quando a mesma solicitar, é bem simples, caso contrário, precisas pensar com bastante calma. Outro detalhe, com Web Service consegue colocar essa comunicação com HTTPS e certificado digital, o que eu diria que é bem importante.

[quote=nel]Eu só não consegui compreender qual o motivo de você ter que usar Web Service e RMI. Podes informar ?
E já adianto que pensar em um banco de dados distribuídos é bem mais complexo do que parece. Se cada filial tiver independência em seus dados e apenas tiver de enviar informações a matriz quando a mesma solicitar, é bem simples, caso contrário, precisas pensar com bastante calma. Outro detalhe, com Web Service consegue colocar essa comunicação com HTTPS e certificado digital, o que eu diria que é bem importante.[/quote]

Boa tarde,

Preciso que seja isso, pois é um trabalho acadêmico, vi mais ou menos a teoria e agora tenho que fazer tudo isso (pra mim é bastante, pois vi poucos exemplos em aula :)) e nem foram webservice, os exemplos (com algum código funcionando) foram de Sockets, RMI e webservice foi só uns ppt mesmo :slight_smile:

Não precisa de base de dados, é só pra funcionar, pode ser com tudo em memória mesmo, é pra ver se conseguimos fazer as conexões enviar e receber informações entre elas… pode até ser na mesma máquina, localhost (acredito que seria vários programas executando juntos se comunicando… como se fossem máquinas distintas)

Depois que fechar o programa pode perder tudo :)… mas terei que apresentar pra todos na aula :frowning: isso funcionando…

Grato.

[quote=jefers0n][quote=nel]Eu só não consegui compreender qual o motivo de você ter que usar Web Service e RMI. Podes informar ?
E já adianto que pensar em um banco de dados distribuídos é bem mais complexo do que parece. Se cada filial tiver independência em seus dados e apenas tiver de enviar informações a matriz quando a mesma solicitar, é bem simples, caso contrário, precisas pensar com bastante calma. Outro detalhe, com Web Service consegue colocar essa comunicação com HTTPS e certificado digital, o que eu diria que é bem importante.[/quote]

Boa tarde,

Preciso que seja isso, pois é um trabalho acadêmico, vi mais ou menos a teoria e agora tenho que fazer tudo isso (pra mim é bastante, pois vi poucos exemplos em aula :)) e nem foram webservice, os exemplos (com algum código funcionando) foram de Sockets, RMI e webservice foi só uns ppt mesmo :slight_smile:

Não precisa de base de dados, é só pra funcionar, pode ser com tudo em memória mesmo, é pra ver se conseguimos fazer as conexões enviar e receber informações entre elas… pode até ser na mesma máquina, localhost (acredito que seria vários programas executando juntos se comunicando… como se fossem máquinas distintas)

Depois que fechar o programa pode perder tudo :)… mas terei que apresentar pra todos na aula :frowning: isso funcionando…

Grato.[/quote]

Entendo. Minha recomendação é que você inicie os estudos por Web Service. A partir do Java 6 tornou-se bem simples a criação e não precisa ter um container web ou servidor de aplicação para subir um WS. Exemplo na Caelum.

Sobre o RMI, aqui no GUJ mesmo tem um exemplo, segue: http://www.guj.com.br/articles/37

Eu disse para começar pelo WS porque acho mais simples, mas é uma opinião minha.

[quote]
Entendo. Minha recomendação é que você inicie os estudos por Web Service. A partir do Java 6 tornou-se bem simples a criação e não precisa ter um container web ou servidor de aplicação para subir um WS. Exemplo na Caelum.

Sobre o RMI, aqui no GUJ mesmo tem um exemplo, segue: http://www.guj.com.br/articles/37

Eu disse para começar pelo WS porque acho mais simples, mas é uma opinião minha.[/quote]

Grato… Irei começar qdo chegar em casa…

Abraço

[quote=jefers0n][quote]
Entendo. Minha recomendação é que você inicie os estudos por Web Service. A partir do Java 6 tornou-se bem simples a criação e não precisa ter um container web ou servidor de aplicação para subir um WS. Exemplo na Caelum.

Sobre o RMI, aqui no GUJ mesmo tem um exemplo, segue: http://www.guj.com.br/articles/37

Eu disse para começar pelo WS porque acho mais simples, mas é uma opinião minha.[/quote]

Grato… Irei começar qdo chegar em casa…

Abraço[/quote]

Grato pela dica,

Dei uma estudada e fiz uns tutoriais, o que entendi melhor e consegui fazer funcionar foi esse (http://netbeans.org/kb/docs/websvc/jax-ws.html)…

Mas fiquei com uma dúvida agora. É o seguinte:

Nos exemplos eu só tinha um método e uma classe, com as respectivas anotação(@WebMethod(operationName = “meu método”) e @WebService()) .

Porém preciso de um WebService que vai ter umas 5 classes e cada classe com vários métodos… Eu criei primeiro um cliente para o serviço web para cada classe colocando a anotação @WebService() na classe e @WebMethod(operationName = “meu método”) para cada método… não deu erro, mas daí na hora de criar o cliente que irá usar os métodos eu teria que criar um para cada serviço… mas preciso que meu cliente(apenas um) acesse todos os serviços. Então criei um serviço e coloquei mais ou menos assim:

@WebService()
public class ABC{
    int     id;
   // demais atribs...

    public ABC(int id, ...) {
        this.id = id;
        ...

    }
    @WebMethod(operationName = "getId")
    public String getId() { return id; }

    @WebMethod(operationName = "outroMetodo")
    public void outroMetodo() {return abc; }
    //demais métodos

@WebService()
public class DEF{
    int     id;
   // demais atribs...

    public DEF(int id, ...) {
        this.id = id;
        ...

    }
    @WebMethod(operationName = "getId")
    public String getId() { return id; }

    //demais métodos

    ...

Mas da erro na anotação da segunda classe, acho que não posso ter várias classes dentro de um único serviço… mas então como resolvo este problema, pois preciso criar um cliente que consumirá o serviço (e se eu tiver vários serviços diferentes não sei como fazer, pois no tutorial eu criei um cliente pra um serviço…)

Espero que entendam o que tenteui explicar :slight_smile:

Abraço,

[quote=jefers0n][quote=jefers0n][quote]
Entendo. Minha recomendação é que você inicie os estudos por Web Service. A partir do Java 6 tornou-se bem simples a criação e não precisa ter um container web ou servidor de aplicação para subir um WS. Exemplo na Caelum.

Sobre o RMI, aqui no GUJ mesmo tem um exemplo, segue: http://www.guj.com.br/articles/37

Eu disse para começar pelo WS porque acho mais simples, mas é uma opinião minha.[/quote]

Grato… Irei começar qdo chegar em casa…

Abraço[/quote]

Grato pela dica,

Dei uma estudada e fiz uns tutoriais, o que entendi melhor e consegui fazer funcionar foi esse (http://netbeans.org/kb/docs/websvc/jax-ws.html)…

Mas fiquei com uma dúvida agora. É o seguinte:

Nos exemplos eu só tinha um método e uma classe, com as respectivas anotação(@WebMethod(operationName = “meu método”) e @WebService()) .

Porém preciso de um WebService que vai ter umas 5 classes e cada classe com vários métodos… Eu criei primeiro um cliente para o serviço web para cada classe colocando a anotação @WebService() na classe e @WebMethod(operationName = “meu método”) para cada método… não deu erro, mas daí na hora de criar o cliente que irá usar os métodos eu teria que criar um para cada serviço… mas preciso que meu cliente(apenas um) acesse todos os serviços. Então criei um serviço e coloquei mais ou menos assim:

@WebService()
public class ABC{
    int     id;
   // demais atribs...

    public ABC(int id, ...) {
        this.id = id;
        ...

    }
    @WebMethod(operationName = "getId")
    public String getId() { return id; }

    @WebMethod(operationName = "outroMetodo")
    public void outroMetodo() {return abc; }
    //demais métodos

@WebService()
public class DEF{
    int     id;
   // demais atribs...

    public DEF(int id, ...) {
        this.id = id;
        ...

    }
    @WebMethod(operationName = "getId")
    public String getId() { return id; }

    //demais métodos

    ...

Mas da erro na anotação da segunda classe, acho que não posso ter várias classes dentro de um único serviço… mas então como resolvo este problema, pois preciso criar um cliente que consumirá o serviço (e se eu tiver vários serviços diferentes não sei como fazer, pois no tutorial eu criei um cliente pra um serviço…)

Espero que entendam o que tenteui explicar :slight_smile:

Abraço,
[/quote]

Sim, cada classe com a anotação @WebService (senão vai preencher nada no parenteses, não o use) é considerado um serviço Web, todavia, não é possível utilizar em uma classe interna. Se queres um único cliente e que o mesmo tenha acesso a tudo, centralize todos os teus serviços no seu webservice, em um único. Crie todos os métodos necessários nele e depois gere o cliente. Isso não resolve ?

[quote=nel]
Sim, cada classe com a anotação @WebService (senão vai preencher nada no parenteses, não o use) é considerado um serviço Web, todavia, não é possível utilizar em uma classe interna. Se queres um único cliente e que o mesmo tenha acesso a tudo, centralize todos os teus serviços no seu webservice, em um único. Crie todos os métodos necessários nele e depois gere o cliente. Isso não resolve ?[/quote]

Acho que talvez eu não tenha entendido bem então, mas vamos lá:

Eu pretendia criar um unico WS, mas a situação é a seguinte: tenho por exemplo uma classe cliente, uma produto e uma gerente… achei que cada uma teria que ser um serviço… pois no cliente tenho que poder cadastrar produtos, clientes, gerentes… e fazer alguns controles… por exemplo quantidade de vendas por filial, gerente com mais vendas etc…

O que tentei fazer foi criar um serviço com todas classes dentro… do modo que exemplifiquei no post anterior. Antes disso tinha criado um serviço para o cliente, um para o gerente, outro para o produto… mas como o meu cliente(aplicação cliente) vai precisar de acesso a todos (classes cliente, produto e gerente) achei que tinha que ser tudo em um.

Sei que deve ser simples e eu que estou confundindo, como o conceito qeu levei um tempinho pra assimilçar :(… Mas se puder me exemplificar ou explicar como poderia fazer agradeço.

Até +.

[quote=jefers0n][quote=nel]
Sim, cada classe com a anotação @WebService (senão vai preencher nada no parenteses, não o use) é considerado um serviço Web, todavia, não é possível utilizar em uma classe interna. Se queres um único cliente e que o mesmo tenha acesso a tudo, centralize todos os teus serviços no seu webservice, em um único. Crie todos os métodos necessários nele e depois gere o cliente. Isso não resolve ?[/quote]

Acho que talvez eu não tenha entendido bem então, mas vamos lá:

Eu pretendia criar um unico WS, mas a situação é a seguinte: tenho por exemplo uma classe cliente, uma produto e uma gerente… achei que cada uma teria que ser um serviço… pois no cliente tenho que poder cadastrar produtos, clientes, gerentes… e fazer alguns controles… por exemplo quantidade de vendas por filial, gerente com mais vendas etc…

O que tentei fazer foi criar um serviço com todas classes dentro… do modo que exemplifiquei no post anterior. Antes disso tinha criado um serviço para o cliente, um para o gerente, outro para o produto… mas como o meu cliente(aplicação cliente) vai precisar de acesso a todos (classes cliente, produto e gerente) achei que tinha que ser tudo em um.

Sei que deve ser simples e eu que estou confundindo, como o conceito qeu levei um tempinho pra assimilçar :(… Mas se puder me exemplificar ou explicar como poderia fazer agradeço.

Até +.
[/quote]

Vamos lá. Quando você cria uma classe com a anotação @WebService você está dizendo que aquela classe passa a ser um Web Service, meio óbvio, não ? A partir de agora, quando essa classe for publicada ela passa a possuir uma interface, conhecida como WSDL. Esse serviço web terá vários recursos disponíveis, ou, métodos. Todos os métodos publicos dentro dessa classe passam a estarem disponíveis automaticamente, dispensando o uso do @WebMethod (recomendo, que mesmo assim, use essa anotação!).

Cada método pode ter o que você quiser, sendo assim, tu pode centralizar o que tu precisa na mesma classe e trabalhar com objetos distintos, como vou demonstrar abaixo:

[code]@WebService
public class ServicoDeCadastro {

@WebMethod(operationName = "cadastraDiretor")
public Boolean cadastraDiretor(Diretor diretor) {...}

@WebMethod(operationName = "cadastraGerente")
public Boolean cadastraGerente(Gerente gerente) {...}

}[/code]

Pode adicionar cadastro de funcionário e quais outros métodos. Se quiser colocar buscas ali, como “buscaGerentePorId(Long id)” podes trocar o nome do webservice, até porque, ServicoDeCadastro com busca não é muito coerente, mas entendeu a ideia? Podes adicionar quaisquer objeto aos teus métodos e trabalhar com eles da forma que julgar correto.
}

[quote=nel]
Vamos lá. Quando você cria uma classe com a anotação @WebService você está dizendo que aquela classe passa a ser um Web Service, meio óbvio, não ? A partir de agora, quando essa classe for publicada ela passa a possuir uma interface, conhecida como WSDL. Esse serviço web terá vários recursos disponíveis, ou, métodos. Todos os métodos publicos dentro dessa classe passam a estarem disponíveis automaticamente, dispensando o uso do @WebMethod (recomendo, que mesmo assim, use essa anotação!).

Cada método pode ter o que você quiser, sendo assim, tu pode centralizar o que tu precisa na mesma classe e trabalhar com objetos distintos, como vou demonstrar abaixo:

[code]@WebService
public class ServicoDeCadastro {

@WebMethod(operationName = "cadastraDiretor")
public Boolean cadastraDiretor(Diretor diretor) {...}

@WebMethod(operationName = "cadastraGerente")
public Boolean cadastraGerente(Gerente gerente) {...}

}[/code]

Pode adicionar cadastro de funcionário e quais outros métodos. Se quiser colocar buscas ali, como “buscaGerentePorId(Long id)” podes trocar o nome do webservice, até porque, ServicoDeCadastro com busca não é muito coerente, mas entendeu a ideia? Podes adicionar quaisquer objeto aos teus métodos e trabalhar com eles da forma que julgar correto.
}[/quote]

Sem querer ser chato, mas essa parte eu tinha entendido, consegui fazer funcionar os exemplos, coloquei a anotação dos métodos em todos eles etc…

O que não sei é:

Por exemplo, como mostraste acima, posso ter vários métodos naquela classe ServicoDeCadastro, mas o que quero saber é onde fica a classe Gerente, Diretor e outras mais que eu possa precisar , pois no método cadastraGerente(Gerente gerente) por exemplo, Gerente é uma classe e no outro método Diretor é outra classe… Se eu colocá-las(com seus construtores e tudo mais…) dentro da classe ServicoDeCadastro (da erro pois, obvio :slight_smile: ), ou logo abaixo dela com a anotação @WebService também da erro…

Não sei se me expressei bem, mas é ± isso que preciso saber, onde colocar todas as classes que tenho para que eu possa consumir depois de um cliente (que será desktop/swing), mas lembrando que pode ser tudo em memória, sem bd… só pra funcionar enquanto tiver rodando… :slight_smile:

Grato,

[quote=jefers0n][quote=nel]
Vamos lá. Quando você cria uma classe com a anotação @WebService você está dizendo que aquela classe passa a ser um Web Service, meio óbvio, não ? A partir de agora, quando essa classe for publicada ela passa a possuir uma interface, conhecida como WSDL. Esse serviço web terá vários recursos disponíveis, ou, métodos. Todos os métodos publicos dentro dessa classe passam a estarem disponíveis automaticamente, dispensando o uso do @WebMethod (recomendo, que mesmo assim, use essa anotação!).

Cada método pode ter o que você quiser, sendo assim, tu pode centralizar o que tu precisa na mesma classe e trabalhar com objetos distintos, como vou demonstrar abaixo:

[code]@WebService
public class ServicoDeCadastro {

@WebMethod(operationName = "cadastraDiretor")
public Boolean cadastraDiretor(Diretor diretor) {...}

@WebMethod(operationName = "cadastraGerente")
public Boolean cadastraGerente(Gerente gerente) {...}

}[/code]

Pode adicionar cadastro de funcionário e quais outros métodos. Se quiser colocar buscas ali, como “buscaGerentePorId(Long id)” podes trocar o nome do webservice, até porque, ServicoDeCadastro com busca não é muito coerente, mas entendeu a ideia? Podes adicionar quaisquer objeto aos teus métodos e trabalhar com eles da forma que julgar correto.
}[/quote]

Sem querer ser chato, mas essa parte eu tinha entendido, consegui fazer funcionar os exemplos, coloquei a anotação dos métodos em todos eles etc…

O que não sei é:

Por exemplo, como mostraste acima, posso ter vários métodos naquela classe ServicoDeCadastro, mas o que quero saber é onde fica a classe Gerente, Diretor e outras mais que eu possa precisar , pois no método cadastraGerente(Gerente gerente) por exemplo, Gerente é uma classe e no outro método Diretor é outra classe… Se eu colocá-las(com seus construtores e tudo mais…) dentro da classe ServicoDeCadastro (da erro pois, obvio :slight_smile: ), ou logo abaixo dela com a anotação @WebService também da erro…

Não sei se me expressei bem, mas é ± isso que preciso saber, onde colocar todas as classes que tenho para que eu possa consumir depois de um cliente (que será desktop/swing), mas lembrando que pode ser tudo em memória, sem bd… só pra funcionar enquanto tiver rodando… :slight_smile:

Grato,

[/quote]

Acho que entendi, me corrija se estiver errado:

Eu vou ter várias classes (as que eu preciso) e vou criar mais uma pra ser o serviço que vai ter as anotações e que nada mais é que uma classe com vários métodos(que usam as outras classes do projeto…) daí qdo for criar o cliente que consumirá o serviço eu “linco” a esta classe com os métodos de todas as classes… não sei se não to viajando :slight_smile:

Até +

É simples. Você pode ter N WebServices, cada WebService será uma classe com a anotação @WebService ok ?
Suponha que tu queira um WebService exclusivo para cadastros, como citei. Nesse caso, pode ter todos os objetos que tu precisa nesse WebService.

Depois, é só gerar o client para esse WebService que você poderá enviar a ele todos os objetos, sejam eles quais forem.
Obviamente, nesse WebService você pode fazer o que quiser. Podes pegar o objeto passado e enviar ao DAO, por exemplo.
Fui mais claro ?