Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
-
Author
adriano-teixeira-de-souza -
Category
Technology
-
view
3.913 -
download
0
Embed Size (px)
Transcript of Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)

Sistemas DistribuídosComunicação Distribuída - EJB
Prof. Adriano Teixeira de Souza

Estratégias diferentes que permitem a comunicação entre aplicações distribuídas.
Tipos distintos de comunicação em um sistema distribuído:
◦ Sockets◦ RMI - Remote Method Invocation◦ CORBA – Commom Object Request Broker Architecture◦ EJB – Enterprise Java Bean◦ Web Services
Comunicação Distribuída
Prof. Adriano Teixeira de Souza

Enterprise JavaBeans 3.1 com JPA 2.0
Prof. Adriano Teixeira de Souza

Instalando o JBoss Se utilizar a versão 7.0 do JBoss , não é
requerida uma instalação, basta apenas descompactar o arquivo na sua máquina e adicionar a variável de ambiente JBOSS_HOME;
Prof. Adriano Teixeira de Souza

Configurando as variáveis de ambiente (Windows) Vá em Iniciar -> Painel de controle -> Sistema ->
Avançado ->Variáveis de ambiente; Adicione as variáveis JAVA_HOME e JBOSS_HOME,
com os seguintes valores:◦ JAVA_HOME = “meu caminho do JDK”◦ JBOSS_HOME = “meu caminho do Jboss”
Caso não tenha permissão, “sete” as variáveis em tempo de console (abra uma “console” e digite):◦ SET JAVA_HOME=diretorioJVM◦ SET JBOSS_HOME=diretorio do JBOSS◦ Em seguida, entre na pasta bin e digite RUN.BAT
Prof. Adriano Teixeira de Souza

Plataformas Java
Prof. Adriano Teixeira de Souza

Plataforma JEE (antiga J2EE) JEE: Acrônimo de Java Enterprise Edition Kit
Plataforma Java voltada para aplicações corporativas, no modelo de sistema distribuído.
Voltada para aplicações multi-camadas, baseadas em componentes que são executados em um servidor de aplicações (JBoss, exemplo).
A plataforma Java EE é considerada um padrão de desenvolvimento, pois o fornecedor de software nesta plataforma deve seguir determinadas regras compatíveis com Java EE.
Prof. Adriano Teixeira de Souza

A plataforma JEE A plataforma J2EE contém uma série de especificações, cada uma
com funcionalidades distintas. Entre elas, tem-se:
◦ EJBs (Enterprise Java Beans), utilizados no desenvolvimento de componentes de software. Eles permitem que o programador se concentre nas necessidades do negócio do cliente, enquanto questões de infra-estrutura, segurança, disponibilidade e escalabilidade são responsabilidade do servidor de aplicações.
◦ JPA (Java Persistence API), é uma API que padroniza o acesso a banco de dados através de mapeamento Objeto/Relacional dos Enterprise Java Beans
◦ JTA (Java Transaction API), é uma API que padroniza o tratamento de transações dentro de uma aplicação Java.
◦ JDBC (Java Database Connectivity), utilizado no acesso a bancos de dados; ◦ JCA (Java Connector Architecture), é uma API que padroniza a ligação a
aplicações legadas.◦ Servlets e JSP (Java Server Pages), utilizados para o desenvolvimento de
aplicações Web com conteúdo dinâmico. ◦ E outros.
Prof. Adriano Teixeira de Souza

A plataforma JEE
• Transações gerenciadas• Segurança• Clustering• Escalabilidade• Alta Disponibilidade• Comunicação Assíncrona• Integração com Legado• Persistência• etc…
Prof. Adriano Teixeira de Souza

Conceitos básicos

Entity Beans Representa um objeto de entidade de
negócios que existe no armazenamento persistente (banco de dados, por exemplo)
Classes simplificadas, chamadas “POJOS”, mapeadas com JPA ;
Flexíveis para qualquer banco de dados relacional;
Tão portáveis, que podem ser usados também fora de um servidor de aplicação (aplicação “desktop”);
São agrupados em uma unidade de persistência;
Prof. Adriano Teixeira de Souza

