Arquiteturas Orientadas a Serviços com a JBoss SOA Platform

1,270 views

Published on

Published in: Technology, Business
2 Comments
3 Likes
Statistics
Notes
No Downloads
Views
Total views
1,270
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
0
Comments
2
Likes
3
Embeds 0
No embeds

No notes for slide

Arquiteturas Orientadas a Serviços com a JBoss SOA Platform

  1. 1. Lato Sensu em Sistemas Orientados a Objetos Módulo 6 Arquiteturas Orientadas a Serviços com a JBoss SOA Platform
  2. 2. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  3. 3. Objetivo Mostrar o caminho que SOA tem seguido
  4. 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. 5. serviço
  6. 6. serviço arquitetura
  7. 7. infra-estrutura serviço arquitetura
  8. 8. padrão infra-estrutura serviço arquitetura
  9. 9. padrão infra-estrutura serviço arquitetura método
  10. 10. padrão infra-estrutura interoperabilidade serviço arquitetura método
  11. 11. padrão infra-estrutura interoperabilidade serviço arquitetura intercâmbio método
  12. 12. padrão infra-estrutura interoperabilidade serviço arquitetura intercâmbio mensagem método
  13. 13. padrão infra-estrutura interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  14. 14. padrão infra-estrutura desacoplamento interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  15. 15. padrão coordenação infra-estrutura desacoplamento interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  16. 16. padrão orquestração coordenação infra-estrutura desacoplamento interoperabilidade serviço arquitetura intercâmbio mensagem método integração
  17. 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. 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. 19. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  20. 20. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  21. 21. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008
  22. 22. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 P C R
  23. 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. 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. 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. 26. Soluções Silver Bullet
  27. 27. prome$$a$ Soluções Silver Bullet
  28. 28. Estratégia stop-the-world
  29. 29. Implantação árdua e demorada
  30. 30. Colou?
  31. 31. 2005 SOA nem que seja na marra!
  32. 32. Projetos SOA
  33. 33. Projetos SOA
  34. 34. Falta de escalabilidade
  35. 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. 36. Guerrilla SOA
  37. 37. #1 SOA tem a ver com filosofia e não com tecnologia
  38. 38. #2 SOA tem a ver com R.O.I.
  39. 39. #3 SOA tem a ver com governança de ativos
  40. 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. 41. Redesenvolvimento de software
  42. 42. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Software também é patrimônio
  43. 43. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Antes de trocar, você reforma
  44. 44. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ...até a última ponta gota
  45. 45. Article SOA Governance: An Enterprise View Posted by Michael Poulin on Aug 20, 2008 03:54 AM
  46. 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. 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. 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. 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. 50. Major changes in technology have not been driven by the technologies themselves but by the change in thinking that they enabled.
  51. 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. 52. Economically, quot;right-sourcingquot; is far more efficient than quot;outsourcingquot; and SaaS.
  53. 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. 54. Visão moderna de SOA
  55. 55. estilo Visão moderna de SOA
  56. 56. estilo Visão moderna de SOA lucro
  57. 57. estilo Visão moderna de SOA lucro ROI
  58. 58. estilo reaproveitamento Visão moderna de SOA lucro ROI
  59. 59. estilo ativos reaproveitamento Visão moderna de SOA lucro ROI
  60. 60. estilo ativos reaproveitamento Visão moderna de SOA lucro agilidade ROI
  61. 61. estilo ativos reaproveitamento Visão moderna de SOA lucro agilidade efetividade ROI
  62. 62. Legados ativos
  63. 63. Novos legados estão sempre chegando
  64. 64. Novos legados estão sempre chegando
  65. 65. Novos legados estão sempre chegando
  66. 66. Como integrá-los?
  67. 67. Como integrá-los? ponto a ponto S1 S2 S3 S4
  68. 68. Como integrá-los? estrela S1 S2 broker hub bus S3 S4
  69. 69. Reaproveitamento
  70. 70. Integracão ponto-a-ponto direta CORBA RMI WebServices S1 S2 REST S3 S4
  71. 71. Integracão estrela indireta Enterprise Service Bus
  72. 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. 73. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  74. 74. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  75. 75. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  76. 76. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  77. 77. JBoss ESB Rosetta
  78. 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. 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. 80. Nem sempre os serviços falam a mesma língua
  81. 81. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  82. 82. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  83. 83. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  84. 84. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  85. 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. 86. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  87. 87. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  88. 88. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ? S4 S5
  89. 89. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ? S4 S5
  90. 90. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  91. 91. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  92. 92. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB ! S4 S5
  93. 93. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ? Como tomar esta decisão?
  94. 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. 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. 96. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 Configuração declarativa de regras
  97. 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. 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. 99. regras fatos engine de regras decisão
  100. 100. regras + + engine de regras = decisão fatos
  101. 101. JBoss Rules Drools
  102. 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. 103. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  104. 104. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  105. 105. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4 S5
  106. 106. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4 S5
  107. 107. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4
  108. 108. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4
  109. 109. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ! S1 S2 S3 ESB S4
  110. 110. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 S1 S2 S3 ESB S4
  111. 111. Lato Sensu em Sistemas Orientados a Objetos Laboratório de Tópicos Avançados - 2°/2008 ESB
  112. 112. Falta de coordenação pode levar à total perda de controle do ambiente
  113. 113. Torna-se então necessária a formalização de processos
  114. 114. Engine de Processos
  115. 115. Huguinho Zezinho Luizinho
  116. 116. JBoss jBPM
  117. 117. JBoss SOA Platform
  118. 118. P&R alexandre.gomes@seatecnologia.com.br blog.seatecnologia.com.br

×