Compartilhar objetos, há alguma maneira?

Olá pessoal.

Tenho um problemão aqui e estou há dias tentando resolver sem sucesso.

Tenho uma aplicação cliente-servidor baseada em Servlet e JSP que acessa uma porta USB (enviando dados) e uma outra aplicação (Thread) que escuta essa porta consantemente. Para fazer a comunicação com a porta física estou usando uma JNI.

Acontece que quando a aplicação (thread) abre a porta USB, essa abertura é associada a um objeto que foi instanciado para esse fim.

Quando a aplicação (Servlet/JSP) tenta enviar uma informação pela porta, ela já esta aberta associada a um objeto da outra aplicação(Thread). Sendo assim, eu teria de enviar a informação através do objeto que abriu a porta USB, o que eu não estou conseguindo.

Há alguma maneira de compartilhar esse objeto que abriu a porta entre duas aplicações?

Se não, o que eu poderai fazer para resolver esse problema.

Obrigado.

Olá

Uma sugestão:

Descreva tudo de novo porque eu não entendi nada da sua arquitetura.

  1. Não sei o que você imagina ser uma aplicação cliente/servidor

  2. Não sei quem acessa a porta USB é o cliente (sei lá que tipo) ou o servlet

  3. Não sei onde está esta outra aplicação. Na mesma máquina que o cliente? Na máquina do servlet?

  4. O que você chama de porta? É de um socket? É porta USB? O que tem isto a ver com o objeto?

  5. O objeto que quer compartilhar está na mesma aplicação? Em 2 aplicações diferentes/

[]s
Luca

Utilize o padrão singleton, armazene o objeto que abriu a porta em uma variavel static . Você deve observar o sincronismo pois mais de uma Thread pode estar enviando a mensagem ao mesmo tempo. Procure por synchronized ou monitors.

Thread Synchronization and the Java Monitor
http://www.artima.com/insidejvm/ed2/threadsynch.html

Flw

[quote=ecteruel]Olá pessoal.

Tenho um problemão aqui e estou há dias tentando resolver sem sucesso.

Tenho uma aplicação cliente-servidor baseada em Servlet e JSP que acessa uma porta USB (enviando dados) e uma outra aplicação (Thread) que escuta essa porta consantemente. Para fazer a comunicação com a porta física estou usando uma JNI.

Acontece que quando a aplicação (thread) abre a porta USB, essa abertura é associada a um objeto que foi instanciado para esse fim.

Quando a aplicação (Servlet/JSP) tenta enviar uma informação pela porta, ela já esta aberta associada a um objeto da outra aplicação(Thread). Sendo assim, eu teria de enviar a informação através do objeto que abriu a porta USB, o que eu não estou conseguindo.

Há alguma maneira de compartilhar esse objeto que abriu a porta entre duas aplicações?
[/quote]

Sim .

Crie uma classe que implementa a interface javax.servlet.ServletContextListener. Este tipo de classe vc configura no web.xml e o método contextInitialized(ServletContextEvent) corre aquando da inicialização da aplicação 1 unica vez. Dentro desse método vc cria o objeto que comu8nica com o USB e a thread.
Depois vc vai adiconar esse objeto no contexto da aplicação com


private ServletContext ctx;
public void contextInitialized(ServletContextEvent e){
 
     // eu não sei qual é a sua classe tou chamado de ObjetoUSB 
    ObjetoUSB objetoUSB = ... // inicializa
    ctx =  e.getServletContext();
    ctx.setAttribute("objUSB", objetoUSB);

}  

Isto deixa o objeto no contexto da plicação que é acessivel de qualquer página. por exemplo:

 /// dentro de um página jsp
 
 ObjetoUSB objetoUSB = (ObjetoUSB ) application.getAttribute("objUSB");
  

Este código vai retornar o mesmo objeto criado no codigo acima.
E ai vc pode manipulá-lo como quiser. É isso.

P.S. Não chame Thread de aplicação porque confunde. Chame Thread de thread , que todo o mundo entende.

Obrigado pela ajuda.