Entity Beans Espelham objetos do mundo real;
Possuem uma chave primária “id”(pode ser uma classe ou um tipo primitivo);
Identificado pela anotação @Entity;
Não necessitam de nenhuma interface;
Gerenciados pelo EntityManager;
Prof. Adriano Teixeira de Souza

Aplicação Exemplo
Sistema de Cadastro de Cliente
Prof. Adriano Teixeira de Souza

A entidade “Cliente”.
@[email protected](name=“cliente”)public class Cliente implements Serializable {
private static final long serialVersionUID = 1L;
@[email protected](strategy=IDENTITY)private int id;
private String nome;
private String cpf;
public Cliente() { }
// get’s e set’s
//equals e hashCode
} // fim da entidade
Prof. Adriano Teixeira de Souza

Anotações @Entity
◦ Indica ao provedor de persistência que a Classe bean será mapeada para uma tabela de banco de dados e gerenciada por um Entity Maganer;
@Table ◦ Informa ao container EJB para qual tabela do banco será mapeada
a classe bean;
@Column ◦ Informa ao container EJB para qual coluna da tabela a propriedade
do bean será mapeada;
@Id◦ Informa que atributo será tratado como chave primária na tabela
de banco de dados.
@GeneratedValue - define que o valor do atributo “id” será gerado automaticamente no momento em que os objetos forem persistidos (inseridos na tabela).
Prof. Adriano Teixeira de Souza

Observações sobre uma classe entidade Implementar a interface java.io.Serializable não é obrigatório.◦ Com “Serializable” é possível usar a mesma classe
tanto para persistência, quanto para transferência de dados (entre sistemas ou camadas).
Assim como todo POJO, as propriedades de um Entity Bean são acessadas através dos métodos get’s e set’s.
Prof. Adriano Teixeira de Souza

Unidade de Persistência Conjunto de todos os entity beans; Quem gerencia é um serviço de
EntityManager; Cada unidade de persistência deve estar
associada a um banco de dados; Todas essas informações estão descritas em
um arquivo chamado persistence.xml Localizado no diretório META-INF da
aplicação A unidade de persistência é identificada pela
marcação:◦ <persistence-unit name=“xxxx”>
Onde “xxxx” é o nome a ser referenciado como a unidade de persisência.
Prof. Adriano Teixeira de Souza

Unidade de PersistênciaO arquivo persistence.xml (definido com o
datasource do banco de dados)
<?xml version="1.0" encoding="UTF-8"?><persistence> <persistence-unit name= “nomeUP” > <jta-data-source>
java:jboss/datasources/TesteSQLiteDS</jta-data-source>
</persistence-unit></persistence>
Prof. Adriano Teixeira de Souza

Unidade de Persistência <persistence-unit
name=“nomeUP”> ◦ Conjunto das classes gerenciadas
por um Entity Manager
<jta-data-source>◦ Define o banco de dados que será
usado para esta implantação.◦ No JBoss deve ser definido em um
arquivo “.xml” chamado standalone.xml.
Prof. Adriano Teixeira de Souza

Session Beans São componentes EJB do lado do servidor que podem ser
acessados utilizando vários protocolos de objetos distribuídos;
Para acessar uma aplicação que foi instalada no servidor (JBoss), a aplicação cliente invoca os métodos do Session Bean.
O Session Bean executa o trabalho para seu cliente, protegendo o cliente da complexidade através da execução de tarefas de negócio dentro do servidor.
Suas atividades são geralmente transitórias (não tem um estado persistente);
Prof. Adriano Teixeira de Souza

Session Beans Stateless:
◦ Não mantém estado;◦ Cada método é completamente independente ;
Stateful:◦ Mantém estado;◦ Não é compartilhado entre clientes;
Todo Session Bean deve implementar uma interface local ou remota.◦ Local – o cliente compartilha a mesma máquina
(processador e memória) que o servidor◦ Remoto – o cliente acessa de forma remota (de outra
máquina), mesmo estando na mesma máquina que o servidor
Prof. Adriano Teixeira de Souza

