SlideShare a Scribd company logo
Globalcode	
  –	
  Open4education
Suportando Aplicações
Multi-tenancy com Java EE
Rodrigo Cândido da Silva
@rcandidosilva
Globalcode	
  –	
  Open4education
Agenda
!   Modelos de Serviço
!   SaaS Market
!   Multi-tenancy
!  Desafios
!  Pros and Cons
!  Tipos de Implementação
!   Java EE + Multi-tenancy
!   Segurança + Multi-tenancy
!   Cloud + Multi-tenancy
!   JVM Multi-tenancy
Globalcode	
  –	
  Open4education
Modelos de Serviço
Globalcode	
  –	
  Open4education
SaaS Market
Globalcode	
  –	
  Open4education
Multi-tenancy
!   Uma única instância
da aplicação
atendendo múltiplos
clientes (tenant)
! Contrário da
arquitetura de
múltiplas instâncias
Globalcode	
  –	
  Open4education
Multi-instances vs. Multi-tenant
Globalcode	
  –	
  Open4education
Cloud != Multi-tenancy
Globalcode	
  –	
  Open4education
Desafios
!   Separação dos dados
!   Personalização
!   Controle de acesso
!   Provisionamento de recursos
!   Integrações
!   Atualização da aplicação
!   Recuperação à falhas
Globalcode	
  –	
  Open4education
Pros and Cons
!   Pros
! Reduz o custo de manutenção
! Único código para todos os clientes
! Aumenta a escalabilidade
! Beneficia compartilhamento recursos entre clientes
!   Cons
! Aumenta a complexidade
! Separação por tenant-id
! Maior risco de falhas
! Quebra da aplicação compartilhada para todos clientes
! Reduz a flexibilidade para os clientes
Globalcode	
  –	
  Open4education
Multi-tenancy
!   4 possíveis níveis implementações
! Nível 1 (Personalizado)
!  [N] aplicações e [N] databases
! Nível 2 (Configurável)
!  [1] aplicação e [N] databases
! Nível 3 (Configurável e eficiente)
!  [N] aplicações e [1] database
! Nível 4 (Escalável, configurável e eficiente)
!  [1] aplicação e [1] database
Globalcode	
  –	
  Open4education
Nível 1 - Personalizado
!   [N] aplicações e [N] databases
Globalcode	
  –	
  Open4education
Nível 2 - Configurável
!   [1] aplicação e [N] databases
Globalcode	
  –	
  Open4education
Nível 3 - Eficiente
!   [N] aplicações e [1] database
Globalcode	
  –	
  Open4education
Nível 4 - Escalável
!   [1] aplicação e [1] database
Globalcode	
  –	
  Open4education
Java EE + Multi-tenancy
!   Database
!  JPA + Multi-tenancy
!   Customização UI
!  JSF + Multi-tenancy
!   Segurança
!   Java EE 8 com suporte Cloud
Globalcode	
  –	
  Open4education
JPA + Multi-tenancy
!   EclipseLink
!  Suporte a multi-tenancy @Multitenant
!  Disponibiliza 3 estratégias
!  @Multitenant(SINGLE_TABLE) – default
!  @Multitenant(TABLE_PER_TENANT)
!  @Multitenant(VPD)
!  Shared Cache by tenant
Globalcode	
  –	
  Open4education