Vamos lá, vou tentar melhorar a questão.

Tenho um Servlet que recebe uma informação do cliente (página web) e instancia um objeto de uma classe para abrir a porta USB (através de uma JNI) e enviar essa informação.

Acontece que tenho uma Thread que instancia um objeto da mesma classe para abrir a porta USB e escutar essa porta constantemente.

O problema é que quando eu abro a porta USB pelo objeto instanciado pela Thread essa ebertura fica associada a esse objeto. Quando eu vou instanciar o objeto na Servlet para enviar a informação do cliente WEB pela porta, dá um erro dizendo que a porta já está aberta.

Sendo assim, pensei em usar o mesmo objeto instanciado pela Thread para enviar a informação do cliente Web atrvés da Servlet.

Dá para fazer isso?

[quote=Luca]Olá

Uma sugestão:

Descreva tudo de novo porque eu não entendi nada da sua arquitetura.

  1. Não sei o que você imagina ser uma aplicação cliente/servidor

  2. Não sei quem acessa a porta USB é o cliente (sei lá que tipo) ou o servlet

  3. Não sei onde está esta outra aplicação. Na mesma máquina que o cliente? Na máquina do servlet?

  4. O que você chama de porta? É de um socket? É porta USB? O que tem isto a ver com o objeto?

  5. O objeto que quer compartilhar está na mesma aplicação? Em 2 aplicações diferentes/

[]s
Luca

[/quote]

Obrigado.

Vou dar uma olhada nesse material

[quote=fre_d]Utilize o padrão singleton, armazene o objeto que abriu a porta em uma variavel static . Você deve observar o sincronismo pois mais de uma Thread pode estar enviando a mensagem ao mesmo tempo. Procure por synchronized ou monitors.

Thread Synchronization and the Java Monitor
http://www.artima.com/insidejvm/ed2/threadsynch.html

Flw[/quote]

Valeu.

Vou tentar fazer isso.

Obrigado.

[quote=sergiotaborda][quote=ecteruel]Olá pessoal.

Tenho um problemão aqui e estou há dias tentando resolver sem sucesso.

Tenho uma aplicação cliente-servidor baseada em Servlet e JSP que acessa uma porta USB (enviando dados) e uma outra aplicação (Thread) que escuta essa porta consantemente. Para fazer a comunicação com a porta física estou usando uma JNI.

Acontece que quando a aplicação (thread) abre a porta USB, essa abertura é associada a um objeto que foi instanciado para esse fim.

Quando a aplicação (Servlet/JSP) tenta enviar uma informação pela porta, ela já esta aberta associada a um objeto da outra aplicação(Thread). Sendo assim, eu teria de enviar a informação através do objeto que abriu a porta USB, o que eu não estou conseguindo.

Há alguma maneira de compartilhar esse objeto que abriu a porta entre duas aplicações?
[/quote]

Sim .

Crie uma classe que implementa a interface javax.servlet.ServletContextListener. Este tipo de classe vc configura no web.xml e o método contextInitialized(ServletContextEvent) corre aquando da inicialização da aplicação 1 unica vez. Dentro desse método vc cria o objeto que comu8nica com o USB e a thread.
Depois vc vai adiconar esse objeto no contexto da aplicação com


private ServletContext ctx;
public void contextInitialized(ServletContextEvent e){
 
     // eu não sei qual é a sua classe tou chamado de ObjetoUSB 
    ObjetoUSB objetoUSB = ... // inicializa
    ctx =  e.getServletContext();
    ctx.setAttribute("objUSB", objetoUSB);

}  

Isto deixa o objeto no contexto da plicação que é acessivel de qualquer página. por exemplo:

 /// dentro de um página jsp
 
 ObjetoUSB objetoUSB = (ObjetoUSB ) application.getAttribute("objUSB");
  

Este código vai retornar o mesmo objeto criado no codigo acima.
E ai vc pode manipulá-lo como quiser. É isso.

P.S. Não chame Thread de aplicação porque confunde. Chame Thread de thread , que todo o mundo entende. [/quote]