Aplicação exemplo – Cadastro de Clientes Será criado um “session beans” (componente)
chamado ClienteFacade, que fornecerá todos os serviços/tarefas de um cadastro de clientes:◦ Cadastrar um Cliente ◦ Listar os Clientes cadastrados◦ Localizar um Cliente
E outros que se tornarem necessários.
• Por convenção, todos os componentes “session beans” terão no nome o sufixo “Facade”.
• A classe interface terá o mesmo nome da classe “session beans”, adicionado com o sufixo “Remote” ou “Local”, dependendo do uso.
Prof. Adriano Teixeira de Souza

O session bean “ClienteFacade”@Stateless (mappedName =" ejb/ClienteBean")@LocalBeanpublic class ClienteFacade implements
ClienteFacadeRemote{ @PersistenceContext
private EntityManager manager; public void cadastraCliente(Cliente cliente) {
manager.persist(cliente); }
public Cliente localizaCliente(int id) {return manager.find(Cliente.class, id);
}}
Prof. Adriano Teixeira de Souza

O session bean “ClienteFacade” @Stateless:
◦ Mostra que o componente ClienteFacade não mantém o estado (objetos/dados em memória);
@PersistenceContext◦ Obtém o acesso a um serviço EntityManager;
Prof. Adriano Teixeira de Souza

A interface remota – ClienteFacadeRemote Especifica quais métodos de negócio um
cliente tem permissão para invocar no EJB;
@Remote◦ Instrui o container de que esta é uma interface
remota para o ClienteFacade
Prof. Adriano Teixeira de Souza

A interface remota - [email protected] interface ClienteFacadeRemote{ public void cadastraCliente(Cliente cliente); public Cliente localizaCliente(int id);
public List<Cliente> listaClientes();}
Prof. Adriano Teixeira de Souza

Criando um projeto EJB no Eclipse (3.6.x)
Passo-a-passo

Passo1: Definir o projeto JPA Considere um novo projeto para representar a aplicação
“servidora” do Sistema de Cadastro de Clientes. Crie um projeto do tipo EJB: File – New – Project ... EJB
Em seguida, informe:a) O nome do projetob) O servidor para execuçãoc) A configuração do JPA
Veja a seguir...
Prof. Adriano Teixeira de Souza

Passo1: Definir o projeto JPA
Prof. Adriano Teixeira de Souza
a) Nome do projeto
b) Servidor para execução
c) Configuração do JPA
d) Pressione Next duas vezes

Passo1: Definir o projeto JPA
Prof. Adriano Teixeira de Souza
a) Defina a plataformab) Adicione a conexao
c) Selecione o driver
e) Pressione Finish

Passo1: Definir o projeto JPA
Prof. Adriano Teixeira de Souza
a) Selecione a conexão
b) Marque a opção para listar classes no arquivo persistence.xml
c) Marque a opção para criar o arquivo orm.xml

Passo1: Definir o projeto JPA Visão do projeto JPA(“AULAJEE6-JPA”), na
perspectiva “Java EE”:
Prof. Adriano Teixeira de Souza
Área (pasta) de código fonte (source)

Passo 2: Construir as Classes Entidades As entidades utilizam anotações presentes na biblioteca do JPA,
Java Persistence API. Considere a entidade Cliente apresentada anteriormente. Crie a classe Cliente.java no pacote modelo conforme figura
abaixo.
Prof. Adriano Teixeira de Souza

34
Passo 2: Construir as Classes Entidades Após importar as classes, adicione as referências
das entidade no arquivo “persistence.xml”.◦ Use o recurso “Generate Entities from Tables”
Prof. Adriano Teixeira de Souza

Passo 3: Definindo o “data-source”
Adicione o nome da “data-source” (TesteSQLiteDS) no arquivo persistence.xml.◦ Use a tag:
<jta-data-source>java:jboss/datasources/TesteSQLiteDS</jta-data-source>
◦ Ou use o editor (assistente) na aba “Connection”. Informe em JTA_Data Source: java:jboss/datasources/TesteSQLiteDS
Prof. Adriano Teixeira de Souza

