JBoss Class Loader Overview do modelo de Class Loader no JBoss AS
Java Class Loader <ul><li>Tipo x Classe </li></ul><ul><ul><li>Class Type : Nome totalmente qualificado da classe </li></ul...
Java Class Loader <ul><li>Regra geral segundo o JavaDoc da API: Sempre que uma classe/recurso for requisita, uma instância...
Java Class Loader <ul><li>Para mais detalhes sobre o funcionamento e modelo do  Class Loader  Java consulte: </li></ul><ul...
Class loader no JBoss AS   Unifield Class Loader <ul><li>O Componente central deste modelo é o:  org.jboss.mx.loading.Unif...
Unifield Class loader <ul><li>Deployers  usam o UCL de nível mais alto como um  class loader  compartilhado e então todos ...
Esquema de Class Loader no JBoss AS <ul><li>Veja o diagrama não muito didático... </li></ul>Jboss AS Guide – ch 2 [1] ® Ra...
Sequência de carregamento de classes e recursos <ul><li>A seguinte seqüência de passos ocorre quando o método  UnfiedClass...
Sequência de carregamento de classes e recursos... <ul><li>&quot;2.2 Caso contrário – a classe não foi encontrada nas URLs...
C lass loading  no JBoss AS... ® Rafael Torres  2008 JBossClassLoadingUseCases (wiki.jboss.org) [2]
Descrição mais detalhada: wiki.jboss.org... <ul><li>JBossClassLoadingUseCases : </li></ul><ul><ul><li>https://www.jboss.or...
Aplicações WEB ® Rafael Torres  2008 <ul><li>Java™ Servlet Specification Version 2.3 </li></ul>
Visibilidade entre  class loaders  no AS ® Rafael Torres  2008 JBoss in Action – Figura 3.3 [4]
Visibilidade entre class loaders no AS <ul><li>No diagrama  anterior classes de um certo nível possuem acesso/visibilidade...
java2ParentDelegation <ul><li>O default é  true  para aplicações  JEE .  Exceto para WEB Apps (Servlet spec. 2.3) </li></u...
Níveis de class loader <ul><li>No nível mais baixo estão as classes do classpath da JVM (rt.jar, tools.jar, etc) e as clas...
Classes/Bibliotecas compartilhadas <ul><li>O esquema de class loader compartilhado no AS é conveniente quando se deseja co...
J2ee Specification <ul><li>J2EE 1.4 Specification </li></ul><ul><ul><li>&quot;There must be only one version of each class...
Scoping class <ul><li>Neste esquema você pode definir um  class loader  repository específico para sua APP – um repositóri...
Scoping classes <ul><ul><li>Em um arquivo SAR (META-INF/jboss-service.xml): </li></ul></ul><ul><ul><li>Em um arquivo EAR (...
Escopo de classes –  HierarchicalLoaderRepository3 <ul><li>Visualizando o  Class Loader  isolado de uma Aplicação no JMX C...
Alguns testes... <ul><li>Cenário 1: </li></ul><ul><ul><li>com.mycompany.mylibs.ClassA v1 (lib.jar) em App1.ear  </li></ul>...
Alguns testes... <ul><li>Cenário 2: </li></ul><ul><ul><li>com.mycompany.mylibs.ClassA  v1  (lib.jar) em APP1.ear  </li></u...
Alguns testes... <ul><li>Cenário 3: </li></ul><ul><ul><li>com.mycompany.mylibs.ClassA  v1  (lib.jar)  removido  de APP1.ea...
Alguns testes... <ul><li>Cenário 4: </li></ul><ul><ul><li>2 EARs (App1 e APP2) </li></ul></ul><ul><ul><li>com.mycompany.my...
Alguns testes... <ul><li>Cenário 5  - o mais complexo </li></ul><ul><ul><li>2 EARs (App1 e APP2) ambos com EJBs  Statless ...
Call-by-value X Call-by-reference no JBoss <ul><li>Naming Service: server/default/conf/jboss-service.xml </li></ul>... <mb...
No JBoss... <ul><li>Cenário 5 com a configuração padrão do JBoss:  </li></ul><ul><ul><li>Chamada remota </li></ul></ul><ul...
No JBoss... ® Rafael Torres  2008
Leitura recomendada: <ul><li>Dynamic Class Loading in the Java™ virtual Machine </li></ul><ul><ul><li>http://www.cs.purdue...
Referências <ul><li>[1]  http://docs.jboss.org/jbossas/jboss4guide/r4/html/ch2.chapter.html#ch2.loadarch.fig </li></ul><ul...
Upcoming SlideShare
Loading in …5
×

JBossClassLoader

3,056 views

Published on

Breve introdução ao modelo de class loader do JBoss AS.

Published in: Technology
2 Comments
4 Likes
Statistics
Notes
No Downloads
Views
Total views
3,056
On SlideShare
0
From Embeds
0
Number of Embeds
436
Actions
Shares
0
Downloads
56
Comments
2
Likes
4
Embeds 0
No embeds

No notes for slide
  • JBossClassLoader

    1. 1. JBoss Class Loader Overview do modelo de Class Loader no JBoss AS
    2. 2. Java Class Loader <ul><li>Tipo x Classe </li></ul><ul><ul><li>Class Type : Nome totalmente qualificado da classe </li></ul></ul><ul><ul><ul><li>Ex: com.mycompany.MyClass </li></ul></ul></ul><ul><ul><li>Class : formado pelo class type e pelo class loader responsável por carregar ( byte code ) e definir o tipo. </li></ul></ul><ul><ul><ul><li>Enfim uma instância de java.lang.class – byte code carregado </li></ul></ul></ul><ul><ul><ul><li>JavaDoc : &quot; Every Class object contains a reference to the ClassLoader that defined it.&quot; </li></ul></ul></ul>® Rafael Torres 2008
    3. 3. Java Class Loader <ul><li>Regra geral segundo o JavaDoc da API: Sempre que uma classe/recurso for requisita, uma instância de Class Loader irá delegar a busca primeiro para o Class Loader pai. Somente se o pai não puder carregar a classe, a instância do class loader em questão deve carregar. </li></ul><ul><li>Exceção a regra : em alguns casos é necessário reduzir o escopo de uma determinada classe/recurso. Neste caso o próprio class loader solicitado carrega a classe. </li></ul><ul><ul><li>Este é o caso dos servlet containers e dos EJB containers . </li></ul></ul><ul><ul><li>Nesta situação um class loader pode ter apenas uma única representação de um tipo carregada. Isso significa, por exemplo, que você só pode ter um único class type com.mycompany.MyClass em um mesmo class loader. </li></ul></ul>® Rafael Torres 2008
    4. 4. Java Class Loader <ul><li>Para mais detalhes sobre o funcionamento e modelo do Class Loader Java consulte: </li></ul><ul><ul><li>Dynamic Class Loading in the Java™ virtual Machine: http://www.cs.purdue.edu/homes/jv/smc/pubs/liang-oopsla98.pdf (Esse é das raízes mesmo...  ) </li></ul></ul><ul><ul><li>Understanding the Java Classloading Mechanism </li></ul></ul><ul><ul><ul><li>http://java.sys-con.com/node/37659/print </li></ul></ul></ul>® Rafael Torres 2008
    5. 5. Class loader no JBoss AS Unifield Class Loader <ul><li>O Componente central deste modelo é o: org.jboss.mx.loading.UnifiedClassLoader3 (UCL) </li></ul><ul><ul><li>Esse cara estende a classe java.net.URLClassLoader do Java e sobrescreve o comportamento padrão do modelo &quot;parent delegation&quot; : </li></ul></ul><ul><ul><ul><li>JavaDoc API: &quot; The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader &quot; </li></ul></ul></ul><ul><ul><li>Usa um repositório compartilhado de classes e recursos: </li></ul></ul><ul><ul><ul><li>org.jboss.mx.loading.UnifiedLoaderRepository3 (ULR) </li></ul></ul></ul><ul><ul><li>Neste modelo cada UCL é associado à um único UnifieldLoaderRepository3 , e um ULR por sua vez tem vários UCLs associados. </li></ul></ul><ul><ul><li>Um UCL pode ter várias URLs (endereços de classes/jars/libs) associadas a ele para o carregamento ( loading ) de classes e recursos. </li></ul></ul>® Rafael Torres 2008
    6. 6. Unifield Class loader <ul><li>Deployers usam o UCL de nível mais alto como um class loader compartilhado e então todos os pacotes de deploy (WAR, SAR, EAR, HAR, etc) são associados a este class loader. </li></ul><ul><li>Quando um UCL é solicitado para carregar uma classe ele: </li></ul><ul><ul><li>Verifica no repositório ( UnifieldLoaderRepository3 ) com o qual ele está associado se a classe já foi carregada. </li></ul></ul><ul><ul><li>O UCL carregará a classe apenas se ela ainda não existir no repositório. </li></ul></ul><ul><li>Por padrão existe apenas 1 repositório (ULR) compartilhado para todas as instâncias de UCLs. </li></ul><ul><ul><li>Isto significa que as instâncias de UCLs formam um único espaço de nomes para o class loader. </li></ul></ul>® Rafael Torres 2008
    7. 7. Esquema de Class Loader no JBoss AS <ul><li>Veja o diagrama não muito didático... </li></ul>Jboss AS Guide – ch 2 [1] ® Rafael Torres 2008
    8. 8. Sequência de carregamento de classes e recursos <ul><li>A seguinte seqüência de passos ocorre quando o método UnfiedClassLoader3.loadClass(String, boolean) é invocado: </li></ul>1. Verifica se a classe já foi carregada antes Cache: contém classe que já foram carregadas por uma instância do UCL abc.class xyz.class Arq.properties ... URLs: locais onde as classes, pacotes estão armazenados: direório deploy, lib, etc 2. Procura a classe nos URLClassLoaders ou se está visível em um class loader pai. 2.1 Se a classe foi encontra, é colocada no cache (ULR) e retornada para uso... Jboss AS Guide – ch 2 [1] 2.2 próximo slide... ® Rafael Torres 2008
    9. 9. Sequência de carregamento de classes e recursos... <ul><li>&quot;2.2 Caso contrário – a classe não foi encontrada nas URLs associadas aos UCLs – O repositório cache (ULR) é consultado para todos os UCLs que sejam capazes de fornecer a classe com base no mapeamento de nome de pacotes/UCL. </li></ul><ul><li>Quando um UCL é adicionado (associado) ao repositório cache (repositório ULR3 – que é único) é estabelecida uma associação entre os nomes de pacotes disponíveis nas URLs associadas ao UCL em questão. </li></ul><ul><li>Isso permite determinar qual UCL é capaz de carregar uma determinada classe. </li></ul><ul><li>Os UCLs são consultados sobre a classe requisitada na ordem em que os UCLs foram adicionados ao repositório (ULR3). </li></ul><ul><li>Nesta busca, se algum UCL for capaz de carregar a classe, ela é retornada, caso contrário um </li></ul><ul><li>java.lang.ClassNotFoundException é lançado.&quot; [1] </li></ul>® Rafael Torres 2008 Jboss AS Guide – ch 2 [1]
    10. 10. C lass loading no JBoss AS... ® Rafael Torres 2008 JBossClassLoadingUseCases (wiki.jboss.org) [2]
    11. 11. Descrição mais detalhada: wiki.jboss.org... <ul><li>JBossClassLoadingUseCases : </li></ul><ul><ul><li>https://www.jboss.org/community/docs/DOC-10290 </li></ul></ul>® Rafael Torres 2008
    12. 12. Aplicações WEB ® Rafael Torres 2008 <ul><li>Java™ Servlet Specification Version 2.3 </li></ul>
    13. 13. Visibilidade entre class loaders no AS ® Rafael Torres 2008 JBoss in Action – Figura 3.3 [4]
    14. 14. Visibilidade entre class loaders no AS <ul><li>No diagrama anterior classes de um certo nível possuem acesso/visibilidade à classes do mesmo nível ou de um nível mais baixo, mas não o contrário. </li></ul><ul><li>Para alterar este comportamento padrão (definido na Servltet spec 2.3) os seguintes atributos devem ser alterados: </li></ul><ul><li><!-- Get the flag indicating if the normal Java2 parent first class </li></ul><ul><li>loading model should be used over the servlet 2.3 web container first </li></ul><ul><li>model. </li></ul><ul><li>--> </li></ul><ul><li><attribute name=&quot;Java2ClassLoadingCompliance&quot;>false</attribute> </li></ul><ul><li><!-- A flag indicating if the JBoss Loader should be used. This loader </li></ul><ul><li>uses a unified class loader as the class loader rather than the tomcat </li></ul><ul><li>specific class loader. </li></ul><ul><li>The default is false to ensure that wars have isolated class loading </li></ul><ul><li>for duplicate jars and jsp files. </li></ul><ul><li>--> </li></ul><ul><li><attribute name=&quot;UseJBossWebLoader&quot;>false</attribute> </li></ul><ul><li>O arquivo com essa config está em JBOSS_HOME/server/MyConfig/deploy/jboss-web.deployer/META-INF/jboss-service.xml </li></ul><ul><li>ATENÇÃO: está alteração pode causar efeitos colaterais indesejáveis. Não haverá isolamento de class loader – suas classes ficarão visíveis como se estivesse em um único espaço compartilhado. </li></ul>® Rafael Torres 2008
    15. 15. java2ParentDelegation <ul><li>O default é true para aplicações JEE . Exceto para WEB Apps (Servlet spec. 2.3) </li></ul><ul><li>java2ParentDelegation=false </li></ul><ul><ul><li>Força o JBoss usar a versão da classe localizada dentro do repositório isolado da APP (EAR, SAR, WAR, etc) – se houver mais de uma versão de classe carregada no repositório. </li></ul></ul><ul><ul><li>Se a classe não puder ser carregada pelo UCL da APP, o JBoss busca em seu próprio UCL (server/xxx/lib, JBOSS_HOME/lib, etc). </li></ul></ul>® Rafael Torres 2008
    16. 16. Níveis de class loader <ul><li>No nível mais baixo estão as classes do classpath da JVM (rt.jar, tools.jar, etc) e as classes usadas na inicialização do AS encontradas no diretório JBOSS_HOME/lib . </li></ul><ul><li>O próximo nível contém classes compartilhadas para as aplicações deployadas no AS em JBOSS_HOME/server/<server-config>/deploy e as bibliotecas disponíveis em JBOSS_HOME/server/<server-config>/lib . </li></ul><ul><li>O nível mais alto representa classes contidas em um arquivo WAR , o qual pode estar contido dentro do diretório deploy ou dentro de um pacote EAR ou SAR. </li></ul>® Rafael Torres 2008
    17. 17. Classes/Bibliotecas compartilhadas <ul><li>O esquema de class loader compartilhado no AS é conveniente quando se deseja compartilhar suas bibliotecas de classes com todas as aplicações. </li></ul><ul><li>Se suas aplicações não puderem compartilhar bibliotecas de classes para evitar conflito entre versões, você precisará isolar o class loader da aplicação. </li></ul><ul><li>Sem isolamento de class loader alguns problemas podem ser encontrados: </li></ul><ul><ul><li>ClassCastException, </li></ul></ul><ul><ul><li>IllegalAccessErrors, </li></ul></ul><ul><ul><li>VerifyErrors e </li></ul></ul><ul><ul><li>Alguns comportamentos estranhos durantes novos deploys/redeploys/undeploy. </li></ul></ul><ul><li>Para isso é necessário utilizar o mecanismo de escopo de classes. </li></ul>® Rafael Torres 2008
    18. 18. J2ee Specification <ul><li>J2EE 1.4 Specification </li></ul><ul><ul><li>&quot;There must be only one version of each class in an application.&quot; </li></ul></ul><ul><ul><li>&quot;All components in a single application may be loaded in a single class loader and share a single namespace. &quot; </li></ul></ul>® Rafael Torres 2008
    19. 19. Scoping class <ul><li>Neste esquema você pode definir um class loader repository específico para sua APP – um repositório isolado. </li></ul><ul><ul><li>HierarchicalClassLoader3 </li></ul></ul><ul><li>É possível fazer isso definindo um class loader repository em um arquivo de configuração descritor específico para o JBoss AS. </li></ul>® Rafael Torres 2008
    20. 20. Scoping classes <ul><ul><li>Em um arquivo SAR (META-INF/jboss-service.xml): </li></ul></ul><ul><ul><li>Em um arquivo EAR (META-INF/jboss-app.xml): </li></ul></ul><ul><ul><li>Em um arquivo WAR(WEB-INF/jboss-web.xml): </li></ul></ul><service> <loader-repository>jbia.loader:loader=Loader1</loader-repository> . . . </service> <jboss-app> <loader-repository>jbia.loader:loader=Loader2</loader-repository> . . . </jboss-app> <jboss-web> <class-loading> <loader-repository>jbia.loader:loader=Loader3</loader-repository> </class-loading> . . . </jboss-web> ® Rafael Torres 2008
    21. 21. Escopo de classes – HierarchicalLoaderRepository3 <ul><li>Visualizando o Class Loader isolado de uma Aplicação no JMX Console do JBoss. </li></ul>® Rafael Torres 2008
    22. 22. Alguns testes... <ul><li>Cenário 1: </li></ul><ul><ul><li>com.mycompany.mylibs.ClassA v1 (lib.jar) em App1.ear </li></ul></ul><ul><ul><li>com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib </li></ul></ul><ul><ul><li>displayClassInfo() JMX Mbean Operation: </li></ul></ul>com.mycompany.mylibs.ClassA Information Not loaded in repository cache ### Instance0 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@18a49e0 { url=null , addedOrder=2 } ### Instance1 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@e8709d { url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ , addedOrder=38 } <ul><li>De qual UCL a classe será retornada? </li></ul><ul><ul><li>Observe a ordem em que o UCL foi associado ao repositório... </li></ul></ul>17:38:09,934 INFO [STDOUT] Eu sou a versao 2 da classe A 17:38:09,934 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@e8709d{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=38} ® Rafael Torres 2008 <ul><li>A classe foi requisitada para o UCL do EAR ( addedOrder=38 ), mas quem retornou foi o UCL associado à URL server/default/lib ( addedOrder=2 )! </li></ul>
    23. 23. Alguns testes... <ul><li>Cenário 2: </li></ul><ul><ul><li>com.mycompany.mylibs.ClassA v1 (lib.jar) em APP1.ear </li></ul></ul><ul><ul><li>com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib </li></ul></ul><ul><ul><li>Escopo de classe declarado </li></ul></ul>com.mycompany.mylibs.ClassA Information Not loaded in repository cache ### Instance 0 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@16d2633{ url=null ,addedOrder=2} <ul><li>De qual UCL a classe será retornada? </li></ul><ul><ul><li>Observe a ordem em que o UCL foi associado ao repositório... </li></ul></ul>10:42:23,635 INFO [STDOUT] logA(): Eu sou a versao 1 da classe A 10:42:23,636 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@557d7e{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=36} <ul><ul><li>displayClassInfo() JMX Mbean Operation: </li></ul></ul><jboss-app> <loader-repository> EJBTest.loader:loader=Loader1 </loader-repository> </jboss-app> ® Rafael Torres 2008 Observe que agora a classe aparece apenas no UCL do AS, pois foi encontrada em server/xxx/lib.
    24. 24. Alguns testes... <ul><li>Cenário 3: </li></ul><ul><ul><li>com.mycompany.mylibs.ClassA v1 (lib.jar) removido de APP1.ear </li></ul></ul><ul><ul><li>com.mycompany.mylibs.ClassA v2 (lib.jar) em server/default/lib </li></ul></ul><ul><ul><li>Escopo de classe declarado </li></ul></ul><ul><ul><li>java2ParentDelegation desligado! </li></ul></ul>com.mycompany.mylibs.ClassA Information Not loaded in repository cache ### Instance 0 found in UCL: org.jboss.mx.loading.UnifiedClassLoader3@16d2633{ url=null ,addedOrder=2} <ul><li>De qual UCL a classe será retornada? </li></ul><ul><ul><li>Observe a ordem em que o UCL foi associado ao repositório... </li></ul></ul>10:58:49,844 INFO [STDOUT] Eu sou a versao 2 da classe A 10:58:49,844 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@348ab2{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=36} <ul><ul><li>displayClassInfo() JMX Mbean Operation: </li></ul></ul><jboss-app> <loader-repository> EJBTest.loader:loader=Loader1 <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> </jboss-app> ® Rafael Torres 2008 No Loader1 (escopo de classe) a classe A não foi carregada! Foi removida de dentro do EAR. O objetivo é verificar se o JBoss encontrará a classe no UCL pai (do AS: server/xxx/lib).
    25. 25. Alguns testes... <ul><li>Cenário 4: </li></ul><ul><ul><li>2 EARs (App1 e APP2) </li></ul></ul><ul><ul><li>com.mycompany.mylibs.ClassA v1 (lib.jar) removido de App1.ear </li></ul></ul><ul><ul><li>App1.ear com escopo de classe! </li></ul></ul><ul><ul><li>com.mycompany.mylibs.ClassA v2 (lib.jar) em App2.ear </li></ul></ul><ul><ul><li>App2.ear sem escopo de classe. </li></ul></ul><ul><ul><li>displayClassInfo() JMX Mbean Operation : </li></ul></ul>com.mycompany.mylibs.ClassA Information Not loaded in repository cache <ul><li>De qual UCL a classe será retornada? </li></ul><ul><ul><li>Observe a ordem em que o UCL foi associado ao repositório... </li></ul></ul>13:13:41,961 INFO [STDOUT] logA(): Eu sou a versao 1 da classe A 13:13:41,962 INFO [STDOUT] logA(): ContextClassLoader - org.jboss.mx.loading.UnifiedClassLoader3@6196fc{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App1.ear/ ,addedOrder=36} <ul><ul><li>antes de invocar o EJB de APP1.ear : </li></ul></ul>com.mycompany.mylibs.ClassA Information Repository cache version: com.mycompany.mylibs.ClassA(1bb6976). ClassLoader=org.jboss.mx.loading.UnifiedClassLoader3@efae3b{ url=file:/C:/java/tools/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/App2.ear/ ,addedOrder=37 } <ul><ul><li>depois de invocar o EJB de APP1.ear : </li></ul></ul>® Rafael Torres 2008 Neste cenário apenas App2.ear contem a ClasseA v2. Chamaremos o EJB de App1 que não possui/carrega ClasseA. O UCL solicitado foi o de App1.ear, porém que retornou ClasseA foi o UCL de App2.ear Podemos concluir com isso que mesmo empacotando duas APPs em EAR separados as classes são compartilhadas em um mesmo espaço no AS. A menos que se isole o ClassLoader das duas Apps. Nesse caso este último teste retornaria ClassNotfoundException.
    26. 26. Alguns testes... <ul><li>Cenário 5 - o mais complexo </li></ul><ul><ul><li>2 EARs (App1 e APP2) ambos com EJBs Statless Session Bean </li></ul></ul><ul><ul><li>Interface remota/local em EJBTestClient.jar: </li></ul></ul><ul><ul><ul><li>sever/default/deploy/EJBTestClient.jar - class loader compartilhado... </li></ul></ul></ul><ul><ul><li>com.mycompany.mylibs.ClassA (lib.jar) no class path do EAR: </li></ul></ul><ul><ul><ul><li>App1.ear/lib/lib.jar </li></ul></ul></ul><ul><ul><ul><li>App2.ear/lib/lib.jar </li></ul></ul></ul><ul><ul><li>Ambos com escopo de classe </li></ul></ul><ul><ul><ul><li>duas opções: </li></ul></ul></ul><ul><ul><ul><ul><li>alterar ear-deployer.xml: atrbuto Isolated true </li></ul></ul></ul></ul><ul><ul><ul><ul><li>definir o class loader em jboss-app.xml como visto anteriormente </li></ul></ul></ul></ul><ul><ul><li>Dois comportamentos distintos e estranhos </li></ul></ul><ul><ul><ul><li>Chamada remota (call-by-value) com o ônus da serialização </li></ul></ul></ul><ul><ul><ul><li>Chamada local (call-by-reference) na mesma JVM </li></ul></ul></ul>® Rafael Torres 2008
    27. 27. Call-by-value X Call-by-reference no JBoss <ul><li>Naming Service: server/default/conf/jboss-service.xml </li></ul>... <mbean code=&quot;org.jboss.naming.NamingService&quot; name=&quot;jboss:service=Naming&quot; xmbean-dd=&quot;resource:xmdesc/NamingService-xmbean.xml&quot;> <!-- The call by value mode. true if all lookups are unmarshalled using the caller's TCL, false if in VM lookups return the value by reference. --> <attribute name=&quot;CallByValue&quot;>false</attribute> <ul><li>EAR Deployer Service: server/default/deploy/ear-deployer.xml </li></ul><!-- EAR deployer, remove if you are not using ear deployments --> <mbean code=&quot;org.jboss.deployment.EARDeployer&quot; name=&quot;jboss.j2ee:service=EARDeployer&quot;> <!-- A flag indicating if ear deployments should have their own scoped class loader to isolate their classes from other deployments. --> <attribute name=&quot;Isolated&quot;>false</attribute> <!-- A flag indicating if the ear components should have in VM call optimization disabled. --> <attribute name=&quot;CallByValue&quot;>false</attribute> ® Rafael Torres 2008
    28. 28. No JBoss... <ul><li>Cenário 5 com a configuração padrão do JBoss: </li></ul><ul><ul><li>Chamada remota </li></ul></ul><ul><ul><ul><li>ERROR [STDERR] java.lang.ClassCastException: $Proxy65... </li></ul></ul></ul><ul><ul><ul><li>O JBoss tenta otimizar os lookups feitos dentro da mesma VM: call-by-reference </li></ul></ul></ul><ul><ul><ul><ul><li>Workaround : </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>alterar Call-By-Value true em Naming Service (conf/jboss-service.xml) </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Isso faz com que todo lookup seja serializado (call-by-value) </li></ul></ul></ul></ul></ul><ul><ul><ul><li>Após alteração: </li></ul></ul></ul><ul><ul><ul><ul><li>Tudo funciona! </li></ul></ul></ul></ul>® Rafael Torres 2008
    29. 29. No JBoss... ® Rafael Torres 2008
    30. 30. Leitura recomendada: <ul><li>Dynamic Class Loading in the Java™ virtual Machine </li></ul><ul><ul><li>http://www.cs.purdue.edu/homes/jv/smc/pubs/liang-oopsla98.pdf </li></ul></ul><ul><li>Understanding the Java Classloading Mechanism </li></ul><ul><ul><li>http://java.sys-con.com/node/37659/print </li></ul></ul><ul><li>Java SE 6 API </li></ul><ul><ul><li>http://java.sun.com/javase/6/docs/api/java/lang/ClassLoader.html </li></ul></ul><ul><li>Classloading e o porquê você deveria ao menos saber como isso funciona </li></ul><ul><ul><li>http://nullability.org/?p=95 </li></ul></ul><ul><li>Classloader hell </li></ul><ul><ul><li>http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/ </li></ul></ul><ul><li>JBossClassLoadingUseCases : </li></ul><ul><ul><li>https://www.jboss.org/community/docs/DOC-10290 </li></ul></ul><ul><li>ClassLoadingConfiguration </li></ul><ul><ul><li>http://www.jboss.org/community/docs/DOC-9288 </li></ul></ul><ul><li>Class loaders e aplicações isoladas no JBoss </li></ul><ul><ul><li>http://www.mouseoverstudio.com/blog/2008/06/24/classloaders-e-aplicacoes-isoladas-no-jboss/ </li></ul></ul>® Rafael Torres 2008
    31. 31. Referências <ul><li>[1] http://docs.jboss.org/jbossas/jboss4guide/r4/html/ch2.chapter.html#ch2.loadarch.fig </li></ul><ul><li>[2] JBossClassLoadingUseCases https://www.jboss.org/community/docs/DOC-10290 </li></ul><ul><li>[3] JMAE Javide, PETER Johnson. JBoss in Action. 2008 Manning. pag. 53 </li></ul><ul><li>[4] http://www.middleware.vt.edu/doku.php?id=middleware:jboss:classloading </li></ul>® Rafael Torres 2008

    ×