Ejb 3.1 - sistema de automaÇÃo comercial

PessoALL, esse é meu cenário:

Sistema X de Gestão => Financeiro, Contabil, Estoque (Esse sistema será desenvolvido para WEB jsf2+primefaces). Esse sistema
terá seu banco de dados (PostgreSQL) usará JPA para persistencia dos dados.

possivelmente irei usar abordagem DDD ao invés dos patterns default da SUN.

Sistema Z de Frente de Caixa ==> Vendas, Emissão de cupom fiscal (Esse sistema será desenvolvido com interface Swing/JFC tem que ser desktop por motivos da legislação governamental). Esse sistema terá sua propria JVM lógico e seu proprio SGBD que será
MysQL e usará JPA para persistencia.

Em resumo,

  1. pretendo usar JPA em ambos projeto

  2. pretendo fazer os dois sistemas se comunicar (observe que poderão está em cidades diferentes, no caso a comunicação será via link dedicado ou adsl) e aqui que entra minha dúvida:
    Como eu faço isso de forma profissional, de modo que a cada venda realizada no no sistema Z de caixa ou a cada commit de transação local imediatamente faço um select nos registros de venda que poderão está em mais de uma tabela, insiro-os em uma objeto do tipo List ou Set, e conecto diretamente no SGBD da matriz via JPA(Se é que tem como usar o mesmo arquivo persistence.xml para acessar mais de um sgbd simultaneamente) ou eu chamo um Enterprise JavaBean.?

  3. Suponha que eu opte em usar o EJB como serviço para ser chamado pelos clientes do Sistema Z, visto que no Servidor de APP
    eu tenho o EBJ responsavel em responder os clientes do sistema Z e aplicação WEB JSF. como ficaria essa arquitetura fisicamente.
    Que projeto eu criaria no Netbeans para tal fim.? Exemplifique com codigos se possivel a ordem de chamada das camadas por gentileza.

  4. No meu EJB eu criaria somente classes SessionBeans para servir de Fachada onde os clientes Swing chamariam os metodos, ou eu so obrigado a Criar Minhas Entidades persistentes dentro desse EJB?

  5. Em resumo eu quero ter um EJB compartilhado entre a APPWEB(Sistema X) e o APPSWing(Sistema Z), dessa forma eu quero enteder onde vai ficar minhas regras de negocios., se é dentro do EJB é isso?

att
fidencio

Olha só não entendi muito bem se é isso que vc quer, mas vamos lá…

Vc vai ter um sistema WEB (JEE) e um sistema Desktop (JSE).
Utilizará o GlassFish para sua aplicação JEE (EJB, WebService (com metro)). Eu recomendo. Java 6 e tudo mais.

Aí fica simples:

Cria um WebService no seu JEE, por exemplo: EncomendaWS - para o sistema JSE encomendar algo do estoque.
Assim, quando o seu sistema JSE precisar desse serviço ele utilizará normalmente.

Pocha, bacana sua iniciativa de utilizar as novas tecnologias. É isso aí.

Ta precisando de um profissional para te ajudar nas implementações não?

Att,
Clesio Júnior

Uma idéia.
Não use JPA p/ acessar o banco de dados do principal. Use EJBs. Usar EJBs remotos em uma aplicação desktop é simples e bastante eficiente. Vc pode construir os seguintes artefatos:

1 - Um projeto JSE não executável onde vc vai deixar as suas entidades do JPA;
2 - Um projeto JSE não executável onde vc vai deixar as interfaces de negócios dos seus EJBs;
3 - Um projeto JEE com um módulo EJB e um módulo WEB;
4 - Um projeto JSE executável q será a aplicação cliente.

Se vc vai usar um banco de dados local p/ o aplicativos de caixa, então prefira um banco embarcado como o Derby. Isso vai tornar o deploy dessas aplicações infinitamente mais simples.

Olha só, pensando em SOA.

Vc poderia ter um modulo único EJB - com suas regras de negócio (session beans, etc) e entidades (estoque, venda, etc). Regras tanto para o estoque (aplicação JEE, por exemplo) quanto para o sistema de vendas (JSE, por exemplo).