36
“Data-source” no persistence.xml Diferente da configuração em aplicação desktop (console
ou stand-alone), uma aplicação no JBOSS fica responsável pelo acesso aos recursos de banco, que são gerenciados pela JTA – Java Transaction API.
Prof. Adriano Teixeira de Souza

Definição do ‘data-source’ no JBOSS Abra o arquivo “standalone.xml” no diretório “configuration” do
JBOSS contendo o acesso ao banco de dados. O exemplo a seguir, mostra o DS (data-source) TesteSQLiteDS,
que registra esse nome no serviço de diretório JNDI (Java Naming and Directory Interface).
Diretório: \jboss-as-7.1.0.Final\standalone\configuration
Arquivo “standalone.xml”
Prof. Adriano Teixeira de Souza

Data-source “EventoDS” para MySQL
Obs:1. Implantar o driver do MySQL no diretório \jboss-as-7.1.0.Final\modules\org\sqlite\main
Prof. Adriano Teixeira de Souza

Passo 4: Definir o projeto EJB Considere um novo projeto para representar a aplicação
“servidora” do Sistema de Eventos. Crie um projeto do tipo EJB: File – New – Project ... EJB
Em seguida, informe:a) O nome do projetob) A versão do EJB (use a 3.1)
Veja a seguir...
Prof. Adriano Teixeira de Souza

Passo 4: Definir o projeto EJB
a) Nome do projeto
b) Versão do EJB (usar a 3.1)
Prof. Adriano Teixeira de Souza
c) Clique em Next duas vezesd) Marque a opção “Generate ejb-jar.xml deployment descriptor”

Passo 4: Definir o projeto EJB Visão do projeto EJB (“AULAJEE6-EJB”), na
perspectiva “Java EE”:
Prof. Adriano Teixeira de Souza
Área (pasta) de código fonte (source)

42
Passo 5: Criação de Session beans Nesse passo serão criados o componente
ClienteFacade e sua interface remota ClienteFacade Remote.
No Eclipse, seleciona a pasta de código e escolha a opção New – Session Bean (na perspectiva JEE).
◦ Pode ser também: File - New – EJB – Session Bean
Prof. Adriano Teixeira de Souza

Passo 5: Criação de Session beans Criar o “session bean”: ClienteFacade na pacote “facade”
(dentro da pasta de código ejbModule). Desmarque a opção “Local” e marque “Remote”
◦ Altere o nome da interface remota para façade.ClienteFacade Remote
Prof. Adriano Teixeira de Souza

44
Código da Classes “AgenciaEvento...”
Prof. Adriano Teixeira de Souza

45
Código final da classe “ClienteFacade...”
Prof. Adriano Teixeira de Souza

Passo 5:Implantando uma aplicação JavaEE
(usando EJB)“Deploy no Eclipse”

Conceito de Deploy Deployment (implantação) é o conjunto de
atividades que tornam um software, ou componentes de software, pronto para uso.
Durante o deployment, o container EJB lê as configurações contidas em arquivos descritores (deployment descriptor) ou nas annotations (anotações) no código-fonte e prepara um ambiente padronizado para a execução dos beans.
◦ O deployment descriptor especifica quais serviços de infra-estrutura o container EJB proverá aos enterprise beans, desde que o deployment seja feito num container EJB certificado.
◦ No Eclipse, cria-se o descritor através do atalho (sobre o projeto): Java EE Tools – Generate Deployment Descriptor Stub Será criado o arquivo ejb-jar.xml na pasta META-INF (do projeto)
Prof. Adriano Teixeira de Souza

Exportando o projeto EJB em formato JAR Um arquivo “JAR” (Java Archive) é uma forma
conveniente de “empacotar” componentes para uso em deployment
O processo compacta (“zipa”) todas as classes, interfaces e arquivos descritores para um único arquivo JAR
Em seguida esse arquivo deve ser copiado para a pasta “deploy” do JBOSS (ou do servidor de aplicação em uso).
No Eclipse, você utiliza a opção: ◦ File – Export – EJB Jar File
◦ Ou usa o menu de atalho (veja na próxima figura)
Prof. Adriano Teixeira de Souza

