• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
1,071
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
2
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Lato Sensu em Sistemas Orientados a Objetos Módulo 6 Arquiteturas Orientadas a Serviços com a JBoss SOA Platform
  • 2. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  • 3. Objetivo Mostrar o caminho que SOA tem seguido
  • 4. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 3 C W 2000 2001 2002 2003 2004 2005 2006 2007 2008
  • 5. serviço
  • 6. serviço arquitetura
  • 7. infra-estrutura serviço arquitetura
  • 8. padrão infra-estrutura serviço arquitetura
  • 9. padrão infra-estrutura serviço arquitetura método
  • 10. padrão infra-estrutura interoperabilidade serviço arquitetura método
  • 11. padrão infra-estrutura interoperabilidade serviço arquitetura intercâmbio método
  • 12. padrão infra-estrutura interoperabilidade serviço arquitetura intercâmbio mensagem método
  • 13. padrão infra-estrutura interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  • 14. padrão infra-estrutura desacoplamento interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  • 15. padrão coordenação infra-estrutura desacoplamento interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  • 16. padrão orquestração coordenação infra-estrutura desacoplamento interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  • 17. padrão orquestração coordenação infra-estrutura desacoplamento interoperabilidade serviço processos arquitetura de negócio intercâmbio mensagem método integração
  • 18. padrão orquestração coordenação infra-estrutura desacoplamento interoperabilidade serviço processos arquitetura de negócio intercâmbio mensagem integração reuso método
  • 19. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  • 20. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  • 21. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  • 22. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 P C R
  • 23. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 B A O R C P C R
  • 24. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 I M A R B O R C C P R
  • 25. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ce s e r vi e b S I W RM A RB O C P C R
  • 26. Soluções Silver Bullet
  • 27. prome$$a$ Soluções Silver Bullet
  • 28. Estratégia stop-the-world
  • 29. Implantação árdua e demorada
  • 30. Colou?
  • 31. 2005 SOA nem que seja na marra!
  • 32. Projetos SOA
  • 33. Projetos SOA
  • 34. Falta de escalabilidade
  • 35. Interview John Crupi on Enterprise SOA So service oriented architecture, hype or reality? A little of both there's a lot of hype behind it. (...) it's architectural driven and if you don't have the architecture in place there's no product that out of the box will give you SOA today.
  • 36. Guerrilla SOA
  • 37. #1 SOA tem a ver com filosofia e não com tecnologia
  • 38. #2 SOA tem a ver com R.O.I.
  • 39. #3 SOA tem a ver com governança de ativos
  • 40. Article Quest for True SOA Posted by Alex Maclinovsky on Sep 10, 2008 According to these definitions, SOA Governance is what turns Enterprise Services from digital artifacts into true business assets by allowing responsible reuse across the domains of control of SOA participants
  • 41. Redesenvolvimento de software
  • 42. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Software também é patrimônio
  • 43. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Antes de trocar, você reforma
  • 44. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ...até a última ponta gota
  • 45. Article SOA Governance: An Enterprise View Posted by Michael Poulin on Aug 20, 2008 03:54 AM
  • 46. Article SOA Governance: An Enterprise View Posted by Michael Poulin on Aug 20, 2008 03:54 AM (...)organisations were assured that SOA was new IT technology for integration and reuse of existing assets.
  • 47. Article SOA Governance: An Enterprise View Posted by Michael Poulin on Aug 20, 2008 03:54 AM Very few succeeded and went forward
  • 48. Article SOA Governance: An Enterprise View Posted by Michael Poulin on Aug 20, 2008 03:54 AM Other organisations failed in gaining promised ROI and time to market
  • 49. Interview Jim Webber on quot;Guerilla SOAquot; A lot of SOA projects I have seen, have been somewhat akin to mobilizing an army. We want to address specific discrete business problems, organized by priorities according to the business stakeholder and get those processes implemented rapidly in an incremental way with lots of feedback.
  • 50. Major changes in technology have not been driven by the technologies themselves but by the change in thinking that they enabled.
  • 51. “Enterprises around the world are increasingly pursuing the core business benefits of Service-Oriented Architecture (SOA)—business agility, reduction in integration expense, greater asset reuse, and improved business visibility. And yet, many large organizations are running into roadblocks with their heavyweight, enterprise-wide SOA initiatives. As an alternative, many organizations are finding a “right weight,” step-by-step approach to SOA is more effective and lowers risk as well.” SIMPLIFYING SOA LOW RISK, HIGH VALUE, “RIGHT WEIGHT” SOA December 2007 Analyst: Jason Bloomberg
  • 52. Economically, quot;right-sourcingquot; is far more efficient than quot;outsourcingquot; and SaaS.
  • 53. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Interview Stefan Tilkov on SOA Why SOA? Why now? What's actually new? (...) What I think is exciting is the fact that it creates, or at least that it is perceived to create the opportunity to align business and technology.
  • 54. Visão moderna de SOA
  • 55. estilo Visão moderna de SOA
  • 56. estilo Visão moderna de SOA lucro
  • 57. estilo Visão moderna de SOA lucro ROI
  • 58. estilo reaproveitamento Visão moderna de SOA lucro ROI
  • 59. estilo ativos reaproveitamento Visão moderna de SOA lucro ROI
  • 60. estilo ativos reaproveitamento Visão moderna de SOA lucro agilidade ROI
  • 61. estilo ativos reaproveitamento Visão moderna de SOA lucro agilidade efetividade ROI
  • 62. Legados ativos
  • 63. Novos legados estão sempre chegando
  • 64. Novos legados estão sempre chegando
  • 65. Novos legados estão sempre chegando
  • 66. Como integrá-los?
  • 67. Como integrá-los? ponto a ponto S1 S2 S3 S4
  • 68. Como integrá-los? estrela S1 S2 broker hub bus S3 S4
  • 69. Reaproveitamento
  • 70. Integracão ponto-a-ponto direta CORBA RMI WebServices S1 S2 REST S3 S4
  • 71. Integracão estrela indireta Enterprise Service Bus
  • 72. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Enterprise Service Bus facilitador da integração entre serviços
  • 73. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 74. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  • 75. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 76. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  • 77. JBoss ESB Rosetta
  • 78. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Na vida real, as coisas não são tão simples assim
  • 79. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Nem sempre as peças se encaixam
  • 80. Nem sempre os serviços falam a mesma língua
  • 81. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 82. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  • 83. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 84. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  • 85. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Nem sempre o destino da mensagem é conhecido
  • 86. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 87. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  • 88. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ? S4 S5
  • 89. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ? S4 S5
  • 90. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  • 91. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 92. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  • 93. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ? Como tomar esta decisão?
  • 94. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 package poker; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; <?xml version = quot;1.0quot; encoding = quot;UTF-8quot;?> <jbossesb xmlns=quot;http:// import java.util.Set; import java.util.Map.Entry; public class PokerHand { public static anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/ final int HIGH_CARD = 0; public static final int ONE_PAIR = 1; public static final int jbossesb-1.0.1.xsdquot; parameterReloadSecs=quot;5quot;><providers> <jms-provider TWO_PAIRS = 2; public static final int THREE_OF_A_KIND = 3; public static final int name=quot;JBossMQquot; connection-factory=quot;ConnectionFactoryquot;> <jms-bus STRAIGHT = 4; public static final int FLUSH = 5; public static final int FULL_HAND = 6; busid=quot;quickstartGwChannelquot;> <jms-message-filter dest-type=quot;QUEUEquot; dest- public static final int FOUR_OF_A_KIND = 7; public static final int STRAIGHT_FLUSH = 8; private Card[] cards = new Card[5]; public PokerHand(Card c1, Card c2, Card c3, Card c4, name=quot;queue/quickstart_simple_cbr_Requestquot; /> </jms-bus> <jms-bus Card c5) throws InvalidHandException { cards[0] = c1; cards[1] = c2; cards[2] = c3; busid=quot;quickstartEsbChannelquot;> <jms-message-filter dest-type=quot;QUEUEquot; dest- cards[3] = c4; cards[4] = c5; if (!isValid()) throw new InvalidHandException(cards); } name=quot;queue/Bquot; /> </jms-bus> <jms-bus busid=quot;CBRNormalShippingquot;> <jms-message- private boolean isValid() { Set<Card> set = new HashSet<Card>(); for (Card c : cards) filter dest-type=quot;QUEUEquot; dest-name=quot;queue/CBRNormalShippingquot; /> </jms-bus> set.add(c); if (set.size() != cards.length) return false; return true; } public int <jms-bus busid=quot;CBRExpressFreeShippingquot;> <jms-message-filter dest-type=quot;QUEUEquot; getGame() { Map<Integer, Integer> cardsCount = countCards(); Collection<Integer> combinations = cardsCount.values(); if (combinations.contains(3)) { if dest-name=quot;queue/CBRExpressFreeShippingquot; /> </jms-bus></jms-provider> </ (combinations.contains(2)) { return FULL_HAND; } return THREE_OF_A_KIND; } if providers><services><!-- ESB CBR Service --> <service (combinations.remove(2)) { if (combinations.contains(2)) { return TWO_PAIRS; } else category=quot;MyFirstCBRServicesESBquot; name=quot;FirstCBRServiceESBquot; description=quot;ESB ? { return ONE_PAIR; } } if(combinations.contains(4)){ return FOUR_OF_A_KIND; } Listenerquot; > <listeners> <!-- Gateway --> <jms-listener name=quot;the-gatewayquot; Map<Integer, Integer> suitCounter = countSuits(); if (isStraight()){ if busidref=quot;quickstartGwChannelquot; is-gateway=quot;truequot; /> <jms-listener (suitCounter.values().contains(5)){ return STRAIGHT_FLUSH; } else { return STRAIGHT; } } name=quot;XPathContentBasedRouterquot; busidref=quot;quickstartEsbChannelquot;> </jms-listener> if (suitCounter.values().contains(5)){ return FLUSH; } return HIGH_CARD; } private Map<Integer, Integer> countSuits() { Map<Integer, Integer> suitCounter = new </listeners> <actions mep=quot;OneWayquot;> <action HashMap<Integer, Integer>(); for (Card card : cards) { if class=quot;org.jboss.soa.esb.actions.ContentBasedRouterquot; name=quot;ContentBasedRouterquot;> (suitCounter.get(card.getSuit()) == null) { suitCounter.put(card.getSuit(), 1); } else <property name=quot;ruleSetquot; value=quot;SimpleCBRRules-XPath.drlquot;/> <property programaticamente declarativamente { suitCounter.put(card.getSuit(), suitCounter.get(card.getSuit()) + 1); } } return name=quot;ruleLanguagequot; value=quot;XPathLanguage.dslquot;/> <property name=quot;ruleReloadquot; suitCounter; } /** * [ [k, 2], * [q, 2], * [T, 1]] * @return */ private Map<Integer, value=quot;truequot;/> <property name=quot;destinationsquot;> <route-to destination- Integer> countCards() { Map<Integer, Integer> counter = new HashMap<Integer, Integer>(); for (Card card : cards) { if (counter.get(card.getNumber()) == null) name=quot;expressquot; service-category=quot;ExpressShippingquot; service- { counter.put(card.getNumber(), 1); } else { counter.put(card.getNumber(), name=quot;ExpressShippingServicequot;/> <route-to destination-name=quot;normalquot; service- counter.get(card.getNumber()) + 1); }} return counter; }private boolean isStraight() category=quot;NormalShippingquot; service-name=quot;NormalShippingServicequot;/> </property> { Arrays.sort(cards); int i = 1; int limit; //Verifica sequencia onde o straight termina </action> </actions> </service><!-- Normal Shipping --> <service com ace if(cards[4].getNumber() == Card.ACE && cards[0].getNumber() == Card.TWO){ limit = category=quot;NormalShippingquot; name=quot;NormalShippingServicequot; description=quot;Normal 4; } else { limit = 5; } for (i=1 ; i < limit; i++) { if (cards[i - 1].getNumber() + 1 != Shipping Servicequot;> <listeners> <jms-listener name=quot;CBRNormalShippingquot; cards[i].getNumber()) return false; } return true; } @Override public String toString() { return quot; quot; + cards[0].getNumber() + quot; quot;+ cards[0].getSuit() + quot; - quot; + busidref=quot;CBRNormalShippingquot;/> </listeners> <actions mep=quot;OneWayquot;> <action cards[1].getNumber() + quot; quot;+ cards[1].getSuit() + quot; - quot; + cards[2].getNumber() + quot; quot;+ name=quot;testStorequot; class=quot;org.jboss.soa.esb.actions.TestMessageStorequot;/> <action cards[2].getSuit() + quot; - quot; + cards[3].getNumber() + quot; quot;+ cards[3].getSuit() + quot; - quot; + name=quot;displayMessageActionquot; cards[4].getNumber() + quot; quot;+ cards[4].getSuit(); } public Card[] getCards(){ return class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.MyJMSListenerActionquot; cards; } public int compareTo(PokerHand hand2) { int comparison = this.getGame()- process=quot;displayMessagequot; /> <!-- This can be replaced with notification --> hand2.getGame(); //desempate. if(comparison==0){ Integer[] criteriosHand2 = hand2.getCriteriosDesempate(); Integer[] criteriosThis = this.getCriteriosDesempate(); <action name=quot;routequot; for(int i=0;i<criteriosThis.length;i++){ comparison = criteriosThis[i]-criteriosHand2[i]; class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.RouteNormalShippingquot; if(comparison!=0){ break; } } } return comparison; } /** * Retorna um array com as cartas process=quot;sendResponsequot; /> </actions> </service><!-- Express Shipping --> na ordem em que s<o consideradas para o * desempate de duas m<os que tem o mesmo jogo. * <service category=quot;ExpressShippingquot; name=quot;ExpressShippingServicequot; * ex: KKKQQ retorna [K,Q] * ex: QQQKK retorna [Q,K] * ex: A2345 retorna [5, 4, 3, 2, A] * description=quot;Express Shipping Servicequot;> <listeners> <jms-listener ex: TT245 retorna [T,5,4,2] * ex: T2245 retorna [2,T,5,4] * ex: flush 2379T retorna [T, name=quot;CBRExpressFreeShippingquot; busidref=quot;CBRExpressFreeShippingquot;/> </listeners> 9,7,3,2] * * @return */ public Integer[] getCriteriosDesempate() { Map<Integer, Integer> mapa = this.countCards(); List<Entry> criterios = new ArrayList<Entry>(); <actions mep=quot;OneWayquot;> <action name=quot;testStorequot; criterios.addAll(mapa.entrySet()); Collections.sort(criterios, new Comparator<Entry>(){ / class=quot;org.jboss.soa.esb.actions.TestMessageStorequot;/> <action ** * Ordena primeiro pelo valor e depois pela chave * * @param o1 * @param o2 * @return name=quot;displayMessageActionquot; */ public int compare(Entry o1, Entry o2) { int comparacao = ((Integer)o2.getValue()) - class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.MyJMSListenerActionquot; ((Integer)o1.getValue()); if (comparacao == 0) { comparacao = ((Integer)o2.getKey()) - process=quot;displayMessagequot; /> <!-- This can be replaced with notification --> ((Integer)o1.getKey()); } return comparacao; } }); // extrai os keys dos entrysets ordenados Integer[] retorno = new Integer[criterios.size()]; for (int i=0 ; <action name=quot;routequot; i<criterios.size() ; i++) { retorno[i] = (Integer) criterios.get(i).getKey(); } // class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.RouteExpressShippingquot; straight comeando com ace if (isStraight() && retorno[4] == Card.TWO && retorno[0] == process=quot;sendResponsequot; /> </actions> </service> </services></jbossesb> Card.ACE) { return new Integer[]{Card.FIVE, Card.FOUR, Card.THREE, Card.TWO, Card.ACE}; } return retorno; } }
  • 95. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 package poker; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; <?xml version = quot;1.0quot; encoding = quot;UTF-8quot;?> <jbossesb xmlns=quot;http:// import java.util.Set; import java.util.Map.Entry; public class PokerHand { public static anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/ final int HIGH_CARD = 0; public static final int ONE_PAIR = 1; public static final int jbossesb-1.0.1.xsdquot; parameterReloadSecs=quot;5quot;><providers> <jms-provider TWO_PAIRS = 2; public static final int THREE_OF_A_KIND = 3; public static final int name=quot;JBossMQquot; connection-factory=quot;ConnectionFactoryquot;> <jms-bus STRAIGHT = 4; public static final int FLUSH = 5; public static final int FULL_HAND = 6; busid=quot;quickstartGwChannelquot;> <jms-message-filter dest-type=quot;QUEUEquot; dest- public static final int FOUR_OF_A_KIND = 7; public static final int STRAIGHT_FLUSH = 8; private Card[] cards = new Card[5]; public PokerHand(Card c1, Card c2, Card c3, Card c4, name=quot;queue/quickstart_simple_cbr_Requestquot; /> </jms-bus> <jms-bus Card c5) throws InvalidHandException { cards[0] = c1; cards[1] = c2; cards[2] = c3; busid=quot;quickstartEsbChannelquot;> <jms-message-filter dest-type=quot;QUEUEquot; dest- cards[3] = c4; cards[4] = c5; if (!isValid()) throw new InvalidHandException(cards); } name=quot;queue/Bquot; /> </jms-bus> <jms-bus busid=quot;CBRNormalShippingquot;> <jms-message- private boolean isValid() { Set<Card> set = new HashSet<Card>(); for (Card c : cards) filter dest-type=quot;QUEUEquot; dest-name=quot;queue/CBRNormalShippingquot; /> </jms-bus> set.add(c); if (set.size() != cards.length) return false; return true; } public int <jms-bus busid=quot;CBRExpressFreeShippingquot;> <jms-message-filter dest-type=quot;QUEUEquot; getGame() { Map<Integer, Integer> cardsCount = countCards(); Collection<Integer> combinations = cardsCount.values(); if (combinations.contains(3)) { if dest-name=quot;queue/CBRExpressFreeShippingquot; /> </jms-bus></jms-provider> </ (combinations.contains(2)) { return FULL_HAND; } return THREE_OF_A_KIND; } if providers><services><!-- ESB CBR Service --> <service (combinations.remove(2)) { if (combinations.contains(2)) { return TWO_PAIRS; } else category=quot;MyFirstCBRServicesESBquot; name=quot;FirstCBRServiceESBquot; description=quot;ESB { return ONE_PAIR; } } if(combinations.contains(4)){ return FOUR_OF_A_KIND; } Listenerquot; > <listeners> <!-- Gateway --> <jms-listener name=quot;the-gatewayquot; Map<Integer, Integer> suitCounter = countSuits(); if (isStraight()){ if busidref=quot;quickstartGwChannelquot; is-gateway=quot;truequot; /> <jms-listener (suitCounter.values().contains(5)){ return STRAIGHT_FLUSH; } else { return STRAIGHT; } } name=quot;XPathContentBasedRouterquot; busidref=quot;quickstartEsbChannelquot;> </jms-listener> if (suitCounter.values().contains(5)){ return FLUSH; } return HIGH_CARD; } private Map<Integer, Integer> countSuits() { Map<Integer, Integer> suitCounter = new </listeners> <actions mep=quot;OneWayquot;> <action HashMap<Integer, Integer>(); for (Card card : cards) { if class=quot;org.jboss.soa.esb.actions.ContentBasedRouterquot; name=quot;ContentBasedRouterquot;> (suitCounter.get(card.getSuit()) == null) { suitCounter.put(card.getSuit(), 1); } else <property name=quot;ruleSetquot; value=quot;SimpleCBRRules-XPath.drlquot;/> <property programaticamente declarativamente { suitCounter.put(card.getSuit(), suitCounter.get(card.getSuit()) + 1); } } return name=quot;ruleLanguagequot; value=quot;XPathLanguage.dslquot;/> <property name=quot;ruleReloadquot; suitCounter; } /** * [ [k, 2], * [q, 2], * [T, 1]] * @return */ private Map<Integer, value=quot;truequot;/> <property name=quot;destinationsquot;> <route-to destination- Integer> countCards() { Map<Integer, Integer> counter = new HashMap<Integer, Integer>(); for (Card card : cards) { if (counter.get(card.getNumber()) == null) name=quot;expressquot; service-category=quot;ExpressShippingquot; service- { counter.put(card.getNumber(), 1); } else { counter.put(card.getNumber(), name=quot;ExpressShippingServicequot;/> <route-to destination-name=quot;normalquot; service- counter.get(card.getNumber()) + 1); }} return counter; }private boolean isStraight() category=quot;NormalShippingquot; service-name=quot;NormalShippingServicequot;/> </property> { Arrays.sort(cards); int i = 1; int limit; //Verifica sequencia onde o straight termina </action> </actions> </service><!-- Normal Shipping --> <service com ace if(cards[4].getNumber() == Card.ACE && cards[0].getNumber() == Card.TWO){ limit = category=quot;NormalShippingquot; name=quot;NormalShippingServicequot; description=quot;Normal 4; } else { limit = 5; } for (i=1 ; i < limit; i++) { if (cards[i - 1].getNumber() + 1 != Shipping Servicequot;> <listeners> <jms-listener name=quot;CBRNormalShippingquot; cards[i].getNumber()) return false; } return true; } @Override public String toString() { return quot; quot; + cards[0].getNumber() + quot; quot;+ cards[0].getSuit() + quot; - quot; + busidref=quot;CBRNormalShippingquot;/> </listeners> <actions mep=quot;OneWayquot;> <action cards[1].getNumber() + quot; quot;+ cards[1].getSuit() + quot; - quot; + cards[2].getNumber() + quot; quot;+ name=quot;testStorequot; class=quot;org.jboss.soa.esb.actions.TestMessageStorequot;/> <action cards[2].getSuit() + quot; - quot; + cards[3].getNumber() + quot; quot;+ cards[3].getSuit() + quot; - quot; + name=quot;displayMessageActionquot; cards[4].getNumber() + quot; quot;+ cards[4].getSuit(); } public Card[] getCards(){ return class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.MyJMSListenerActionquot; cards; } public int compareTo(PokerHand hand2) { int comparison = this.getGame()- process=quot;displayMessagequot; /> <!-- This can be replaced with notification --> hand2.getGame(); //desempate. if(comparison==0){ Integer[] criteriosHand2 = hand2.getCriteriosDesempate(); Integer[] criteriosThis = this.getCriteriosDesempate(); <action name=quot;routequot; for(int i=0;i<criteriosThis.length;i++){ comparison = criteriosThis[i]-criteriosHand2[i]; class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.RouteNormalShippingquot; if(comparison!=0){ break; } } } return comparison; } /** * Retorna um array com as cartas process=quot;sendResponsequot; /> </actions> </service><!-- Express Shipping --> na ordem em que s<o consideradas para o * desempate de duas m<os que tem o mesmo jogo. * <service category=quot;ExpressShippingquot; name=quot;ExpressShippingServicequot; * ex: KKKQQ retorna [K,Q] * ex: QQQKK retorna [Q,K] * ex: A2345 retorna [5, 4, 3, 2, A] * description=quot;Express Shipping Servicequot;> <listeners> <jms-listener ex: TT245 retorna [T,5,4,2] * ex: T2245 retorna [2,T,5,4] * ex: flush 2379T retorna [T, name=quot;CBRExpressFreeShippingquot; busidref=quot;CBRExpressFreeShippingquot;/> </listeners> 9,7,3,2] * * @return */ public Integer[] getCriteriosDesempate() { Map<Integer, Integer> mapa = this.countCards(); List<Entry> criterios = new ArrayList<Entry>(); <actions mep=quot;OneWayquot;> <action name=quot;testStorequot; criterios.addAll(mapa.entrySet()); Collections.sort(criterios, new Comparator<Entry>(){ / class=quot;org.jboss.soa.esb.actions.TestMessageStorequot;/> <action ** * Ordena primeiro pelo valor e depois pela chave * * @param o1 * @param o2 * @return name=quot;displayMessageActionquot; */ public int compare(Entry o1, Entry o2) { int comparacao = ((Integer)o2.getValue()) - class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.MyJMSListenerActionquot; ((Integer)o1.getValue()); if (comparacao == 0) { comparacao = ((Integer)o2.getKey()) - process=quot;displayMessagequot; /> <!-- This can be replaced with notification --> ((Integer)o1.getKey()); } return comparacao; } }); // extrai os keys dos entrysets ordenados Integer[] retorno = new Integer[criterios.size()]; for (int i=0 ; <action name=quot;routequot; i<criterios.size() ; i++) { retorno[i] = (Integer) criterios.get(i).getKey(); } // class=quot;org.jboss.soa.esb.samples.quickstart.simplecbr.RouteExpressShippingquot; straight comeando com ace if (isStraight() && retorno[4] == Card.TWO && retorno[0] == process=quot;sendResponsequot; /> </actions> </service> </services></jbossesb> Card.ACE) { return new Integer[]{Card.FIVE, Card.FOUR, Card.THREE, Card.TWO, Card.ACE}; } return retorno; } }
  • 96. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Configuração declarativa de regras
  • 97. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Pra isso, usa-se um Engine de Regras para declaração execução
  • 98. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Pra isso, usa-se um Engine de Regras para declaração execução
  • 99. regras fatos engine de regras decisão
  • 100. regras + + engine de regras = decisão fatos
  • 101. JBoss Rules Drools
  • 102. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Às vezes o processamento de uma mensagem envolve vários serviços, que precisam ser coordenados entre si.
  • 103. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 104. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  • 105. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  • 106. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  • 107. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4
  • 108. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4
  • 109. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4
  • 110. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4
  • 111. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ESB
  • 112. Falta de coordenação pode levar à total perda de controle do ambiente
  • 113. Torna-se então necessária a formalização de processos
  • 114. Engine de Processos
  • 115. Huguinho Zezinho Luizinho
  • 116. JBoss jBPM
  • 117. JBoss SOA Platform
  • 118. P&R alexandre.gomes@seatecnologia.com.br blog.seatecnologia.com.br