Esse módulo fará parte do .EAR da sua aplicação WEB, ou poderá ser independente, com um deploy independente.

Então tanto sua aplicação JSE como a aplicação WEB dependerá do módulo EJB.

Dessa forma, a sua aplicação desktop será uma usuária do serviço EJB, não vai ficar implementando regras de negócio.

Exemplificando:

APLICAÇÃO JSE (cliente executável) acessa -----> SERVIDOR JEE (EJB).
APLICAÇÃO WEB acessa —> SERVIDOR JEE (EJB).

Lembrando que um EJB pode ser tb um webservice. Aí é só cuidar da segurança aí e tal. Ex:

—Session Bean

@Stateless
@WebService(endpointInterface=“ejb.ws.CalculadoraWS”)
public class CalculadoraBean {

public int adiciona(int x, int y) {
    return x+y;
}

public int subtrai(int x, int y) {
    return x - y;
}

// Add business logic below. (Right-click in editor and choose
// "Insert Code > Add Business Method")

}

-------Interface remota

@WebService
@SOAPBinding(style = Style.RPC)
public interface CalculadoraWS extends Remote {

@WebMethod
int adiciona(int x, int y);

@WebMethod
int subtrai(int primeiro, int segundo);

}

[quote=clesiojunior]Olha só não entendi muito bem se é isso que vc quer, mas vamos lá…

Vc vai ter um sistema WEB (JEE) e um sistema Desktop (JSE).
Utilizará o GlassFish para sua aplicação JEE (EJB, WebService (com metro)). Eu recomendo. Java 6 e tudo mais.

Aí fica simples:

Cria um WebService no seu JEE, por exemplo: EncomendaWS - para o sistema JSE encomendar algo do estoque.
Assim, quando o seu sistema JSE precisar desse serviço ele utilizará normalmente.

Pocha, bacana sua iniciativa de utilizar as novas tecnologias. É isso aí.

Ta precisando de um profissional para te ajudar nas implementações não?

Att,
Clesio Júnior[/quote]

Clesio, eu até agradeço pela tua disposição na questão das implementações, Entretanto, estou sozinho por questões financeiras até a coisa embalar. OK, com relação ao WebService que você me recomendou ele é transacional? Observe por exemplo eu tenho uma venda, que no sgbd do caixa, que será mysql, será gravada nas tabelas: Venda, ItemVenda, FormaPgto, Cliente e etc. A sequencia do caso de uso é assim:

  1. Cliente chega no caixa.

  2. Operador de caixa registra o item da venda pelo leitor de codigo de barras (ean13 ou ean7) (Esse processo entra em Loop até que os itens da venda terminem)

  3. O Operador digita a tecla “s” para o sistema (j2se) somar os itens da venda e renderizar na rela o valor a ser pago.

  4. O Cliente paga em dinheiro

  5. Operador registra o valor pago na forma de pagamento dinheiro

  6. A Impressora fiscal emiti o cupom fiscal (comprovante fiscal de venda) ps: No Cumpom , contem os dados da venda, inclusive o imposto seja icms(estadual) se for venda, e ISSQN se for serviço seria imposto municipal.

  7. O Sistema dispara um timer e seleciona os registros de venda que não foram sincronizados com servidor,e em seguida os envia para o servidor da matriz para serem persistidos.

  8. O Caso de uso venda termina.

Considerações importantissima para esse caso de uso.

A cada item lido no leitor de codigo de barras ou digitado, o mesmo é gravado na eprom da impressora fiscal e em seguinda na tabela ItemVenda, lembrando que o primeiro item gravado o cabeçalho da venda já é gravado, e ambas tabelas possui um FLAG Boleana que indica se o registro já foi ou não enviado para o SGBD da matriz, onde ficará o Servidor de Aplicação (Conteiner EJB + Web Container + JMS + WS). Logo, após a conclusão de cada venda, um Timer no sistema j2se, é disparado de tempos em tempos, que verifica se o link está no AR com a matriz, caso esteja então, ele pega os registros de vendas das tabelas, monta os objetos, evidentemente teremos objetos agregados e um unico objeto, logo eu preciso enviar esses objetos para o servidor da matriz persisti-los no sgbd da matriz com segurança, sabendo que preciso manter a consistencia, onde não posso ter registros de vendas repetidos, ou seja, jamais isso, jamais. Por isso eu acho que preciso de transação distribuida nesse cenário.