Exportando o projeto EJB em formato JAR
Prof. Adriano Teixeira de Souza
Escolha o diretório destino no do Jboss (..\server\default\deploy)

50
Executando o JBoss Para implantar é necessário iniciar o servidor JBoss
◦ Entre no diretório “bin”, onde está o Jboss instalado◦ Execute o arquivo “run.bat” (na console Windows)◦ Aguarde a carga ....
Prof. Adriano Teixeira de Souza

O Deploy no JBoss O JBoss exige que você coloque seu projeto
EJB “JAR” em um dirétorio deploy. ◦ O default é a pasta
“\jboss-as-7.1.0.Final\standalone\deployments”
O servidor examina o arquivo JAR em tempo de execução quando o servidor é inicializado para determinar quais containers EJB devem ser criados e acoplados em tempo de execução.◦ Qualquer atualização do “JAR” pode ser feita com o
JBoss “rodando”
Prof. Adriano Teixeira de Souza

Passo 6:Criando um projeto de uma
aplicação cliente
Acessando os componentes EJB remotamente em uma aplicação console.

Testando o acesso aos EJB Com o componente EJB ClienteFacade
implantado, vamos testar o acesso de um cliente remoto (aplicação console)
Para isso devemos criar o cliente que se conecta ao servidor, localiza a interface remota do componente ClienteFacade e interage com ele para criar e selecionar entidades “Cliente” no banco de dados.
Prof. Adriano Teixeira de Souza

Criando a aplicação no Eclipse No Eclipse, crie um nov projeto Java EE, do tipo “Java
Project”.◦ Use a opção File – New Project – JavaEE
Prof. Adriano Teixeira de Souza

Importando o pacote JAR para o projeto. Adicione o JAR criado anteriormente, para manter as
dependências das classes entidades (JPA) e a EJB remoto.
Prof. Adriano Teixeira de Souza

Adicionando referência para o projeto
Prof. Adriano Teixeira de Souza

Adicionando a biblioteca do JBOSS_LIB Adicione a bibliotecas para o cliente do diretório conforme abaixo.
Prof. Adriano Teixeira de Souza

Criando o Cliente
public class Principal {
private static InterfaceRepositorioClientes lookupRemote() throws NamingException {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(
Context.URL_PKG_PREFIXES,
"org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "TesteJPA-EJB";
final String distinctName = "";
final String beanName = ServidorClientes.class.getSimpleName();
final String viewClassName = InterfaceRepositorioClientes.class.getName();
return (InterfaceRepositorioClientes) context.lookup(
"ejb:" + appName + "/" + moduleName + "/"
+ distinctName + "/" + beanName + "!" + viewClassName);
}
Prof. Adriano Teixeira de Souza

Criando o Cliente
public static void main(String[] args) throws NamingException {
try{
// cria um cliente
InterfaceRepositorioClientes repositorioRemotoClientes = lookupRemote();
System.out.println("Efetuado conexao com servidor.");
Cliente cliente = new Cliente();
cliente.setNome("Paulo");
cliente.setCpf("0434567-89");
System.out.println("Gravando novo cliente.");
repositorioRemotoClientes.criarCliente(cliente);
System.out.println("Listando todos clientes.");
List<Cliente> clientes = repositorioRemotoClientes.listarClientes();
for(Cliente c : clientes){
System.out.println("Cliente: "+c.getNome()+" ("+c.getCpf()+")");
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
Prof. Adriano Teixeira de Souza

Executar o cliente Colocar um arquivo jboss-ejb-client.properties no
diretório src, o qual é o diretório base para os arquivos fonte com o conteúdo abaixo.
Prof. Adriano Teixeira de Souza
endpoint.name=client-endpointremote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=falseremote.connections=defaultremote.connection.default.host=127.0.0.1remote.connection.default.port = 4447remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
Executar o programa

Atividade - Final Desenvolver uma aplicação JavaEE para
fornecer o seguinte componente:◦ CadastrarAluno (Aluno a);
Um aluno tem matricula, nome, curso.
◦ Desenvolver uma aplicação console para utilizar o componente CadastraAluno, usando a interface CadastrarAlunoRemote
Prof. Adriano Teixeira de Souza