Olá novamente.

Bem, eu entendi o que você explicou, mas tem um problema, são aplicações diferentes rodando paralelamente na minha máquina.

Tenho uma classe principal (com método main) que starta uma thread que instancia um objeto de uma classe que abre a porta USB. Essa Thread fica escutando essa porta.

Tenho um servlet que também precisa de comunicar pela mesma porta USB. Esse servlet precisa usar o objeto instanciado pela Thread já que uma vez aberta a porta USB ela fica presa ao objeto que a abriu.

O que eu posso fazer?

Obrigado.

A outra

[quote=sergiotaborda][quote=ecteruel]Olá pessoal.

Tenho um problemão aqui e estou há dias tentando resolver sem sucesso.

Tenho uma aplicação cliente-servidor baseada em Servlet e JSP que acessa uma porta USB (enviando dados) e uma outra aplicação (Thread) que escuta essa porta consantemente. Para fazer a comunicação com a porta física estou usando uma JNI.

Acontece que quando a aplicação (thread) abre a porta USB, essa abertura é associada a um objeto que foi instanciado para esse fim.

Quando a aplicação (Servlet/JSP) tenta enviar uma informação pela porta, ela já esta aberta associada a um objeto da outra aplicação(Thread). Sendo assim, eu teria de enviar a informação através do objeto que abriu a porta USB, o que eu não estou conseguindo.

Há alguma maneira de compartilhar esse objeto que abriu a porta entre duas aplicações?
[/quote]

Sim .

Crie uma classe que implementa a interface javax.servlet.ServletContextListener. Este tipo de classe vc configura no web.xml e o método contextInitialized(ServletContextEvent) corre aquando da inicialização da aplicação 1 unica vez. Dentro desse método vc cria o objeto que comu8nica com o USB e a thread.
Depois vc vai adiconar esse objeto no contexto da aplicação com


private ServletContext ctx;
public void contextInitialized(ServletContextEvent e){
 
     // eu não sei qual é a sua classe tou chamado de ObjetoUSB 
    ObjetoUSB objetoUSB = ... // inicializa
    ctx =  e.getServletContext();
    ctx.setAttribute("objUSB", objetoUSB);

}  

Isto deixa o objeto no contexto da plicação que é acessivel de qualquer página. por exemplo:

 /// dentro de um página jsp
 
 ObjetoUSB objetoUSB = (ObjetoUSB ) application.getAttribute("objUSB");
  

Este código vai retornar o mesmo objeto criado no codigo acima.
E ai vc pode manipulá-lo como quiser. É isso.

P.S. Não chame Thread de aplicação porque confunde. Chame Thread de thread , que todo o mundo entende. [/quote]

[quote=ecteruel]Olá novamente.

Bem, eu entendi o que você explicou, mas tem um problema, são aplicações diferentes rodando paralelamente na minha máquina.

Tenho uma classe principal (com método main) que starta uma thread que instancia um objeto de uma classe que abre a porta USB. Essa Thread fica escutando essa porta.

Tenho um servlet que também precisa de comunicar pela mesma porta USB. Esse servlet precisa usar o objeto instanciado pela Thread já que uma vez aberta a porta USB ela fica presa ao objeto que a abriu.

O que eu posso fazer?

Obrigado.
[/quote]

O seu problema é bem complicado. Eu não entendi porque precisa de dois programas agarrados à mesma USB. Isso nunca vai funcionar porque a propria USB só pode ser usada por um de cada vez. Isso não tem nada a ver com Java e sim como as portas funcionam.
Vc não pode usar portas USB diferentes ? Afinal uma porta USB é igual a outra porta USB. Porque vc quer ligar os dois programas na mesma porta?

É eu pensei em usar duas USBs também.

É que eu estou usando um driver que “na teoria” permite comunicação de mão dupla mas não ao mesmo tempo.

O problema é que mesmo que eu consiga vai ser difícil sincronizar, para que não haja o envio e recepção ao mesmo tempo.