Pode colocar um exemplo aqui em código para esse cenário? Usando as Tecnologias Citadas?

Grato!!!
Fidêncio

[quote=dev.rafael]Uma idéia.
Não use JPA p/ acessar o banco de dados do principal.[/quote]
Você se refere em acessar realizar operações de persistencia (CRUD) da aplicação j2se(cliente) diretamente no sgbd da matriz?

Pode por gentileza se não for muito postar códigos que sejam poucos codigos do cenario ? Principalmente da parte transacional, ou seja, o sistema j2se irá fazer chamadas remotas para gravar a venda no servidor de banco de dados, como você sugeriu que tal acesso não seja direto ao sgbd, porém passe pelo EJB, e como ficaria transacionalmente isso.?

Como esse projeto será acessado pelo outros projetos? via JAR? esse projeto somente para alocar as entities da jpa se tornará um
simples JAR que será importado nos projetos que depende dela?

Então as interfaces que são implementadas pelo meu SessionBeans ficará fisicamente separada dos meus SessionBeans concretos (Classes)

Se meu projeto WEB faz referencia ao EJB, e o EJb fará referencia os JAR’s das entities da jpa e das interfaces de negocio como isso?

Esse aqui eu entedi, preciso fazer lookup aqui não né? se eu fiz assim:

@EJB
private CategoriaServiceSessionBean categoriaService;

Ele já faz lookup automatico a procura do contexto ?

[quote=dev.rafael]
Se vc vai usar um banco de dados local p/ o aplicativos de caixa, então prefira um banco embarcado como o Derby. Isso vai tornar o deploy dessas aplicações infinitamente mais simples.[/quote]
Concordo, Porém com Derby é possivel realizar persistência fisica no dispositivo de I/O ? me parece que o tal funciona só na Memória Principal?

Atenciosamente,
Fidêncio.

Eu crie um projeto enterprise e gerou 3 projetos:

  1. desktop
  2. web
  3. ejb

para mim acessar o ebj do meu managerBean do JSf usei anotação @EJB que já faz DIP pra mim. Logo acessei interface Remota, visto que para app no mesmo container eu posso usar interface local.

Dúvidas:

  • Posso colocar minhas entities no EJB mesmo? dai vou anotalas com a JPA sem ter que criar jars separado das entities e das regras de negocios?
  • Minhas regras de negocio tanto da APPWEB quando Desktop poderia ficar nas SessionBeans mesmo? lembrando que preciso do Estado ativo dos objetos então nesse caso seria StateFull a anotação?
  • Quanto a restrição os clientes desktop terão acesso somente as interfaces publicas remotas? eles nao poderão ver metodos das interfaces locais.?
  • Não quero ter interfaces de acesso ao ejb duplicada, se eu quero usar a mesma interface em ambos clientes WEB e Desktop a mesma deve ser remota?

Meu projeto web ficaria assim:

CategproaView(xhtml) -> CategoriaController (ManagerBean)–>CategoriaSessionBeanFacade(service (pode ser statefull? )—>CategoriaSessionBean(Negocio) -->CategoriaEntity(jpa)–> SGBD

a aplicação swing vai ter as camadas normal…mas vai fazer lookup remoto e chamar metodos no ejb para realizar persistencia e validação de negocio pertinente a venda, a maior parte das regras ficarão no cliente, o ebj e mais para trasmitir a venda de forma segura com escopo de transação e tudo mais, nesse caso terei um pacote no meu ebj chamado pdvserver, que comunica com o pdv. nesse pacote terá SessionBeans que serão invocadas, e pelo jeito terão vida até que um commit seja realizado, e o cliente tem que ter ciencia disso ok? outra coisa e quanto a gargalo, imagina 10 pdvs conectando ao mesmo tempo no meu servidor, como eu faria para montar uma fila de requisição e se a chamada demorar muito pra ser atendida ocorre timeout, o cliente fica informado de que o servidor está congestionado e nao conseguiu atender solicitação?

att
fidencio