Java:Usando Objetos Serializados em Java: Difference between revisions
Line 29: | Line 29: | ||
* '''Carteiro''' = Pega as respectivas cartas, no seu diretório e faz a entrega. | * '''Carteiro''' = Pega as respectivas cartas, no seu diretório e faz a entrega. | ||
:: O Carteiro pega o arquivo com o objeto e cria novamente o objeto Carta. Fazemos um print do Objeto. | :: O Carteiro pega o arquivo com o objeto e cria novamente o objeto Carta. Fazemos um print do Objeto. | ||
:: Ao executarmos: | |||
java Carteiro | |||
'''resultado:''' | |||
Entrega Carta ... | |||
carta.getCep ...001 | |||
carta.getRemetente ...Fulano de Tal 010 | |||
Destinatario ...Ciclano da Silva 010 | |||
Destinatario ...Beltrano de Oliveira 010 | |||
carta.getConteudo ...Meus amigos .... Feliz Natal | |||
Entrega Carta ... | |||
carta.getCep ...001 | |||
carta.getRemetente ...Fulano de Tal | |||
Destinatario ...Ciclano da Silva | |||
Destinatario ...Beltrano de Oliveira | |||
carta.getConteudo ...Meus amigos .... Feliz Natal | |||
Neste exemplo estou utilizando 100 cartas, mas este valor poderia ser 10 Milhões de cartas. Para ter a performance que eu esperava da aplicação, executei diversas vezes a aplicação Carteiro. Exemplo: | Neste exemplo estou utilizando 100 cartas, mas este valor poderia ser 10 Milhões de cartas. Para ter a performance que eu esperava da aplicação, executei diversas vezes a aplicação Carteiro. Exemplo: | ||
Line 36: | Line 55: | ||
... | ... | ||
java Carteiro 010 & | java Carteiro 010 & | ||
= Classes = | = Classes = |
Revision as of 12:59, 30 December 2014
Ao serializar objetos em java, convertemos aquele "objeto/dado" em um conjunto de bytes que podem ser armazenados em um arquivo, para que posteriormente possamos utilizar os dados novamente como o objeto original.
Complexo!!! Mas vamos utilizar uma problema de negócio para explicar isso.
Resolvendo o Problema de negócio
Problema: Um Agência dos correios precisamos entregar 100 cartas rapidamente, sendo que a mesma tem 10 carteiros para executar o serviço?
Para resolvermos esse problema de distribuição criamos 3 classes;
- Carta = Objeto a ser serializado
- Distribuidor = Pega todas as cartas, classifica e distribui entre os carteiros.
- Ao classificarmos as cartas criamos o objeto Carta e serializo o mesmo para ser utilizado pelo Carteiro, armazenando o objeto no respectivo diretório do carteiro.
- Ao executarmos geramos os arquivos:
java Distribuidor resultado: ls /tmp/Correios/00*/ /tmp/Correios/001/: A000.obj A001.obj A002.obj A003.obj A004.obj A005.obj A006.obj A007.obj A008.obj A009.obj A010.obj /tmp/Correios/002/: A011.obj A012.obj A013.obj A014.obj A015.obj A016.obj A017.obj A018.obj A019.obj A020.obj ... /tmp/Correios/009/: A081.obj A082.obj A083.obj A084.obj A085.obj A086.obj A087.obj A088.obj A089.obj A090.obj
- Carteiro = Pega as respectivas cartas, no seu diretório e faz a entrega.
- O Carteiro pega o arquivo com o objeto e cria novamente o objeto Carta. Fazemos um print do Objeto.
- Ao executarmos:
java Carteiro resultado: Entrega Carta ... carta.getCep ...001 carta.getRemetente ...Fulano de Tal 010 Destinatario ...Ciclano da Silva 010 Destinatario ...Beltrano de Oliveira 010 carta.getConteudo ...Meus amigos .... Feliz Natal Entrega Carta ... carta.getCep ...001 carta.getRemetente ...Fulano de Tal Destinatario ...Ciclano da Silva Destinatario ...Beltrano de Oliveira carta.getConteudo ...Meus amigos .... Feliz Natal
Neste exemplo estou utilizando 100 cartas, mas este valor poderia ser 10 Milhões de cartas. Para ter a performance que eu esperava da aplicação, executei diversas vezes a aplicação Carteiro. Exemplo:
java Carteiro 001 & java Carteiro 002 & ... java Carteiro 010 &
Classes
Distribuidor.java
package net.ebasso; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class Distribuidor { private static String outputCorreioDiretorio="/tmp/Correios"; private static int cartas = 100; public static void main(String[] args) { executaExemplo02(); } public static void executaExemplo02() { Distribuidor application = new Distribuidor(); try { String sufixo = ""; int j = 1; String carteiro = String.format("%03d", j); for (int i = 1; i < cartas; i++) { sufixo = String.format("%03d", i) ; ArrayList<String> destinatarios = new ArrayList<String>(); destinatarios.add("Ciclano da Silva " + sufixo); destinatarios.add("Beltrano de Oliveira " + sufixo); application.runOnce("A"+sufixo , carteiro,"Fulano de Tal " + sufixo, destinatarios, "Meus amigos .... Feliz Natal"); if ((i % 10) == 0) { j++; carteiro = String.format("%03d", j); } } } catch (Exception e) { e.printStackTrace(); } } public static void executaExemplo01() { Distribuidor application = new Distribuidor(); try { ArrayList<String> destinatarios = new ArrayList<String>(); destinatarios.add("Ciclano da Silva"); destinatarios.add("Beltrano de Oliveira"); application.runOnce("A000","001","Fulano de Tal", destinatarios, "Meus amigos .... Feliz Natal"); } catch (Exception e) { e.printStackTrace(); } } private void runOnce(String messageId, String cep, String remetente, ArrayList<String> destinatarios, String conteudo ) throws Exception { // Criando a carta e definindo os valores Carta carta = new Carta(); carta.setMessageId(messageId); carta.setCep(cep); carta.setRemetente(remetente); carta.setConteudo(conteudo); carta.setDestinatarios(destinatarios); // Armazenando o objeto serializado String ojbFilename = outputCorreioDiretorio + "/" + cep + "/" + messageId + ".obj"; FileOutputStream arquivoAGravar = new FileOutputStream(ojbFilename); ObjectOutputStream objetoAGravar = new ObjectOutputStream(arquivoAGravar); objetoAGravar.writeObject(carta); objetoAGravar.flush(); objetoAGravar.close(); arquivoAGravar.close(); } }
Carteiro.java
package net.ebasso; import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.Iterator; public class Carteiro { private static String inputCorreioDiretorio="/tmp/Correios"; public static void main(String[] args) { Carteiro application = new Carteiro(); try { String carteiroCep="001"; if (args.length > 0) { String carteiroCep = args[0]; } File folder = new File(inputCorreioDiretorio + "/" + carteiroCep); File[] listOfFiles = folder.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { String arquivo = listOfFiles[i].getName(); application.runOnce(arquivo, carteiroCep); } } } catch (Exception e) { e.printStackTrace(); } } private void runOnce(String messageId, String cep) throws Exception { String inputFilename = inputCorreioDiretorio + "/" + cep + "/" + messageId; FileInputStream arquivoALer = new FileInputStream(inputFilename); ObjectInputStream objetoALer = new ObjectInputStream(arquivoALer); // Criando a carta e definindo os valores Carta carta = (Carta) objetoALer.readObject(); objetoALer.close(); arquivoALer.close(); System.out.println("Entrega Carta ..."); System.out.println(""); System.out.println("carta.getCep ..." + carta.getCep()); System.out.println("carta.getRemetente ..." + carta.getRemetente()); ArrayList<String> destinatarios = carta.getDestinatarios(); Iterator<String> iterator = destinatarios.iterator(); while (iterator.hasNext()) { String destinatario = (String) iterator.next(); System.out.println("Destinatario ..." + destinatario); } System.out.println(""); System.out.println("carta.getConteudo ..." + carta.getConteudo()); } }
Carta.java
package net.ebasso; import java.io.Serializable; import java.util.ArrayList; public class Carta implements Serializable{ private static final long serialVersionUID = 3818318077429278285L; private String messageId; private String cep; private String remetente; private ArrayList<String> destinatarios; private String conteudo; public String getMessageId() { return messageId; } public void setMessageId( String messageId) { this.messageId = messageId; } public String getCep() { return cep; } public void setCep( String cep) { this.cep = cep; } public String getRemetente() { return remetente; } public void setRemetente( String remetente) { this.remetente = remetente; } public String getConteudo() { return conteudo; } public void setConteudo( String conteudo) { this.conteudo = conteudo; } public ArrayList<String> getDestinatarios() { return destinatarios; } public void setDestinatarios( ArrayList<String> destinatarios) { this.destinatarios = destinatarios; } }