Preciso de dois programas agarrados à USB porque estou desenvolvendo um sistema de automação residencial onde tenho um programa com uma Thread que fica escutando constantemente a porta USB (ou seja, os interruptores pressionados na residência) e uma servlet que permite ao usuário enviar informações (acionamentos) através da Web do computador ou celular.

Vou tentar com duas UBSs.

Ah! mais uma dúvida.

É POSSIVEL STARTAR UMA THREAD DE DENTRO DE UMA SERVLET OU DE UMA CLASSE SIMPLES SEM MÉTODO MAIN?

Obrigado

[quote=sergiotaborda][quote=ecteruel]Olá novamente.

Bem, eu entendi o que você explicou, mas tem um problema, são aplicações diferentes rodando paralelamente na minha máquina.

Tenho uma classe principal (com método main) que starta uma thread que instancia um objeto de uma classe que abre a porta USB. Essa Thread fica escutando essa porta.

Tenho um servlet que também precisa de comunicar pela mesma porta USB. Esse servlet precisa usar o objeto instanciado pela Thread já que uma vez aberta a porta USB ela fica presa ao objeto que a abriu.

O que eu posso fazer?

Obrigado.
[/quote]

O seu problema é bem complicado. Eu não entendi porque precisa de dois programas agarrados à mesma USB. Isso nunca vai funcionar porque a propria USB só pode ser usada por um de cada vez. Isso não tem nada a ver com Java e sim como as portas funcionam.
Vc não pode usar portas USB diferentes ? Afinal uma porta USB é igual a outra porta USB. Porque vc quer ligar os dois programas na mesma porta?
[/quote]

uma sugestão seria criar um socket nesta aplicação independente (a tua thread) que quando receber um comando escreve ou lê na USB para a outra aplicação …

[quote=ecteruel]É eu pensei em usar duas USBs também.

É que eu estou usando um driver que “na teoria” permite comunicação de mão dupla mas não ao mesmo tempo.
[/quote]

É. Mão dupla (fullduplex) permite enviar e receber na mesma porta, mas não mais do que para um receptor.

Sim, pode inicar uma thread dentro de um servlet. Mas não é recomendado. O container pode barrar isso, mas geralmente não o faz.
No seu caso é a única forma.

Eu acho que vc resolve o problema com uma só thread. Afinal, para que precisa desse programa separado que é inciiado via main ?
Crie uma so thread , use o esquema do application que expliquei antes e pronto. controle tudo pela o webserver que será mais facil

Muito obrigado pela ajuda.

Achei mais fácil usar duas USBs, uma para enviar e confirmar o acionamento do dispositivo da residência através da Servlet e uma para ficar monitorando os sensores internos da residência.
Deu certinho, assim não precisei me preocupar com sincronização nem com prioridades.

Obrigado novamente.

Abraço.

[quote=urubatan]uma sugestão seria criar um socket nesta aplicação independente (a tua thread) que quando receber um comando escreve ou lê na USB para a outra aplicação …
[/quote]

Muito obrigado pela ajuda.

Achei mais fácil usar duas USBs, uma para enviar e confirmar o acionamento do dispositivo da residência através da Servlet e uma para ficar monitorando os sensores internos da residência.
Deu certinho, assim não precisei me preocupar com sincronização nem com prioridades.

Obrigado novamente.

Abraço.

[quote=sergiotaborda][quote=ecteruel]É eu pensei em usar duas USBs também.

É que eu estou usando um driver que “na teoria” permite comunicação de mão dupla mas não ao mesmo tempo.
[/quote]

É. Mão dupla (fullduplex) permite enviar e receber na mesma porta, mas não mais do que para um receptor.

Sim, pode inicar uma thread dentro de um servlet. Mas não é recomendado. O container pode barrar isso, mas geralmente não o faz.
No seu caso é a única forma.

Eu acho que vc resolve o problema com uma só thread. Afinal, para que precisa desse programa separado que é inciiado via main ?
Crie uma so thread , use o esquema do application que expliquei antes e pronto. controle tudo pela o webserver que será mais facil[/quote]