EclipseLink SINGLE_TABLE
@Entity
@Table(name=“EMP”)
@Multitenant(SINGLE_TABLE)
@TenantDiscriminatorColumn(name = “TENANT_ID”,
contextProperty = “tenant-id”)
public class Employee {
...
}
HashMap properties = new HashMap();
properties.put("tenant.id", "707");
...
EntityManager em = Persistence
.createEntityManagerFactory(
"multi-tenant”,properties)
.createEntityManager();
<persistence-unit name="multi-tenant">
...
<properties>
<property name="tenant.id"
value="707"/>
...
</properties>
</persistence-unit>
Globalcode	
  –	
  Open4education
EclipseLink TABLE_PER_TENANT
<entity class="Employee">
<multitenant type="TABLE_PER_TENANT">
<tenant-table-discriminator type="SCHEMA" context-
property="eclipselink.tenant-id"/>
</multitenant>
<table name="EMP">
...
</entity>
@Entity
@Table(name=“EMP”)
@Multitenant(TABLE_PER_TENANT)
@TenantTableDiscriminator(type=SCHEMA,
contextProperty="eclipselink.tenant-id")
public class Employee {
...
}
Globalcode	
  –	
  Open4education
EclipseLink VPD
@Entity
@Multitenant
@TenantDiscriminatorColumn(name = "USER_ID",
contextProperty = "tenant.id")
@Cacheable(false)
public class Task implements Serializable {
...
CALL DBMS_RLS.ADD_POLICY
('SCOTT', 'TASK', 'todo_list_policy',
'SCOTT', 'ident_func', 'select, update,
delete'));
<properties>
<property name="eclipselink.session.customizer"
value="example.VPDSessionCustomizer" />
<property name="eclipselink.session-event-listener"
value="example.VPDSessionEventAdapter" />
<property
name="eclipselink.jdbc.exclusive-connection.mode"
value="Always" />
</properties>
Globalcode	
  –	
  Open4education
JPA Caching
!   Shared Cache disabled
Globalcode	
  –	
  Open4education
JPA Caching
!   Shared Cache by tenant
Globalcode	
  –	
  Open4education
JSF + Multi-tenancy
!   Arquitetura extensível
!   Artefatos podem ser encapsulados em JARs
!   Composição at runtime
!   Templates
!   Resource library
!   Look-and-feel customization
!   RenderKit
!   Localization
Globalcode	
  –	
  Open4education
JSF Facelets
The Facelets Gazette
Site
Navigation
●Events
●Docs
●Forums
About Contact Site Map
Template File name
_template.html
Insertion points
Resources
css classes, scripts, images
Globalcode	
  –	
  Open4education
JSF Multi-templating
contractA
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractB
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractC
• Declared Templates
• Declared Insertion Points
• Declared Resources
<web-app-root>/contracts
contractD
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractE
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractF
• Declared Templates
• Declared Insertion Points
• Declared Resources
JAR files in WEB-INF/lib
contractA
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractB
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractC
• Declared Templates
• Declared Insertion Points
• Declared Resources
<web-app-root>/contracts
contractD
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractE
• Declared Templates
• Declared Insertion Points
• Declared Resources
contractF
• Declared Templates
• Declared Insertion Points
• Declared Resources
JAR files in WEB-INF/lib
Set of available contracts
Facelet 1 Facelet 3Facelet 2
faces-config.xml
Globalcode	
  –	
  Open4education
JSF Multi-templating
<html xmlns="http://www.w3.org/1999/xhtml”
xmlns:h="http://java.sun.com/jsf/html”
xmlns:ui="http://java.sun.com/jsf/
facelets">
<body>
<ui:composition template="#{template}”>
...
</ui:composition>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<context-param>
<param-name>javax.faces.view.TEMPLATE</param-
name>
<param-value>mybusiness</param-value>
</context-param>
</web-app>
Globalcode	
  –	
  Open4education
Segurança + Multi-tenancy
!   PicketLink
!  Java EE security framework
!  Identity Management (IDM)
!  Federation support (SAML, OAuth2, OpenID)
!  Social Login support
!  Multi-tenancy support
Globalcode	
  –	
  Open4education
Picketlink
Globalcode	
  –	
  Open4education
Picketlink
@Named
public class RealmSelector implements
Serializable {
@Inject
private PartitionManager partitionManager;
private Realm realm;
@Produces
@PicketLink
public Realm select() {
return this.realm;
}
…
}
@RequestScoped
public class LoginController {
@Inject
private Identity identity;
public String login() {
this.identity.login();
…
}
public String logout() {
this.identity.logout();
return "/home.xhtml";
}
}
public class Resources {
public enum REALM {acme, umbrella,
wayne}
@Produces
@Named("supportedRealms")
public Enum[] supportedRealms() {
return REALM.values();
}
Globalcode	
  –	
  Open4education
Cloud + Multi-tenancy
!   Namespace API
! com.google.appengine.api.NamespaceManager
! Suporte aos seguintes serviços
!  Google Datastore
! Memcached
!  Task Queue
!  Search
Globalcode	
  –	
  Open4education
Namespace API
// Filter to set the Google Apps
// domain as the namespace.
public class NamespaceFilter implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
// Make sure set() is only called if the current namespace is not
already set.
if (NamespaceManager.get() == null) {
NamespaceManager.set(NamespaceManager.getGoogleAppsNamespace());
}
}
}
// Assuming there is a logged in user.
namespace = UserServiceFactory.getUserService()
.getCurrentUser().getUserId();
NamespaceManager.set(namespace);
<filter>
<filter-name>NamespaceFilter</filter-name>
<filter-class>package.NamespaceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NamespaceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Globalcode	
  –	
  Open4education
Namespace API
!   Search
// Set the current namespace to "aSpace"
NamespaceManager.set("aSpace");
// Create a SearchService with the namespace "aSpace"
SearchService searchService =
SearchServiceFactory.getSearchService();
// Create a MemcacheService that uses the namespace "abc".
MemcacheService explicit =
MemcacheServiceFactory.getMemcacheService("abc");
explicit.put("key", value); // stores value in namespace "abc"
// Increment the count for the current namespace asynchronously.
QueueFactory.getDefaultQueue().add(
TaskOptions.Builder.url("/_ah/update_count")
.param("countName", "SomeRequest"));
!   Memcached
!   Task Queue
Globalcode	
  –	
  Open4education
JVM + Multi-tenancy
!   Multi-tenancy no nível da JVM
!   IBM SDK JVM
!   Static field isolation
!   Controle by tenant
!   CPU time
!   Heap size
!   Thread count
!   File IO, Socket IO
!   Limitações
!   Java Native Interface (JNI)
!   JVMT (Tool interface)
!   GUI Libraries (GWT, Swing, etc)
!   EXPERIMENTAL !!!
Globalcode	
  –	
  Open4education
JVM + Multi-tenancy
Globalcode	
  –	
  Open4education
JVM + Multi-tenancy
Globalcode	
  –	
  Open4education
Perguntas
?
Globalcode	
  –	
  Open4education
Referências
! http://msdn.microsoft.com/en-us/library/aa479086.aspx
! https://developers.google.com/appengine/docs/java/multitenancy/
! http://www.ibm.com/developerworks/java/library/j-multitenant-java/index.html
! http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/
a_multitenant.htm
! http://2012.con-fess.com/sessions/-/details/122/JSF-and-JavaEE-7-for-multi-
tenant-applications
! http://jdevelopment.nl/jsf-22/
! http://picketlink.org
! https://developers.google.com/appengine/docs/java/multitenancy/
! http://www.jboss.org/quickstarts/picketlink/picketlink-authentication-idm-multi-
tenancy/
! http://wiki.eclipse.org/EclipseLink/Examples/MySports
Globalcode	
  –	
  Open4education
Obrigado!
@rcandidosilva
rodrigocandido.me

More Related Content

PPT
Everything You Need to Know About Sharding
PDF
R3 Corda Simple Tutorial
PPTX
Connection Resiliency and Command Interception in Entity Framework
PDF
Quick bcc
PPTX
Chapter 4 terminolgy of keyvalue databses from nosql for mere mortals
PDF
MySQL developing Store Procedure
PPTX
Data warehousing Demo PPTS | Over View | Introduction
PDF
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
Everything You Need to Know About Sharding
R3 Corda Simple Tutorial
Connection Resiliency and Command Interception in Entity Framework
Quick bcc
Chapter 4 terminolgy of keyvalue databses from nosql for mere mortals
MySQL developing Store Procedure
Data warehousing Demo PPTS | Over View | Introduction
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EE

Viewers also liked (20)

PDF
JVM Multitenancy (JavaOne 2012)
PDF
Multi-tenancy in Java
PDF
JVM Support for Multitenant Applications - Steve Poole (IBM)
PDF
GUJavaSC - Unit Testing com Java EE
PDF
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
PDF
GUJavaSC - Mini-curso Java EE
PDF
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
PDF
GUJavaSC - Java EE 7 In Action
PDF
JavaOne LATAM 2015 - Batch Processing: Processamento em Lotes no Mundo Corpor...
PDF
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
PDF
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data REST
PDF
Batch Processing - Processamento em Lotes no Mundo Corporativo
PDF
GUJavaSC - Criando Micro-serviços Reativos com Java
PDF
TDC 2015 - Segurança em Recursos RESTful com OAuth2
PDF
GUJavaSC - Combinando AngularJS com Java EE
PPTX
Multi-Tenancy with Spring Boot
PDF
TDC Floripa 2016 - Decolando seus micro-serviços na Spring Cloud
PDF
JavaOne 2016 - Reactive Microservices with Java and Java EE
PDF
QCon 2015 - Combinando AngularJS com Java EE
PDF
ConFoo 2015 - Securing RESTful resources with OAuth2
JVM Multitenancy (JavaOne 2012)
Multi-tenancy in Java
JVM Support for Multitenant Applications - Steve Poole (IBM)
GUJavaSC - Unit Testing com Java EE
JavaOne LATAM 2015 - Segurança em Recursos RESTful com OAuth2
GUJavaSC - Mini-curso Java EE
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
GUJavaSC - Java EE 7 In Action
JavaOne LATAM 2015 - Batch Processing: Processamento em Lotes no Mundo Corpor...
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data REST
Batch Processing - Processamento em Lotes no Mundo Corporativo
GUJavaSC - Criando Micro-serviços Reativos com Java
TDC 2015 - Segurança em Recursos RESTful com OAuth2
GUJavaSC - Combinando AngularJS com Java EE
Multi-Tenancy with Spring Boot
TDC Floripa 2016 - Decolando seus micro-serviços na Spring Cloud
JavaOne 2016 - Reactive Microservices with Java and Java EE
QCon 2015 - Combinando AngularJS com Java EE
ConFoo 2015 - Securing RESTful resources with OAuth2
Ad

Similar to Suportando Aplicações Multi-tenancy com Java EE (20)

PPT
Android training in mumbai
PPT
Android - Anatomy of android elements & layouts
PPTX
Developing your first application using FI-WARE
PPTX
Developing your first application using FIWARE
PDF
New Features of JSR 317 (JPA 2.0)
PDF
Osiąganie mądrej architektury z Symfony2
PPTX
Java Technology
PDF
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
PPT
Android tutorial (2)
KEY
Spring in the Cloud - using Spring with Cloud Foundry
PDF
Symfony2 - from the trenches
PDF
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
PDF
What is DDD and how could it help you
PPTX
Storage Plug-ins
PDF
Hexagonal architecture in PHP
PPTX
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
PPTX
CloudStack Meetup Santa Clara
ODP
CDI @javaonehyderabad
PDF
SOA with C, C++, PHP and more
PPT
比XML更好用的Java Annotation
Android training in mumbai
Android - Anatomy of android elements & layouts
Developing your first application using FI-WARE
Developing your first application using FIWARE
New Features of JSR 317 (JPA 2.0)
Osiąganie mądrej architektury z Symfony2
Java Technology
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
Android tutorial (2)
Spring in the Cloud - using Spring with Cloud Foundry
Symfony2 - from the trenches
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
What is DDD and how could it help you
Storage Plug-ins
Hexagonal architecture in PHP
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
CloudStack Meetup Santa Clara
CDI @javaonehyderabad
SOA with C, C++, PHP and more
比XML更好用的Java Annotation
Ad

More from Rodrigo Cândido da Silva (15)

PDF
Java 9, 10 e ... 11
PDF
Cloud Native Java EE
PDF
Protegendo Microservices: Boas Práticas e Estratégias de Implementação
PDF
Protecting Java Microservices: Best Practices and Strategies
PDF
As novidades da nova versão do Java 9
PDF
Workshop Microservices - Distribuindo os Microservices com Docker e Kubernetes
PDF
Workshop Microservices - Microservices com Spring Cloud e Netflix OSS
PDF
Workshop Microservices - Construindo APIs RESTful com Spring Boot
PDF
Workshop Microservices - Arquitetura Microservices
PDF
GUJavaSC - Protegendo Microservices em Java
PDF
TDC Floripa 2017 - Criando Microservices Reativos com Java
PDF
GUJavaSC - Combinando Micro-serviços com Práticas DevOps
PDF
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
PDF
ConFoo 2015 - Supporting Multi-tenancy Applications with Java EE
PDF
JavaOne 2014 - Securing RESTful Resources with OAuth2
Java 9, 10 e ... 11
Cloud Native Java EE
Protegendo Microservices: Boas Práticas e Estratégias de Implementação
Protecting Java Microservices: Best Practices and Strategies
As novidades da nova versão do Java 9
Workshop Microservices - Distribuindo os Microservices com Docker e Kubernetes
Workshop Microservices - Microservices com Spring Cloud e Netflix OSS
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Arquitetura Microservices
GUJavaSC - Protegendo Microservices em Java
TDC Floripa 2017 - Criando Microservices Reativos com Java
GUJavaSC - Combinando Micro-serviços com Práticas DevOps
QCon SP 2016 - Construindo Microservices Auto-curáveis com Spring Cloud e Net...
ConFoo 2015 - Supporting Multi-tenancy Applications with Java EE
JavaOne 2014 - Securing RESTful Resources with OAuth2

Recently uploaded (20)

PDF
Cost to Outsource Software Development in 2025
PDF
iTop VPN Free 5.6.0.5262 Crack latest version 2025
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
history of c programming in notes for students .pptx
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
AutoCAD Professional Crack 2025 With License Key
PPTX
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
PPTX
Patient Appointment Booking in Odoo with online payment
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
17 Powerful Integrations Your Next-Gen MLM Software Needs
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Download FL Studio Crack Latest version 2025 ?
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
DOCX
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps
Cost to Outsource Software Development in 2025
iTop VPN Free 5.6.0.5262 Crack latest version 2025
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
history of c programming in notes for students .pptx
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
wealthsignaloriginal-com-DS-text-... (1).pdf
AutoCAD Professional Crack 2025 With License Key
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
Patient Appointment Booking in Odoo with online payment
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
17 Powerful Integrations Your Next-Gen MLM Software Needs
Navsoft: AI-Powered Business Solutions & Custom Software Development
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Download FL Studio Crack Latest version 2025 ?
How to Choose the Right IT Partner for Your Business in Malaysia
Greta — No-Code AI for Building Full-Stack Web & Mobile Apps

Suportando Aplicações Multi-tenancy com Java EE

  • 1. Globalcode  –  Open4education Suportando Aplicações Multi-tenancy com Java EE Rodrigo Cândido da Silva @rcandidosilva
  • 2. Globalcode  –  Open4education Agenda !   Modelos de Serviço !   SaaS Market !   Multi-tenancy !  Desafios !  Pros and Cons !  Tipos de Implementação !   Java EE + Multi-tenancy !   Segurança + Multi-tenancy !   Cloud + Multi-tenancy !   JVM Multi-tenancy
  • 5. Globalcode  –  Open4education Multi-tenancy !   Uma única instância da aplicação atendendo múltiplos clientes (tenant) ! Contrário da arquitetura de múltiplas instâncias
  • 8. Globalcode  –  Open4education Desafios !   Separação dos dados !   Personalização !   Controle de acesso !   Provisionamento de recursos !   Integrações !   Atualização da aplicação !   Recuperação à falhas
  • 9. Globalcode  –  Open4education Pros and Cons !   Pros ! Reduz o custo de manutenção ! Único código para todos os clientes ! Aumenta a escalabilidade ! Beneficia compartilhamento recursos entre clientes !   Cons ! Aumenta a complexidade ! Separação por tenant-id ! Maior risco de falhas ! Quebra da aplicação compartilhada para todos clientes ! Reduz a flexibilidade para os clientes
  • 10. Globalcode  –  Open4education Multi-tenancy !   4 possíveis níveis implementações ! Nível 1 (Personalizado) !  [N] aplicações e [N] databases ! Nível 2 (Configurável) !  [1] aplicação e [N] databases ! Nível 3 (Configurável e eficiente) !  [N] aplicações e [1] database ! Nível 4 (Escalável, configurável e eficiente) !  [1] aplicação e [1] database
  • 11. Globalcode  –  Open4education Nível 1 - Personalizado !   [N] aplicações e [N] databases
  • 12. Globalcode  –  Open4education Nível 2 - Configurável !   [1] aplicação e [N] databases
  • 13. Globalcode  –  Open4education Nível 3 - Eficiente !   [N] aplicações e [1] database
  • 14. Globalcode  –  Open4education Nível 4 - Escalável !   [1] aplicação e [1] database
  • 15. Globalcode  –  Open4education Java EE + Multi-tenancy !   Database !  JPA + Multi-tenancy !   Customização UI !  JSF + Multi-tenancy !   Segurança !   Java EE 8 com suporte Cloud
  • 16. Globalcode  –  Open4education JPA + Multi-tenancy !   EclipseLink !  Suporte a multi-tenancy @Multitenant !  Disponibiliza 3 estratégias !  @Multitenant(SINGLE_TABLE) – default !  @Multitenant(TABLE_PER_TENANT) !  @Multitenant(VPD) !  Shared Cache by tenant
  • 17. Globalcode  –  Open4education EclipseLink SINGLE_TABLE @Entity @Table(name=“EMP”) @Multitenant(SINGLE_TABLE) @TenantDiscriminatorColumn(name = “TENANT_ID”, contextProperty = “tenant-id”) public class Employee { ... } HashMap properties = new HashMap(); properties.put("tenant.id", "707"); ... EntityManager em = Persistence .createEntityManagerFactory( "multi-tenant”,properties) .createEntityManager(); <persistence-unit name="multi-tenant"> ... <properties> <property name="tenant.id" value="707"/> ... </properties> </persistence-unit>
  • 18. Globalcode  –  Open4education EclipseLink TABLE_PER_TENANT <entity class="Employee"> <multitenant type="TABLE_PER_TENANT"> <tenant-table-discriminator type="SCHEMA" context- property="eclipselink.tenant-id"/> </multitenant> <table name="EMP"> ... </entity> @Entity @Table(name=“EMP”) @Multitenant(TABLE_PER_TENANT) @TenantTableDiscriminator(type=SCHEMA, contextProperty="eclipselink.tenant-id") public class Employee { ... }
  • 19. Globalcode  –  Open4education EclipseLink VPD @Entity @Multitenant @TenantDiscriminatorColumn(name = "USER_ID", contextProperty = "tenant.id") @Cacheable(false) public class Task implements Serializable { ... CALL DBMS_RLS.ADD_POLICY ('SCOTT', 'TASK', 'todo_list_policy', 'SCOTT', 'ident_func', 'select, update, delete')); <properties> <property name="eclipselink.session.customizer" value="example.VPDSessionCustomizer" /> <property name="eclipselink.session-event-listener" value="example.VPDSessionEventAdapter" /> <property name="eclipselink.jdbc.exclusive-connection.mode" value="Always" /> </properties>
  • 20. Globalcode  –  Open4education JPA Caching !   Shared Cache disabled
  • 21. Globalcode  –  Open4education JPA Caching !   Shared Cache by tenant
  • 22. Globalcode  –  Open4education JSF + Multi-tenancy !   Arquitetura extensível !   Artefatos podem ser encapsulados em JARs !   Composição at runtime !   Templates !   Resource library !   Look-and-feel customization !   RenderKit !   Localization
  • 23. Globalcode  –  Open4education JSF Facelets The Facelets Gazette Site Navigation ●Events ●Docs ●Forums About Contact Site Map Template File name _template.html Insertion points Resources css classes, scripts, images
  • 24. Globalcode  –  Open4education JSF Multi-templating contractA • Declared Templates • Declared Insertion Points • Declared Resources contractB • Declared Templates • Declared Insertion Points • Declared Resources contractC • Declared Templates • Declared Insertion Points • Declared Resources <web-app-root>/contracts contractD • Declared Templates • Declared Insertion Points • Declared Resources contractE • Declared Templates • Declared Insertion Points • Declared Resources contractF • Declared Templates • Declared Insertion Points • Declared Resources JAR files in WEB-INF/lib contractA • Declared Templates • Declared Insertion Points • Declared Resources contractB • Declared Templates • Declared Insertion Points • Declared Resources contractC • Declared Templates • Declared Insertion Points • Declared Resources <web-app-root>/contracts contractD • Declared Templates • Declared Insertion Points • Declared Resources contractE • Declared Templates • Declared Insertion Points • Declared Resources contractF • Declared Templates • Declared Insertion Points • Declared Resources JAR files in WEB-INF/lib Set of available contracts Facelet 1 Facelet 3Facelet 2 faces-config.xml
  • 25. Globalcode  –  Open4education JSF Multi-templating <html xmlns="http://www.w3.org/1999/xhtml” xmlns:h="http://java.sun.com/jsf/html” xmlns:ui="http://java.sun.com/jsf/ facelets"> <body> <ui:composition template="#{template}”> ... </ui:composition> </body> </html> <?xml version="1.0" encoding="UTF-8"?> <web-app> <context-param> <param-name>javax.faces.view.TEMPLATE</param- name> <param-value>mybusiness</param-value> </context-param> </web-app>
  • 26. Globalcode  –  Open4education Segurança + Multi-tenancy !   PicketLink !  Java EE security framework !  Identity Management (IDM) !  Federation support (SAML, OAuth2, OpenID) !  Social Login support !  Multi-tenancy support
  • 28. Globalcode  –  Open4education Picketlink @Named public class RealmSelector implements Serializable { @Inject private PartitionManager partitionManager; private Realm realm; @Produces @PicketLink public Realm select() { return this.realm; } … } @RequestScoped public class LoginController { @Inject private Identity identity; public String login() { this.identity.login(); … } public String logout() { this.identity.logout(); return "/home.xhtml"; } } public class Resources { public enum REALM {acme, umbrella, wayne} @Produces @Named("supportedRealms") public Enum[] supportedRealms() { return REALM.values(); }
  • 29. Globalcode  –  Open4education Cloud + Multi-tenancy !   Namespace API ! com.google.appengine.api.NamespaceManager ! Suporte aos seguintes serviços !  Google Datastore ! Memcached !  Task Queue !  Search
  • 30. Globalcode  –  Open4education Namespace API // Filter to set the Google Apps // domain as the namespace. public class NamespaceFilter implements javax.servlet.Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // Make sure set() is only called if the current namespace is not already set. if (NamespaceManager.get() == null) { NamespaceManager.set(NamespaceManager.getGoogleAppsNamespace()); } } } // Assuming there is a logged in user. namespace = UserServiceFactory.getUserService() .getCurrentUser().getUserId(); NamespaceManager.set(namespace); <filter> <filter-name>NamespaceFilter</filter-name> <filter-class>package.NamespaceFilter</filter-class> </filter> <filter-mapping> <filter-name>NamespaceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
  • 31. Globalcode  –  Open4education Namespace API !   Search // Set the current namespace to "aSpace" NamespaceManager.set("aSpace"); // Create a SearchService with the namespace "aSpace" SearchService searchService = SearchServiceFactory.getSearchService(); // Create a MemcacheService that uses the namespace "abc". MemcacheService explicit = MemcacheServiceFactory.getMemcacheService("abc"); explicit.put("key", value); // stores value in namespace "abc" // Increment the count for the current namespace asynchronously. QueueFactory.getDefaultQueue().add( TaskOptions.Builder.url("/_ah/update_count") .param("countName", "SomeRequest")); !   Memcached !   Task Queue
  • 32. Globalcode  –  Open4education JVM + Multi-tenancy !   Multi-tenancy no nível da JVM !   IBM SDK JVM !   Static field isolation !   Controle by tenant !   CPU time !   Heap size !   Thread count !   File IO, Socket IO !   Limitações !   Java Native Interface (JNI) !   JVMT (Tool interface) !   GUI Libraries (GWT, Swing, etc) !   EXPERIMENTAL !!!
  • 36. Globalcode  –  Open4education Referências ! http://msdn.microsoft.com/en-us/library/aa479086.aspx ! https://developers.google.com/appengine/docs/java/multitenancy/ ! http://www.ibm.com/developerworks/java/library/j-multitenant-java/index.html ! http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/ a_multitenant.htm ! http://2012.con-fess.com/sessions/-/details/122/JSF-and-JavaEE-7-for-multi- tenant-applications ! http://jdevelopment.nl/jsf-22/ ! http://picketlink.org ! https://developers.google.com/appengine/docs/java/multitenancy/ ! http://www.jboss.org/quickstarts/picketlink/picketlink-authentication-idm-multi- tenancy/ ! http://wiki.eclipse.org/EclipseLink/Examples/MySports