ecb: infrastructure

Download ECB: Infrastructure

If you can't read please download the document

Upload: mbohnen

Post on 11-Aug-2015

174 views

Category:

Software


3 download

TRANSCRIPT

  1. 1. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 1 Session: Pattern of the Infrastructure Layer Bean Locator Payload Extractor Asynchronous Resource Integrator Resource Binder
  2. 2. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 2 Objectives Learn about: How to access other components using JNDI instead of CDI How enhance robustness in the field of messaging and message types How to integrate 3rd party systems using Messaging An alternative to @Inject
  3. 3. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 3 Some orientation Consumer Consumer Layer Integration Layer Business Process Layer Services Layer Component Layer OS Layer
  4. 4. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 4 ECB Pattern Entity Control Boundary Based upon Robustness Diagrams (http://www.agilemodeling.com/artifacts/robustnessDiagram.htm) Boundary: user interface Control: actual process or activity Entity: a concept from an enterprise context. Elements are generic enough to be mapped either to service- oriented or object-oriented architectures. Boundary Control Entity Adam Bien
  5. 5. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 5 Services, components and patterns Boundary Control Entity DAO & Domain Store Generic DAO Singleton Service Starter Dual View SOA Facade Lightweight asynchronous Facade Multichannel Facade TO & DTO Paginator Bean Locator Multichannel Facade Resource Binder Payload Extractor Aynchronous Resource Integrator Infrastructure
  6. 6. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 6 Module Bean Locator
  7. 7. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 7 Bean Locator According to Adam Bien, Dependency Injection has also some disadvantages: It is static - the dependencies are resolved at start time. The service user has to live with the given contracts or conventions. DI is only available for certain classes which are managed by a container. Sometimes the need to rely on JNDI lookups might occur. A convenient way to access these ressouces should be provided
  8. 8. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 8 You have to decide .. whether EJBs from different jars should be injected (ear deployment only) or looked-up for. Boundary Control Entity Boundary Control Entity
  9. 9. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 9 JNDI names Have not been standardized for a long time EJB 3.1 solves the above problem by mandating that every container must assign (at least one) well defined global JNDI names to EJBs. The general syntax of a (portable) global JNDI name of an EJB is of the form: BUT: application name and module name vary if using maven Right now I'm working with 3 different ejb containers (Glassfish, JBoss and OpenEjb) and they use totally different conventions for ejb names. It's incredible, isn't it? --- Posted by Filippo on December 24, 2006 at 09:25 AM CET java:global/[]//!
  10. 10. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 10 Even within ... the same JBoss 6.1 but different configurations, lookup will be different: default configuration standard configuration
  11. 11. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 11 Service Locator 2.0 (Bean Locator) We need to find something which is configurable and allows to retrieve the JNDI name at runtime: Combination of Builder pattern and Strategy pattern Builder pattern: construct the utility class Strategy pattern: various strategies to create the appropriate JNDI look-up string
  12. 12. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 12 Implementation
  13. 13. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 13 Lab Implement Bean Locator (not more than 15 min.)
  14. 14. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 14 Module Resource Binder
  15. 15. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 15 Resource Binder Application server registeres resources like EJBs, JMS destinations or DataSources at startup time These components are injectable into Servlets and/or EJBs If you want to do the same with your components, you need to do a little work: Make use of the @Inject annotation and a DI framework like WELD or Google Guice Bind the resources yourself into JNDI and inject later on using @Resource annotation
  16. 16. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 16 Injecting by @Inject The @Inject annotation provides a convenient way to inject non- EJB resources @Inject is more general than EJB and is part of CDI specification. So if you want to use @Inject, you need an implementation of it in your server. For POJOs (not EJBs) you have to use @Inject. In JBoss/WELD using @Inject requires the jar to contain a beans.xml file in META-INF subdirectory
  17. 17. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 17 Using @Inject Example: @Stateless @Remote(SomeService.class) public class SomeServiceBean implements SomeService { @Inject private SomeProcess process; public void someBusinessMethod(int amount) throws ProcessException { // was before //de.brockhaus.userMgmt.util.Process p = new de.brockhaus.userMgmt.control.process.SomeProcess(amount); process.setAmount(amount); process.proceed(); } }
  18. 18. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 18 Using @Resource Alternatively the @Resource annotation can be used to access resources bound to the JNDI tree As the result is the same compared to @Inject, @Inject is less work The @Resource annotation explained for being complete only Doesn't work under JBoss 6.1 if resource is bound by Singleton bean with @PostConstruct and @DependsOn annotations
  19. 19. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 19 Binding the resources @Singleton @Startup public class ResourceBinder { private Logger log = Logger.getLogger(this.getClass()); @PostConstruct public void bindResources() { try { InitialContext ctx = new InitialContext(); ctx.rebind("SomeProcess", new SomeProcess()); log.info(">>>>> SomeProcess bound"); } catch (NamingException e) { e.printStackTrace(); } } }
  20. 20. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 20 Injecting the resource Using @Resource annotation @Stateless @Remote(SomeService.class) public class SomeServiceBean implements SomeService { @Resource(mappedName="SomeProcess") private SomeProcess process; public void someBusinessMethod(int amount) throws ProcessException { process.setAmount(amount); process.proceed(); } }
  21. 21. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 21 Lab Implement Resource Binder (not more than 15 min.)
  22. 22. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 22 Module Payload Extractor
  23. 23. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 23 Extracting the payload Why: As no one Type checking and error handling needs to be factored out from the MDB Corrupted messages have to be send to DLQ Approach: Decorate onMessage() method of MDB using an interceptor
  24. 24. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 24 The interceptor ... public class PayloadInterceptor { private static final String CALLED_METHOD_NAME = "proceedXMLMessage"; private Logger log = Logger.getLogger(this.getClass()); @AroundInvoke public Object intercept(InvocationContext ctx){ Object ret = null; try{ // getting the parameters from InvocationContext Object[] params = ctx.getParameters(); if(params[0] instanceof TextMessage){ TextMessage msg = (TextMessage) params[0]; String payload = msg.getText(); this.invokeMethod(ctx.getTarget(), payload); log.info("TextMessage received"); } ret = ctx.proceed(); } catch (Exception e){ this.dealWithException(e); } return ret; }
  25. 25. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 25 Wrapping the MDB onMessage method annotated, service injected ... @MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName="destination", propertyValue="queue/facade/UserMgmt") }) public class UserManagementQueueListenerBean implements MessageListener { private Logger log = Logger.getLogger(this.getClass()); @EJB private UserManagementServiceLocal userService; @Interceptors(PayloadInterceptor.class) public void onMessage(Message msg){ log.info("invoked but nothing will happen"); } ...
  26. 26. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 26 Wrapping the MDB Delegating to the service ... public void proceedXMLMessage(String xml) throws JAXBException { log.info(xml + "received"); userService.createUserThroughXML(xml); }
  27. 27. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 27 Lab Implement Payload Extractor (not more than 15 min.)
  28. 28. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 28 Module Asynchronous Resource Integrator
  29. 29. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 29 Purpose In the majority of the environments, many applications still run on heterogeneous platforms (heterogeneosity meant in terms of technologies like programming languages) Existing Java EE services need to be integrated with these legacy services. There are several technologies you might want to make use of like HTTP-based REST or SOAP or even CORBA. If Messaging is supported on both platforms, why not using it?
  30. 30. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 30 Lab Implement Asynchronous Resource Integrator (not more than 15 min.)
  31. 31. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 31 Review Session Review: Why do we need to access other components not using JNDI? Is there a way to get out of the JNDI name hazzle? Messaging is nice but which types of messages to deal with and how to check?
  32. 32. Copyright by Brockhaus GmbH, alle Rechte reserviert, unautorisierte Vervielfltigung untersagt 32 Recommeded reading http://java.sun.com/blueprints/corej2eepatterns/ http://www.corej2eepatterns.com/Patterns2ndEd/ Adam Bien, J2EE Patterns, Addison Wesley 2002, ISBN: 3-8273-1903-X Floyd Marinescu, Ed Roman: Ejb Design Patterns: Advanced Patterns, Processes, and Idioms; Wiley & Sons, ISBN-10: 0471208310 And other ... Photo: Bundesarchiv