You are on page 1of 78

Table

of Contents
Prefcio 1.1
Introduo 1.2
O que o Wildfly? 1.2.1
Instalao 1.2.2
Requisitos 1.2.2.1
Downloads 1.2.2.2
Instalao passo a passo 1.2.2.3
Criando usurio de gerenciamento 1.2.2.4
Instalando como Servio no Linux 1.2.2.5
Instalando como Servio no Windows 1.2.2.6
Estrutura - Cada coisa em seu lugar! 1.3
Diretrios 1.3.1
Arquivos de configurao 1.3.2
Modo Standalone x Domain 1.3.3
Profiles e suas diferenas 1.3.4
Classloader Modular 1.4
O que e como funciona? 1.4.1
Adicionando um mdulo customizado 1.4.2
Definindo dependncias explcitas de mdulos em sua aplicao 1.4.3
Configurando WildFly 10 1.5
System properties 1.5.1
Socket-bindings 1.5.2
Subsystem datasource 1.5.3
Subsystem mail 1.5.4
Subsystem logging 1.5.5
Subsystem segurana 1.5.6
Subsystem servios Web 1.5.7
Subsystem Transaes 1.5.8
Subsystem servidor Web 1.5.9
Subsystem Remoting 1.5.10

2
Subsystem IO 1.5.11
Subsystem Batch 1.5.12
Subsystem Messaging 1.5.13
Alta disponibilidade (HA) 1.6
Subsystem jGroups 1.6.1
Subsystem Infinispan 1.6.2
Wildfly como loadbalancer 1.6.3
Configurando loadbalancer externos 1.6.4
Modo Domain passo a passo 1.7
Primeiros Passos 1.7.1

3
Prefcio

WildFly - Um livro Opensource


Este livro tem como finalidade levar a comunidade um contedo rico para o pblico e/ou
usurios de WildFly do Brasil, porque no h muitos livros em Portugus e queremos que
cada vez mais usurios brasileiros utilizem o WildFly e conheam suas funcionalidades bem
como utiliz-las/configur-las.

O livro gratuito e toda e qualquer informao aqui encontrada de autoria dos membros
da comunidade e do JBUG:Brasil, qualquer novo contedo ser revisado e googlado antes
de ser publicado. Todo e qualquer contedo aqui encontrado pode ser compartilhado porm
de forma alguma poder ser utilizado para fins comerciais, sendo destinado aos usurios do
Brasil, s ser disponibilizado em pt-BR.

Os exemplos utilizados neste livro sero publicados no GitHub no link


https://github.com/jbug-brasil. Caso encontre algum erro e/ou problema durante sua
execuo ser de altssima importncia sua contribuio para que possamos sempre
melhorar o contedo oferecido.

Este livro ir abordar desde a instalao e configurao do Servidor de aplicaes WildFly.


Se voc est procurando informaes sobre o WildFly, este livro o lugar certo.

Contribuies
O livro est em constante edio e sempre que achar que algum contedo ainda no
abordado interessante por favor nos envie sua sugesto.

Qualquer contribuio bem vinda, clone o projeto, faa suas alteraes e nos envie um
pull request para que possamos validar o contedo que voc escreveu.

Utilize o GitHub para realizar fork deste livro e efetuar suas alteraes. Maiores informaes
podem ser encontradas no link abaixo.

Comunidade
Estamos no IRC: #jbug-brasil no freenode e jboss.org
https://developer.jboss.org/groups/jbug-brasil.

E tambm no telegram, grupo JBug Brasil.

4
Prefcio

Agradecimentos
Agradecemos os seguintes contribuidores para elaborao deste livro:

Erros? :-)
Achou algum erro de qualquer espcie ou at mesmo algum contedo que voc no
concorde? Sinta-se a vontade para corrigir ou enviar sugestes.

5
Introduo

Introduo
Java o nome dado tanto linguagem de programao largamente conhecida quanto
plataforma por trs da linguagem. Sua popularidade se deve ao fato de que a linguagem
compilada em um cdigo intermedirio (conhecida como Bytecode) para execuo dentro
da Mquina Virtual Java (ou JVM). Isso proporcionou ao Java uma srie de facilidades na
programao que permite ao desenvolvedor se preocupar somente em programar o que
realmente necessrio para a programao, deixando questes como coleta de lixo
(Garbage Collection), performance de execuo de cdigo nativo, gerenciamento de
memria e outros para a Mquina Virtual Java. Tal caracterstica hoje utilizada em outras
linguagens de programao, como .NET e Python, tamanha a importncia da Mquina
Virtual nos paradigmas atuais de linguagens de programao.

Isso proporcionou Mquina Virtual Java no somente executar programas escritas na


linguagem Java como tambm outras linguagens. Atualmente, possvel executar
programas escritos em Groovy, Scala, Python, Ruby e outros na Mquina Virtual Java por
conta dessas linguagens disponibilizarem compiladores especiais que permitem criar o
Bytecode para executar na JVM.

6
Introduo

A plataforma Java, desde a sua concepo, recebeu algumas divises com o objetivo de
tornar a evoluo da plataforma focado em seus devidos objetivos, dentre eles podemos
citar:

Java Standard Edition (ou Java SE): o nome dado plataforma nas sua mais bsica
utilizao, cobrindo toda a implementao da Linguagem Java, do Bytecode e da JVM.
Java Enterprise Edition (ou Java EE): o nome dado plataforma com foco em
aplicaes corporativas (objetivo desde livro), cobrindo caractersticas como
persistncia de dados, distributabilidade, segurana e outros assuntos pertinentes.
Desde a verso 1.6 do Java EE a plataforma se dividiu em dois perfis (profiles): web:
Onde tudo o que ser utilizado/disponibilidado por um fornecedor sero caractersticas
que permitem o desenvolvimento de uma aplicao Web full: Onde o que ser
utilizado/disponibilizado pelo fornecedor sero todo o perfil Web mais caractersticas
adicionais que permitem o uso de componentes como EJB e outros
Java Micro Edition (ou Java ME): o nome dado plataforma cujo objetivo o foco em
dispositivos embarcados (Smartphones, Impressoras, Set-top boxes,
Microcontroladores em geral e outros). Essa plataforma em especfico dividida dois
perfis, sendo eles:
Connected Limited Device Configuration (ou CLDC): Um perfil com foco em
dispositivos que possuem conexo limitada ou nenhuma conexo com a Internet
Connected Device Configuration (ou CDC): Um perfil com foco em dispositivos que
possuem conexo com Internet
Java Card: Uma plataforma muito especfica com foco no desenvolvimento de
aplicaes que utilizam Smart Cards
Java TV: Uma plataforma com foco para TV Digital (O Ginga, plataforma brasileira para
TV Digital, utiliza partes dessa plataforma)

H outras plataformas criadas para outros fins, mas no iremos extender em descrever
todas. Conforme j mencionado, o objetivo deste livro est no foco ao Java EE, onde o
Wildfly implementa suas caractersticas.

Como assim o Wildfly implementa o Java EE?


As plataformas principais do Java (Java SE, Java EE e Java ME) so regidas por um
conselho formado pela Oracle (hoje "proprietria" do Java, antes era da Sun), empresas,
Java User Groups (ou JUGs) e indivduos que definem as prximas tecnologias a serem
desenvolvidas para as prximas verses de suas plataformas, conhecido como Java
Community Process (ou JCP). Nela, possvel discutir com todos os envolvidos na
comunidade Java (ela livre para quem quiser contribuir) quais sero as novas tecnologias
a serem adicionadas nas prximas verses de suas plataformas. Todo o processo de

7
Introduo

adicionar ou at mesmo melhorar um determinado componente ou tecnologia da Plataforma


Java feita por um processo formal chamado de Java Specification Request (ou JSR),
onde atribudo a ela um Expert Group que trabalha para discutir a especificao daquele
componente ou tecnologia.

Sendo assim, a JCP define como determinada plataforma deve ser construda, ficando a
cargo das empresas interessadas em ter um software alinhado quela plataforma
literalmente implementar aquelas especificaes. Hoje, empresas como Oracle, Red Hat e
IBM so as principais que trabalham para implementar essas especificaes em suas
solues.

O Wildfly, ento, uma implementao da plataforma Java EE. Isso significa que todas as
especificaes determinadas para uma determinada verso do Java EE (a verso mais
recente a Java EE 1.7) foram implementadas no Wildfly.

Mas afinal de contas o que Java EE?


Java EE o conjunto de JSRs que focam no desenvolvimento de aplicaes corporativas
cujo foco est nas seguintes caractersticas:

Distributabilidade
Persistncia
Segurana
Gerenciamento de Transaes
Mensageria
Entre outros...

8
Introduo

importante lembrar que o objetivo da especificao Java EE (sim, Java EE tambm uma
especificao, conhecida como Umbrella Specification) padronizar o uso de determinadas
tecnologias e portanto ela no tem como objetivo criar inovaes tecnolgicas em torno da
plataforma. Seu objetivo principal evitar o fenmeno chamado de Vendor Lock-In, que
um fornecedor "prender" seus clientes a uma caracterstica muito especfica e que altera
uma funcionalidade do Java EE. Claro que h outros aspectos que o Java EE no pretende
controlar, como por exemplo Clustering, sendo esse livre para o fornecedor criar sua prpria
implementao. A este caso especfico foi dada essa liberdade de implementao para
permitir a livre concorrncia entre seus fornecedores e atra-os para a comunidade Java.

Por que Utilizar Um Servidor de Aplicao?

O que vir nos prximos captulos?


O livro ir trazer uma breve introduo ao Wildfly, sua arquitetura e depois mostraremos
algumas das tarefas administrativas que podem ser feitas para configurar os componentes
do Java EE, bem como fazer o deployment de aplicaes Java EE dentro do Wildfly.

9
O que o Wildfly?

O que o Wildfly?
Wildfly, tambm conhecido como JBoss, um servidor de aplicao Java EE desenvolvido
em Java e pode ser executado em qualquer Sistema Operacional, 32 ou 64 bits que tenha
suporte ao Java.

Mas se era JBoss, porque o nome foi alterado


para Wildfly aps tanto tempo?
Essa uma tima pergunta. O principal motivo da alterao ocorreu pelo fato da
semelhana entre o JBoss Application Server(AS) e o JBoss Enterprise Application
Platform(EAP) e tambm outros produtos do portiflio JBoss gerar um pouco de confuso
entre eles.

Houve ento uma votao na comunidade JBoss para decidir o novo nome do projeto da
comunidade. Muitos nomes foram sugeridos (mais de 1500 nomes, de acordo com Mark
Little, CTO da diviso de Middleware da Red Hat) e depois de uma pr-seleo cinco
nomes foram selecionados para a votao da comunidade. Wildfly foi o nome mais votado
entre vrios outros, a troca de nomes foi oficialmente anunciada no JUDCon Brazil de 2013
em So Paulo e mais tarde Mark Little postou em seu blog o anncio.

10
Instalao

Instalao
Este captulo ir abordar o processo de instalao passo a passo desde os downloads at a
primeira inicializao do Wildfly e tambm os primeiros passos aps sua instalao.

11
Requisitos

Requisitos
Para executar o Wildfly o nico requisito possuir uma mquina fsica ou virtual
independentemente do sistema operacional com memria suficiente para a execuo. A
quantidade de memria necessria pode variar de acordo com a aplicao que ser
executada. A configurao padro do Wildfly est configurada da seguinte maneira:

-Xms64m -Xmx512m

O que significa que o mnimo de memria utilizada 64mb e pode crescer at 512mb.

Porm o principal requisito o seu interesse por este magnfico Servidor de Aplicao.
Vamos comear, no prximo tpico vamos aos Downloads e consequentemente a
instalao.

12
Downloads

Downloads
No presente momento, iremos utilizar o Wildfly verso 10.1.0.Final no decorrer dos
prximos tpicos. Sendo este contedo atualizado conforme novas verses forem lanadas.

Alm das verses Final existem tambm as Beta e Alpha que so lanadas antes da Final
com o intuito de testar o Servidor de Aplicao para que a verso Final seja o mais perto
possvel de ser bug free.

Podemos encontrar todas as verses disponveis para download neste link, realize o
download da verso 10.1.0.Final ou clique aqui para realizar o download.

No se preocupe, caso esteja utilizando Windows os prximos passos sero muito


semelhantes, os principais pontos diferentes sero nos arquivos selecionados para
download, tambm est disponvel para download o arquivo extenso .zip.

Aps realizado o download do Wildlfy vamos a instalao do Java, caso j o possua


instalado pule esta etapa. O WildFly 10 Java ee 7, isso quer dizer que o WildFly
implementa todas as especificaes propostas pelo Java ee 7, mais detalhes neste link.

Se precisa usar Java 7 no se preocupe, o Wildfly tambm compatvel com a verso 7 do


Java.

Neste caso irei utilizar a verso 8 do Java que pode ser encontrado neste link.

Lembre-se que para realizar o download do Java necessrio escolher o binrio de acordo
com o Sistema Operacional que estiver utilizando. Neste caso estaremos utilizando o
seguinte binrio: jdk-8u101-linux-x64.rpm. Se preferir voc tambm pode utilizar o
OpenJDK, o que torna a instalao bem mais simples no Linux

Exemplo (Red Hat like):

CentOS 7+ ou Fedora 22+

$ sudo dnf install java -y

Ou

$ sudo yum install java -y

Porm se estiver utilizando um Sistema Debian Like

13
Downloads

sudo apt-get install openjdk-8-jdk

Aps a finalizao verifique se o Java foi corretamente instalado e configurado, para isso
basta executar o seguinte comando:

$ java -version
openjdk version "1.8.0_101"
OpenJDK Runtime Environment (build 1.8.0_101-b14)
OpenJDK 64-Bit Server VM (build 25.101-b14, mixed mode)

Se o resultado for semelhante a este voc j est pronto para ir para o prximo tpico.

14
Instalao passo a passo

Instalao passo a passo


Neste captulos iremos abordar a instalao do WildFly partindo do princpio que os
downloads descritos no captulo anterior j foram realizados.

Bom, como todos ns temos o direito de escolha, para ilustrar os exemplos deste tpico e
dos demais irei usar a seguinte configurao:

Sistema Operacional: Fedora 25 x86_64, Server Edition


Banco de dados: MariaDB 10.0.25-1.fc23

Obs: O banco de dados no ser necessrio neste primeiro momento, mas ser utilizado
em captulos futuros.

Primeiro passo: Definindo um usurio para Runtime


Segurana em primeiro lugar, evite ao mximo utilizar o usurio root para executar o
WildFly porque desta forma estaremos protegendo o servidor como um todo de forma que
uma aplicao que permita execuo de cdigos arbritrrios no execute nada no servidor
com um usurio privilegiado.

Neste caso utilizarei um usurio chamado _wildfly _que ser somente utilizado para
executar o WildFly, para criar o usurio execute o seguinte comando:

# uuseradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly

Segundo passo: Escolhendo o diretrio de instalao


Esta realmente a primeira dvida que temos ao realizar a instalao de qualquer
aplicao em nossos servidores, com o WildFly no diferente. Em poucas palavras, no
existe um padro definido que todos devem seguir, porm muitos administradores acabam
escolhendo um determinado modelo a seguir para que todos os servidores possuam os
mesmos diretrios/estrutura, isso que, facilita e muito a administrao. Eu sempre costumo
usar o diretrio /opt, lembrando, isto no uma regra.

Vamos agora descompactar o WildFly no diretrio escolhido:

# tar -xzvf wildfly-10.1.0.Final.tar.gz --directory /opt

Ou se prefere utilizar o arquivo com extenso .zip:

15
Instalao passo a passo

unzip wildfly-10.1.0.Final.zip -d /opt

Para facilitar a administrao do servidor de aplicao interessante utilizar link simblicos


para facilitar uma atualizao do WildFly, por exemplo, podemos criar um link simblico do
diretrio wildfly-10.1.0.Final _e cham-lo somente de _wildfly, e quando sugir uma
atualizao de uma nova verso do WildFly basta somente atualizar o link simblico, assim
scripts de inicializao podem utilizar somente o diretrio /opt/wildfly. Para efetuar esta
configurao siga os passos abaixo:

# cd /opt
# ln -s wildfly-10.1.0.Final wildfly

Neste momento j temos o servidor WildFLy descompactado no diretrio /opt:

# ll /opt
total 0
drwxr-xr-x. 10 root root 220 Jul 28 01:02 wildfly-10.1.0.Final

Note que as permisses de usurio e grupo esto configuradas para o usurio root, como
boas prticas no iremos utilizar o usurio root para execuo do WildFly, e sim o usurio
criado anteriormente, altere as permisses com o seguinte comando:

# chown -R wildfly. /opt/wildfly-10.1.0.Final/

Agora podemos utilizar o usurio wildfly para executar o Servidor.


Abra um shell utilizando este usurio e em seguida acesso o diretrio wildfly-10.1.0.Final:

[root@wfly-server ~]$ cd /opt/wildfly-10.1.0.Final/


[root@wfly-server wildfly-10.1.0.Final]$ su -s "/bin/bash" -c "bin/standalone.sh" wild
fly

Com os comandos executados acima estamos:

logando com o usurio wildfly


Acessando o JBOSS_HOME
Iniciando o Wildfly

Caso ocorra tudo bem durante a inicializao do WildFly voc ter um log muito semelhante
a este:

[wildfly@wfly-server wildfly-10.1.0.CR1]$ bin/standalone.sh


=========================================================================

16
Instalao passo a passo

JBoss Bootstrap Environment

JBOSS_HOME: /opt/wildfly-10.1.0.Final

JAVA: java

JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m


-Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.
awt.headless=true

=========================================================================

12:32:31,463 INFO [org.jboss.modules] (main) JBoss Modules version 1.5.2.Final


12:32:36,598 INFO [org.jboss.msc] (main) JBoss MSC version 1.2.6.Final
12:32:37,713 INFO [org.jboss.as] (MSC service thread 1-4) WFLYSRV0049: WildFly Full 1
0.1.0.CR1 (WildFly Core 2.2.0.CR9) starting
12:33:08,472 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0039: Creatin
g http management service using socket-binding (management-http)
12:33:09,280 INFO [org.xnio] (MSC service thread 1-4) XNIO version 3.4.0.Beta3
12:33:09,424 INFO [org.xnio.nio] (MSC service thread 1-4) XNIO NIO Implementation Ver
sion 3.4.0.Beta3
12:33:10,453 INFO [org.jboss.as.clustering.infinispan] (ServerService Thread Pool --
38) WFLYCLINF0001: Activating Infinispan subsystem.
12:33:11,294 INFO [org.jboss.as.naming] (ServerService Thread Pool -- 46) WFLYNAM0001
: Activating Naming Subsystem
12:33:11,259 INFO [org.jboss.as.jsf] (ServerService Thread Pool -- 44) WFLYJSF0007: A
ctivated the following JSF Implementations: [main]
12:33:11,960 WARN [org.jboss.as.txn] (ServerService Thread Pool -- 54) WFLYTX0013: No
de identifier property is set to the default value. Please make sure it is unique.
12:33:12,665 INFO [org.jboss.as.naming] (MSC service thread 1-3) WFLYNAM0003: Startin
g Naming Service
12:33:12,893 INFO [org.jboss.as.security] (ServerService Thread Pool -- 53) WFLYSEC00
02: Activating Security Subsystem
12:33:12,900 INFO [org.jboss.as.webservices] (ServerService Thread Pool -- 56) WFLYWS
0002: Activating WebServices Extension
12:33:12,897 INFO [org.wildfly.extension.io] (ServerService Thread Pool -- 37) WFLYIO
001: Worker 'default' has auto-configured to 4 core threads with 32 task threads based
on your 2 available processors
12:33:13,773 INFO [org.jboss.as.security] (MSC service thread 1-4) WFLYSEC0001: Curre
nt PicketBox version=4.9.6.Final
12:33:13,872 INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thre
ad Pool -- 33) WFLYJCA0004: Deploying JDBC-compliant driver class org.h2.Driver (versi
on 1.3)
12:33:16,526 INFO [org.jboss.remoting] (MSC service thread 1-1) JBoss Remoting versio
n 4.0.21.Final
12:33:16,550 INFO [org.jboss.as.connector] (MSC service thread 1-2) WFLYJCA0009: Star
ting JCA Subsystem (WildFly/IronJacamar 1.3.4.Final)
12:33:17,059 INFO [org.jboss.as.mail.extension] (MSC service thread 1-2) WFLYMAIL0001
: Bound mail session [java:jboss/mail/Default]
12:33:17,359 INFO [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT000
3: Undertow 1.4.0.CR4 starting
12:33:17,405 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-4) WF

17
Instalao passo a passo

LYJCA0018: Started Driver service with driver-name = h2


12:33:19,060 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 55)
WFLYUT0014: Creating file handler for path '/opt/wildfly-10.1.0.CR1/welcome-content' w
ith options [directory-listing: 'false', follow-symlink: 'false', case-sensitive: 'tru
e', safe-symlink-paths: '[]']
12:33:20,814 INFO [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT001
2: Started server default-server.
12:33:21,160 INFO [org.wildfly.extension.undertow] (MSC service thread 1-3) WFLYUT001
8: Host default-host starting
12:33:22,573 INFO [org.jboss.as.ejb3] (MSC service thread 1-3) WFLYEJB0481: Strict po
ol slsb-strict-max-pool is using a max instance size of 32 (per class), which is deriv
ed from thread worker pool sizing.
12:33:22,575 INFO [org.jboss.as.ejb3] (MSC service thread 1-2) WFLYEJB0482: Strict po
ol mdb-strict-max-pool is using a max instance size of 8 (per class), which is derived
from the number of CPUs on this host.
12:33:23,793 INFO [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT000
6: Undertow HTTP listener default listening on 127.0.0.1:8080
12:33:26,356 INFO [org.infinispan.factories.GlobalComponentRegistry] (MSC service thr
ead 1-1) ISPN000128: Infinispan version: Infinispan 'Chakra' 8.2.3.Final
12:33:26,456 WARN [org.jboss.as.domain.management.security] (MSC service thread 1-2)
WFLYDM0111: Keystore /opt/wildfly-10.1.0.CR1/standalone/configuration/application.keys
tore not found, it will be auto generated on first use with a self signed certificate
for host localhost
12:33:26,582 INFO [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (
ServerService Thread Pool -- 61) ISPN000152: Passivation configured without an evictio
n policy being selected. Only manually evicted entities will be passivated.
12:33:26,583 INFO [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (
ServerService Thread Pool -- 61) ISPN000152: Passivation configured without an evictio
n policy being selected. Only manually evicted entities will be passivated.
12:33:26,612 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-2) W
FLYDS0013: Started FileSystemDeploymentService for directory /opt/wildfly-10.1.0.CR1/s
tandalone/deployments
12:33:26,673 INFO [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (
ServerService Thread Pool -- 61) ISPN000152: Passivation configured without an evictio
n policy being selected. Only manually evicted entities will be passivated.
12:33:26,674 INFO [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (
ServerService Thread Pool -- 61) ISPN000152: Passivation configured without an evictio
n policy being selected. Only manually evicted entities will be passivated.
12:33:26,672 INFO [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (
ServerService Thread Pool -- 59) ISPN000152: Passivation configured without an evictio
n policy being selected. Only manually evicted entities will be passivated.
12:33:26,693 INFO [org.infinispan.configuration.cache.EvictionConfigurationBuilder] (
ServerService Thread Pool -- 59) ISPN000152: Passivation configured without an evictio
n policy being selected. Only manually evicted entities will be passivated.
12:33:26,950 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread
1-4) WFLYJCA0001: Bound data source [java:jboss/datasources/ExampleDS]
12:33:28,091 INFO [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT000
6: Undertow HTTPS listener https listening on 127.0.0.1:8443
12:33:29,599 INFO [org.jboss.ws.common.management] (MSC service thread 1-2) JBWS02205
2: Starting JBossWS 5.1.5.Final (Apache CXF 3.1.6)
12:33:30,012 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http managemen
t interface listening on http://127.0.0.1:9990/management
12:33:30,013 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console

18
Instalao passo a passo

listening on http://127.0.0.1:9990
12:33:30,013 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 1
0.1.0.CR1 (WildFly Core 2.2.0.CR9) started in 4417ms - Started 331 of 577 services (39
3 services are lazy, passive or on-demand)

Acesse o servidor utilizando o endereo http://localhost:8080, a seguinte pgina dever ser


exibida:

No prximo tpico abordaremos a criao do usurio de gerenciamento do WildFly.

19
Criando usurio de gerenciamento

Criando usurio de gerenciamento


Para conseguirmos utilizar a console de gerenciamento do WildFly necessrio criar um
usrio de gerenciamento, tambm existe usurios de aplicao, segue uma pequena
diferena entre eles:

Management: Usurios utilizados para gerenciar o WildFly utilizando os seguintes


mtodos:
Console de gerenciamento
JBoss CLI

Ambos esto disponveis na porta 9990.

Neste tpico iremos abordar somente a criao de usurio de gerenciamento bem como
acessar a console de gerenciamento.

Caso voc tente acessar a console de gerenciamento sem ter antes, criado o usurio voc
ser redirecionado para a pgina abaixo informando que necessrio executar o script add-
user.sh (add-user.bat para Windows) para adicionar um usurio de gerenciamento
utilizando o realm ManagementRealm:

Acesse http://localhost:9990

20
Criando usurio de gerenciamento

Para adicionar o usurio siga os passos a seguir:

Execute o script add-user.sh que est localizado no diretrio $JBOSS_HOME/bin

$ ./add-user.sh

What type of user do you wish to add?


a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a):

Por padro o ManagementRealm selecionado, apenas aperte enter para prosseguir.

O prximo passo ser definir o nome do usurio, escolha um username e prossiga:

21
Criando usurio de gerenciamento

Enter the details of the new user to add.


Using realm 'ManagementRealm' as discovered from the existing property files.
Username : admin

Logo a seguir voc ser informado que o usurio admin j existe porm est desativado e
ir lhe mostrar as opes disponveis:

User 'admin' already exists and is disabled, would you like to...
a) Update the existing user password and roles
b) Enable the existing user
c) Type a new username
(a):

Voc ter a opo de atualizar usurio existente e seus grupos, ativar o usurio existente ou
digitar um novo username. Neste caso iremos somente atualizar a senha do usurio admin,
por padro esta opo j est selecionada, apenas tecle enter.

Agora defina a senha:

Password recommendations are listed below. To modify these restrictions edit the add-u
ser.properties configuration file.
- The password should be different from the username
- The password should not be one of the following restricted values {root, admin, adm
inistrator}
- The password should contain at least 8 characters, 1 alphabetic character(s), 1 dig
it(s), 1 non-alphanumeric symbol(s)
Password :
Re-enter Password :

O prximo passo definir os grupos, no momento no ser necessrio definir nenhum,


apenas prossiga:

What groups do you want this user to belong to? (Please enter a comma separated list,
or leave blank for none)[ ]:
Updated user 'admin' to file '/opt/wildfly-10.1.0.Final/standalone/configuration/mgmt-
users.properties'
Updated user 'admin' to file '/opt/wildfly-10.1.0.Final/domain/configuration/mgmt-user
s.properties'
Updated user 'admin' with groups to file '/opt/wildfly-10.1.0.Final/standalone/config
uration/mgmt-groups.properties'
Updated user 'admin' with groups to file '/opt/wildfly-10.1.0.Final/domain/configurat
ion/mgmt-groups.properties'

22
Criando usurio de gerenciamento

O script ir pergunt-lo se se este usurio ser utilizado para autenticao entre 2


servidores WildFly (Veremos com mais detalhes este processo na configurao do modo
Domain). Neste caso ser um usurio normal, digite no e tecle enter

Is this new user going to be used for one AS process to connect to another AS process?

e.g. for a slave host controller connecting to the master or for a Remoting connection
for server to server EJB calls.
yes/no? no

Neste momento j estamos aptos a acessar a Console de Gerenciamento, tente acess-la


novamente e utilize as credenciais que criamos, caso esteja tudo certo voc ser
redirecionado para a pgina principal:

Dicas

23
Criando usurio de gerenciamento

Criando usurio somente com um comando:

$WFLY_HOME/bin/add-user.sh -u admin2 -p teste@123 -s -e

Criando usurios com senhas fracas (no permitido


atravs do script add-user)
Este mtodo no recomendado, nunca use-o em produo.

echo -n "username:ManagementRealm:password" | openssl md5


(stdin)= 8959126dd54df47f694cd762a51a1a6f

Com o hash em mos edite o arquivo $WFLY_HOME/standalone/configuration/mgmt-


users.properties e adicione o novo usurio seguido do hash, exemplo:

username=8959126dd54df47f694cd762a51a1a6f

Caso deseje criar um application user altere a Realm para ApplicationRealm.

Alterando a poltica de senhas


Tambm possvel alterar a poltica de senhas utilizada pelo script de criao de usurios.
No diretrio $JBOSS_HOME/bin existe um arquivo chamado add-user.properties com o
seguinte contedo:

24
Criando usurio de gerenciamento

#
# Password restriction
#

# Valid values: RELAX, WARN or REJECT


# RELAX : Don't perform any strength checks on the password in both interactive and no
n-interactive mode
# WARN : Display a message about the strength of the password. Ask confirmation if the
password is weak in interactive mode
# REJECT : Display a message about the strength of the password (if the password is we
ak, the user is not created).
# Ask confirmation if the password is weak in interactive mode
password.restriction=WARN

# Password minimum length


password.restriction.minLength=8

# Password must contains at least one alpha


password.restriction.minAlpha=1

# Password must contains at least one digit


password.restriction.minDigit=1

# Password must contains at least one symbol


password.restriction.minSymbol=1

# Password must not match the username. Valid values: TRUE or FALSE.
password.restriction.mustNotMatchUsername=TRUE

# Comma separated list of forbidden passwords (easily guessable)


password.restriction.forbiddenValue=root,admin,administrator

# Password strength. Valid values: VERY_WEAK, WEAK, MODERATE, MEDIUM, STRONG, VERY_STR
ONG or EXCEPTIONAL.
# If not present, it defaults to "MODERATE"
password.restriction.strength=MEDIUM

# Class of password strength checker.


# If not present, utility will revert to default implementation
password.restriction.checker=org.jboss.as.domain.management.security.password.simple.S
implePasswordStrengthChecker

Para alterar a poltica de senha conforme suas necessidades apenas edite a propriedade
desejada neste arquivo e salve. As configuraes realizadas j sero aplicadas na criao
do prximo usurio.

25
Instalando como Servio no Linux

Instalando O WildFly como servio em um


Servidor Linux
Executar Servidores de Aplicao como servio muito comum nos dias de hoje, pela
praticidade de gerenciamento e tambm por ser muito simples a restaurao do servio
aps o boot do Sistema Operacional.

No decorrer deste captulo iremos descrever os passos necessrios para configurar o


WildFly Server como um servio utilizando o systemd como gerenciador de servios.

Nas verses anteriores do Wildfly, at as verso 9, os scripts estavam no diretrio


$JBOSS_HOME/bin/init.d, mas n verso 10 os scripts foram movidos para o diretrio
$JBOSS_HOME/docs/contrib/scripts, lembrando que os scripts encontrados neste diretrio
so contribuies de usurios e esto disponveis na distribuo do WildFly para serem
utilizados como exemplo.

O a criao de um servio com o systemd muito simples quando comparado ao init.d.


Para conhecer melhor o systemd acesse este link.

Neste captulo ser exemplificado a instalao do servio utilizando o init.d e o systemd.

Init.d
Under development

Systemd
O arquivo de configurao do systemd disponibilizado na instalao do WildFly j est
pronto para uso, sendo necessrio realizar somente alguns passos antes de execut-lo
como servio.

Neste ponto, ser necessrio ter efetuado os passos descritos no tpico Instalao passo a
passo. Com o ambiente pr configurado, siga os passos abaixo:

26
Instalando como Servio no Linux

# mkdir /etc/wildfly
# cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.conf /etc/wildfly/
# cp /opt/wildfly/docs/contrib/scripts/systemd/wildfly.service /etc/systemd/system/
# cp /opt/wildfly/docs/contrib/scripts/systemd/launch.sh /opt/wildfly/bin/
# chmod +x /opt/wildfly/bin/launch.sh
# chown wildfly. /opt/wildfly/bin/launch.sh

Como os scripts j esto pr configurados, depois de executar todos os passos acima, j


estamos prontos para iniciar o wildfly.

Primeiramente vamos habilit-lo para ser executado durante o boot do Sustema


Operacional:

# systemctl enable wildfly


# systemctl start wildfly

E para parar o servio:

# systemctl stop wildfly

Para configurar o servio do WildFly para usar o modo Domain ao invs do modo
Standalone (padro), edite o arquivo wildfly.service localizado em /etc/wildfly conforme o
exemplo abaixo:

# The configuration you want to run


WILDFLY_CONFIG=domain.xml

# The mode you want to run


WILDFLY_MODE=domain

Por padro o endereo de bind vem configurado c omo 0.0.0.0, no uma boa prtica
deix-lo com essa configurao, altere o endeo de bind para o endereo de IP do servidor
em que o WildFly ser executado. Para alterar o endereo de bind edite o mesmo arquivo
citado acima da seguinte maneira, como exemplo ser utilizado o ip 192.168.1.10:

# The address to bind to


WILDFLY_BIND=192.168.1.10

27
Instalando como Servio no Windows

Instalando O WildFly como servio em um


Servidor Windows

28
Estrutura - Cada coisa em seu lugar!

Estrutura - Cada coisa em seu lugar!


Para ter maior domnio sobre o Wildfly e conhecer melhor o servidor afim de oferecer
melhor administrao, necessrio entender toda a estrutura de diretrios dentro do
servidor. O objetivo deste captulo mostrar toda sua estrutura, mostrando diretrios
importantes a serem analisados, os perfis de execuo do servidor (standalone e domain) e
onde encontrar os arquivos de configurao.

29
Diretrios

Diretrios
O WildFly manteve praticamente a mesma estrutura de diretrios do JBoss AS 7, enxuta e
centralizada. Para aqueles que ainda no esto familiarizados com essa nova estrutura, a
prxima seo descrever em detalhes abaixo.

Como est dividida a estrutura?


Bom, temos a seguinte estrutura de diretrios:

$JBOSS_HOME
appclient
bin
client
docs
contrib
scripts
init.d
service
systemd
examples
licenses
schema
domain
configuration
domain_xml_history
current
snapshot
data
tmp
servers
modules
standalone
configuration
standalone_xml_history
current
snapshot
data
deployments
lib
log
tmp
welcome-content

Veremos agora a funo de cada diretrio e o que armazenado em cada um:

30
Diretrios

appclient - Este diretrio utilizado para armazenar arquivos de deployments,


configurao e tambm utilizado como rea de escrita utilizados pelo application
client container.
bin - Todos os binrios do servidor sero encontratos neste diretrio, tais como
standalone/domain.sh|bat, script para adio de usurios, etc.
client - Neste subdiretrio est armazenados as bibliotecas necessrias para se
conectar ao Wildfly utilizando JBoss CLI, EJB ou JMS.
docs - Aqui voc ir encontrar diversos tipos de arquivos como exemplos de
configurao, exemplos se como executar o WildFLy como servio, licenas e outros
arquivos que lhe ajudaro a aprender mais sobre o WildFly.
contrib - Arquivos utilizados para executar o WildFly como servio.
scripts - Scripts para configurao do WildFly como servio.
init.d - Arquivos necessrios para executar como servio no Linux Linux
baseado no gerenciador de servios init.d.
service - Arquivos necessrios para executar como servio no Windows
systemd - Arquivos necessrios para executar como servio no Linux
baseado no gerenciador de servios systemd.
examples - Contm exempls arquivos de configurao do modo standaloe pr
configurados.
licenses - Contm todas as licenas sob o qual o cdigo fonte do WildFLy est
protegido.
schema - So os arquivos que definem as configuraes/parmetros aceitos
nos subsystems presentes nos arquivos de configurao do Wildly, note que
sua nomenclatura contm a verso do schema, asim como no arquivo de
configurao contm a verso do schema que ser utilizado para a
configurao de determinado subsystem, Exemplo: Dado o seguinte
subsystem:

<subsystem xmlns="urn:jboss:domain:logging:3.0">

Note que ele est utilizando a verso 3.0 do schema logging. Este mesmo
padro vlido para todos os outros subsystems.
domain - Abriga toda a configurao do modo domain bem como os arquivos dos
servidores gerenciados (veremos melhor sobre isso mais a frente) e arquivos de
deployments, arquivos temporrios e arquivos de logs.
configuration - Contm todos os arquivos de configurao do modo domnio.
domain_xml_history - Contm todo o histrico dos arquivos de configurao.
current - Armazena a configurao corrente com sufixos v1, v2, vX.
snapshot - Armazena os snapshots, obtidos atravs do comando CLI
/host=HOSTNAME:take-snapshot

31
Diretrios

servers - Diretrio utilizado para armazenar informaes referentes aos servidores


gerenciados controlados pelo domnio em questo. Dentro do diretrio com o
respectivo nome do servidor gerenciado existem tambm seus subdiretrios data,
tmp e log cujo o objetivo o mesmo do descrito no modo standalone.
data - Diretrio utilizado para persistir dados para que seja possvel um restart sem
perda de imformao.
tmp - Utilizado e gerado em Runtime, reponsvel por armazenar todos os arquivos
temporrios gerados durante a execuo do servidor.
lib/ext - Local utilizado para instalar bibliotecas utilizadas pelas aplicaes atravs
do mecanismo Extension-List.
modules - O WildFly baseado em um classloader modular (explicado em detalhes nos
prximos tpicos), todos os mdulos necessrios para a execuo do WildFly esto
armazenados neste diretrio, bem como os mdulos customizados.
standalone - Contm todos os arquivos necessrios para a execua do WildFly no
modo standalone.
configuration - Contm todo o histrico dos arquivos de configurao.
standalone_xml_history - Contm todo o histrico dos arquivos de
configurao.
current - Armazena a configurao corrente com sufixos v1, v2, vX.
snapshot - Armazena os snapshots, obtidos atravs do comando CLI
:take-snapshot
data - Diretrio utilizado para persistir dados para que seja possvel um restart sem
perda de imformao.
deployments - Existente somente no modo standalone utilizado para realizar
deployments utilizando o mtodo Deployment Scanner.
lib/ext - Local utilizado para instalar bibliotecas utilizadas pelas aplicaes atravs
do mecanismo Extension-List.
log - Contm os logs do servidor em execua.
tmp - Diretrio para escrita de arquivos temporrios utilizados pelas aplicaes em
execuo.
welcome-content - um diretrio de uso interno do servidor que no deve ser
modificado por usurios finais, sua alterao pode influenciar no funcionamento do
WildFly bem como pginas de boas vindas e pginas de erros.

32
Arquivos de configurao

Arquivos de configurao
Desde o JBoss AS 7, a configurao centralizada o que, de certa forma facilita muito o
gerenciamento do seu servidor ou parque de servidores.

A estrutura, quando comparada com o JBoss AS 7 no teve alteraes, porm se voc


ainda no a conhece ir achar um pouco estranho a forma como est distribuda agora.
QUando comparada com a verses mais antigas do JBoss, temo uma grande diferena,
principalmente porque os arquivos de configurao eram diversos, em diferentes diretrios,
componentes, etc. Se voc est migrando do JBoss AS 6 ou verses anteriores, de
extrema importncia que voc leia este captulo para ficar antenado com a estrutura dos
arquivos de configurao do WildFly.

O intuto deste tpico ser somente descrever os principais arquivos de configuraes e sua
aplicabilidade, ser tratado em tpicos posteriores como configurar o WildFly.

Para facilitar assunto, o livro dividiremos em trs partes:

Configuraes em geral;
Configuraes do modo standalone;
Configuraes do modo domnio.

Configuraes Gerais
Iremos comear com as confiuguraes bem bsicas que so as configuraes realizadas
dentro do diterrio bin. Nele temos os seguintes arquivos de configurao:

add-user.properties - Configurao da poltica de senha na criao de usurios


appclient.conf - Arquivo que define as configuraes do appclient, utilitrio para
execuo de applicaes sem a necessidade de executar o WildFly
domain.conf - Define as configuraes utilizadas para iniciar o modo domnio.
jboss-cli-logging.properties - Definies de log do JBoss CLI.
jboss-cli.xml - Define as configuraes que sero utilizadas pelo JBoss CLI, atravs do
script jboss-cli.sh tais como connection timeout e controller.
standalone.conf - Define as configuraes utilizadas para iniciar o modo standalone.

Obs: O wildFly 10 j possui suporte ao PowerShell, note que j h vrios scripts com o
sufixo ps1 no diretrio bin.

33
Arquivos de configurao

Configuraes modo Standalone


Todos os arquivos de configurao do modo Standalone esto no diretrio
$JBOSS_HOME/standalone/configuration, neste diretrio iremos encontrar os seguintes
arquivos:

application-roles.properties: Neste arquivo configurado as permisses (Roles) dos


usurios utilizados em aplicaes.
application-users.properties: Armazena usurios utilizados para autenticao realizada
por aplicaes.
logging.properties: Arquivo que define as configuraes de log do Wildfly, este arquivo
alterado de acordo com as definies de logging realizadas no subsystem logging.
mgmt-groups.properties: Grupos dos usurios de gerenciamento, note os grupos so
usados quando o RBAC (Role Based Access Control, falaremos sobre isso nos
prximos captulos) ou Controle de Acesso Baseado em Roles.
mgmt-users.properties: Define usurios e senha utilizados para autenticar usurios de
gerenciamento.
standalone.xml: Todas as definies e configuraes do Wildfly so feitas atravs deste
arquivo.

Configuraes modo Domnio


No modo Domain temos os mesmos arquivos de configurao com a exceo do
standalone.xml e adio dos seguintes arquivos:

domain.xml: Define todas as configuraes do modo domnio. Emn adio ao


domain.xml temos mais 3 arquivos:
host-master.xml: Este arquivo define as configurao da instncia do WildFly que ir
atuar somente como Controlador de Domnio.
host-slave.xml: Um modo domnio distribudo tem seus host masters e slaves, este
arquivo define as configuraes do slaves.
host.xml: Se por acaso desejar executar o WildFly no modo domnio em somente um
servidor, neste arquivo que estar contidos todas as informaes referentes ao host.
Note que tambm possvel utiliz-lo como host master ou slave.
default-server-logging.properties: Arquivo que define as configuraes de log padro
dos servidores gerenciados.

34
Modo Standalone x Domain

Modo Standalone x Domain


O Wildfly tem dois modos de gerenciamento: Standalone e Domain. Cada modo permite
que voc gerencie seus servidores de modo diferente utilizando topologias diferentes.

Modo Standalone
O modo Standalone o modo tradicional das verses anteriores. Basicamente implica em
ter uma instalao diferente (ou um diretrio standalone diferente) para cada instncia1 de
Wildfly. Ou seja, para cada Wildfly rodando no seu ambiente necessrio alterar seus
prprios arquivo de configurao, suas prprias opes de execuo para JVM, etc.

Modo Domain
O modo Domain o modo que foi introduzido no JBoss AS 7 onde possvel gerenciar um
conjunto de instncias Wildfly, agrupando-os e assim permitindo compartilhar configuraes
comuns entre eles. Alm de compartilhar configuraes, possvel tambm atravs de um
nico console de gerenciamento iniciar ou parar instncias (ou grupos inteiros), verificar seu
status e estatsticas de cada subsystem (falaremos sobre isso mais adiante), etc.

Qual o melhor modo de gerenciamento?


35
Modo Standalone x Domain

Obviamente, ao analisar os dois modos de gerenciamento, vem aquela famosa pergunta: "E
agora? Qual deles melhor?". Com certeza a resposta sempre partir do "Depende", mas
para dar uma ajuda em escolher o melhor modo de gerenciamento necessrio ter em
mente as seguintea perguntas:

O nmero de instncias muito pequeno (algo em torno de 10) ou muito grande?


As mquinas fsicas que iro rodar as instncias esto no mesmo Datacenter ou
espalhados geograficamente?
Eu quero ter um gerenciamento das instncias individual ou centralizada?
Eu quero ter um controle mais rgido sobre o deployment das aplicaes no ambiente?

Com base nessas perguntas, voc consegue decidir com bastante clareza e segurana qual
o melhor modo a ser utilizado.

IMPORTANTE: os modos de gerenciamento em nenhum momento afetam Alta


Disponibilidade, Performance ou alguma tecnologia Java EE. Eles apenas definem a
melhor forma de gerenciamento das suas instncias.
1. Utilizamos o termo instncia para denominar um servidor Wildfly rodando

isoladamente.

36
Profiles e suas diferenas

Profiles e suas diferenas


No Java EE, conforme descrevemos na Introduo, dividido em dois perfis: Web e Full.
Esses perfis (ou profiles) definem o quanto do Java EE ser utilizado no desenvolvimento
de suas aplicaes. O Wildfly, pensando nesses perfis, criou arquivos de configurao para
cada perfil Java EE bem como adicionou os componentes para HA (High Availability, ou
Alta disponibilidade), que so recursos que permitem o acesso s aplicaes hospedadas
no servidor mesmo em caso de falhas.

Arquivo de
Perfil Utilizao
configurao*
Web standalone.xml Permite o uso do perfil Java EE Web
Full standalone-full.xml Permite o uso do perfil Java EE Full
Web c/ Permite o uso do perfil Java EE Web com
standalone-ha.xml
HA caractersticas de HA

Full c/ standalone-full- Permite o uso do perfil Java EE Full com


HA ha.xml caractersticas de HA

* Apenas no modo standalone

Rodando o Wildfly utilizando os profiles


Para rodar o Wildfly utilizando o profiles descritos na seo anterior, basta adicionar a
opo -c linha de comando pasando o arquivo de configurao a ser utilizado. Exemplo:
Se eu quiser utilizar o perfil Full com HA, basta eu rodar o seguinte comando para iniciar o
Wildfly:

$ ./standalone.sh -c standalone-full-ha.xml

E no modo Domain, como seleciono meu


profile?
O modo domain, assim como explicado no tpico anterior ele gerenciado por um host
master e cada host slave possui o seu host controller. As configuraes dos profiles so
definidas no arquivo domain.xml do Domain Controller que so replicadas a todos os
membros do Domnio.

37
Profiles e suas diferenas

Todos os arquivos de configurao do modo Domnio esto no diretrio


$JBOSS_HOME/configuration/domain

Os profiles so estruturados da mesma maneira que os profiles do modo standalone, porm


com uma pequena diferena, repare na tabela abaixo:

Nome do
Perfil Utilizao
profile
Web default Permite o uso do perfil Java EE Web
Full full Permite o uso do perfil Java EE Full
Web c/ Permite o uso do perfil Java EE Web com
ha
HA caractersticas de HA
Full c/ Permite o uso do perfil Java EE Full com caractersticas
full-ha
HA de HA

Veja abaixo um exemplo de uma definio de profile encontrada no arquivo domain.xml:

<profiles>
<profile name="default">
<subsystem xmlns="urn:jboss:domain:logging:3.0">
...
<profile name="full">
...
</profiles>

A escolha do profile a ser utilizado por grupo de servidores feita no tambm no arquivo
domain.xml da seguinte maneira:

<server-groups>
<server-group name="main-server-group" profile="full">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="full-sockets"/>
</server-group>
<server-group name="other-server-group" profile="full-ha">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="full-ha-sockets"/>
</server-group>
</server-groups>

O treco a acima encontrado no final do arquivo e note que em cada definio de grupo de
servidores temos o parmetro profile para cada um deles.

38
Profiles e suas diferenas

Para iniciar o WildFly no modo domnio basta executar o arquivo


$JBOSS_HOME/bin/domain.sh

39
Classloader Modular

ClassLoader Modular
ClassLoaders so parte de qualquer aplicao Java, nela reserva a responsabilidade de
carregar dinamicamente as classes para a Mquina Virtual Java (JVM) para ento criar
objetos a partir daquela classe. Geralmente essas classes so carregadas sob demanda,
ou seja, medida que objetos so instanciados o ClassLoader carrega o bytecode da
classe em memria.

O ClassLoader dividido em:

1. Bootstrap
2. Extension
3. System

No Bootstrap ClassLoader todas as classes dentro de JRE/lib/rt.jar so carregadas, bem


como qualquer outra classe de qualquer arquivo .jar que esteja dentro deste diretrio. Nele,
todas as classes pertencentes ao pacote java.lang so previamente carregadas, bem como
a prpria classe java.lang.Classloader. J no Extension ClassLoader todas as classes
pertencentes aos arquivos .jar localizados em JRE/lib/ext so carregadas e por fim o
System ClassLoader carrega as classes que estejam dentro do ClassPath, seja ela

40
Classloader Modular

especificada dentro da varivel de ambiente CLASSPATH ou ento atravs da opo -


classpath ou -cp do comando java. Ao inicializar a JVM, esses trs ClassLoaders so
criados e inicializados. Como pode ver na figura acima, a estrutura do ClassLoader
hierrquica, ou seja, antes de inicializar o System ClassLoader o Boostrap ClassLoader e o
Extension ClassLoader devem ser carregados primeiro. No Wildfly, a estrutura muda um
pouco e ela baseada em mdulos. Veremos na prxima seo como ela funciona.

41
O que e como funciona?

O que e como funciona?


O Wildfly introduziu uma nova forma de estruturar o Classloader, permitindo assim que as
dependncias entre as aplicaes possam ser mais fceis de gerenciar.

A estrutura do ClassLoader modular do JBoss previne os problemas conhecidos como JAR


Hell, assim permitindo que duas aplicaes possam utilizar bibliotecas jar de diferentes
verses.

42
Adicionando um mdulo customizado

Adicionando um mdulo customizado


Para criar um mdulo customizado no Wildly, necessrio criar uma estrutura dentro do
diretrio JBOSS_HOME/modules com a seguinte estrutura:

Nome do mdulo
main
module.xml
| biblioteca.jar

O mdulo precisa ter uma estrutura similar aos pacotes em java, ou seja, se voc possui um
pacote chamado br.com.empresa.aplicacao ento voc precisa ter um diretrio criado para
cada nome. Nesse exemplo, teria que haver um diretrio com dentro do diretrio br
contendo um subdiretrio empresa/aplicacao. Dentro dessa estrutura h um diretrio main,
onde espera-se que seja a ltima verso daquele mdulo (ou a verso padro, como quer
que queira chamar). Caso voc queira criar vrias verses do mesmo mdulo, basta criar
um subdiretrio dentro do diretrio do mdulo contendo o nome da verso. Por fim, todos os
arquivos .jar pertencentes a esse mdulo devem ser copiados dentro do caminho /main (ou
/versao, caso esteja criando uma nova verso do mdulo) e o arquivo module.xml. Esse
arquivo serve como um metadado dentro do mdulo, especificando os jars pertencentes a
esse mdulo bem como suas dependncias. Abaixo um exemplo:

com
myjars
jfreechart
main
| | jfreechart.jar
| | common.jar
| | module.xml
1.0.15
| | jfreechart.jar
| | common.jar
| | module.xml

Nessa estrutura existem dois mdulos: com.myjars.jfreechart:main e


com.myjars.jfreechart:1.0.15. Assim, eu posso ter uma aplicao que utiliza a primeira
verso do mdulo e uma outra aplicao utilizando a segunda no mesmo servidor Wildfly.

O arquivo module.xml

43
Adicionando um mdulo customizado

Para descrever o mdulo, necessrio criar um arquivo xml para indicar os jars
pertencentes a este mdulo bem como suas dependncias.

<?xml version="1.0" encoding="UTF-8"?>


<module xmlns="urn:jboss:module:1.1" name="com.myjars.jfreechart">
<resources>
<resource-root path="jfreechart.jar"/>
<resource-root path="jcommon.jar"/>
</resources>
</module>

44
Definindo dependncias explcitas de mdulos em sua aplicao

Definindo dependncias explcitas de


mdulos em sua aplicao
Uma vez que criamos nosso mdulo customizado, devemos agora definir as dependncias
para nossa aplicao. Para isso, utilizamos um arquivo de metadado chamado jboss-
deployment-structure.xml. O arquivo deve estar dentro da raiz da aplicao, no META-INF
ou no caso de aplicaes WAR dentro do WEB-INF. Abaixo um exemplo:

<?xml version="1.0" encoding="UTF-8"?>


<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.myjars.jfreechart" slot="main"/>
<module name="com.myjars.jcommon" />
</dependencies>
</deployment>
</jboss-deployment-structure>

O mdulo com.myjars.jfreechart:main foi adicionado como uma dependncia para a


aplicao em questo, permitindo ento que as classes desse mdulo sejam carregadas
dentro do ClassLoader da aplicao, assim como o mdulo com.myjars.jcommon. Nesse
caso, no h um atributo slot especificando qual verso do mdulo com.myjars.jcommon
ser usada, nesse caso o Wildfly
implicitamente busca por uma verso main e portanto caso o seu mdulo possua somente a
verso main ela no ser necessria, porm quando h mais de uma verso do mdulo
convm sempre definir o parmetro para dizer qual verso ser utilizada.

45
Configurando WildFly 10

Configurando WildFly 10
Nos prximos tpicos, iremos conhecer como configurar cada componente Java EE do
Wildfly e seus componentes de infraestrutura (como logging), mas antes de darmos incio
necessrio entendermos como eles foram desenvolvidos no Wildfly.

Diferente de verses anteriores, o Wildfly centralizou a configurao do servidor em um (no


mximo dois em modo Domain) arquivo de configurao e que atravs dele possvel
configurar qualquer coisa dentro do servidor. Na verdade, se considerarmos o que seria o
Wildfly, ele simplesmente uma espcie de Kernel do Wildly (conhecido como Wildfly Core)
onde possvel adicionar funcionalidades a ele (permitindo assim a extensibilidade na sua
arquitetura interna). Para suas funcionalidades foi introduzido os conceitos de extension e
subsystem, que so os blocos lgicos para adicionar/remover das funcionalidades do
servidor e sua configurao. Mas o que significa esses dois conceitos? Veremos em
detalhes a seguir.

Extension
O Extension do Wildfly a forma como o Wildfly Core pode reconhecer novas
funcionalidades e assim agregar ao seu funcionamento principal. Basicamente, a funo do
extension registrar uma funcionalidade para o Wildfly Core carregar em memria e
tambm gerenciar o ciclo de vida dela. Por exemplo, as extensions listadas no perfil padro
(standalone.xml) so as seguintes:

org.jboss.as.clustering.infinispan
org.jboss.as.connector
org.jboss.as.deployment-scanner
org.jboss.as.ee
org.jboss.as.ejb3
org.jboss.as.jaxrs
org.jboss.as.jdr
org.jboss.as.jmx
org.jboss.as.jpa
org.jboss.as.jsf
org.jboss.as.logging
org.jboss.as.mail
org.jboss.as.naming
org.jboss.as.pojo

46
Configurando WildFly 10

org.jboss.as.remoting
org.jboss.as.sar
org.jboss.as.security
org.jboss.as.transactions
org.jboss.as.webservices
org.jboss.as.weld
org.wildfly.extension.batch.jberet
org.wildfly.extension.bean-validation
org.wildfly.extension.io
org.wildfly.extension.request-controller
org.wildfly.extension.security.manager
org.wildfly.extension.undertow

Subsystem
Subsystem nada mais que a funcionalidade em si implementada e que registrada no
Wildfly Core pela Extenstion. Nela, possvel extender a funcionalidade atravs da
configurao via xml. O Subsystem onde realmente voc ter o suporte a Servlets no
Wildfly, EJB, Transaes, Logging, etc. Como exemplo, abaixo temos a configurao do
subsystem Logging:

47
Configurando WildFly 10

<subsystem xmlns="urn:jboss:domain:logging:3.0">
<console-handler name="CONSOLE">
<level name="INFO"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.jboss.as.config">
<level name="DEBUG"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<formatter name="PATTERN">
<pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t)
%s%e%n"/>
</formatter>
<formatter name="COLOR-PATTERN">
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %
s%e%n"/>
</formatter>
</subsystem>

Interfaces
Interfaces so denominaes lgicas para interfaces de rede que iro se associar aos
sockets (ver prxima seo) para expor algum servio de rede para os Subsystems. As
Interfaces podem associar os sockets para um IP em especfico ou at mesmo para uma

48
Configurando WildFly 10

NIC2 da mquina fsica, permitindo ento dedicar o trfego de rede dos Subsystems do
Wildfly passar por uma interface especfica de rede. Abaixo temos um exemplo de
Interfaces:

<interfaces>
<interface name="public">
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>
<interface name="internal">
<nic name="eth1"/>
</interface>
</interfaces>

Histrico de alteraes
Uma das maiores funcionalidades no Wildfly o registro histrico de configuraes. Dessa
forma, se houver qualquer alterao nos arquivos de configurao (seja ela editando
manualmente o arquivo, via JBoss CLI ou Console Web), o Wildfly ir criar um backup das
alteraes. Isso permite que no caso de alguma alterao afetar negativamente o ambiente
possvel reverter a alterao apenas copiando a ltima verso alterada.

A estrutura de histrio est descrita no captulo Diretrios. Para recuperar o arquivo, basta
sobreesrcrever o atual com um dos snapshots que ficam dentro do diretrio snapshots (o
snapshot o nome do arquivo de configurao seguido da data e hora de alterao).
2. NIC = Network Interface Card, ou simplesmente Interface de Rede

3. Definimos offset a soma a ser colocada no nmero da porta de cada Socket Binding

definido no grupo. Ex. Se definir um offset de 150 e a porta definida para o Socket
Binding http 8080, ento o nmero da porta 8230.

49
System properties

System properties
Voltando rapidamente ao tpico Interfaces, reparou em algo interessante na configurao?
Vou copiar o trecho aqui para deixar mais claro:

...
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
...

Perceba que o valor atribuido aqui foi escrito no formato de uma EL4, ou seja, possvel
definir dinmicamente um valor a ele ou apenas aceitar o valor padro (que no caso desse
exemplo 127.0.0.1 ). Essa funcionalidade permite que voc utilize placeholders dentro
dos arquivos de configurao permitindo que voc defina esses valores ao inicializar o
servidor sem precisar configurar os arquivos para cada instncia.

Para inicializar uma instncia de Wildfly alterando esse valor, basta que voc execute o
Wildfly dessa forma:

$ bin/standalone.sh -Djboss.bind.address=192.168.1.100

Esse comando ir iniciar uma instncia de Wildfly com todos os seus servios respondendo
ao IP 192.168.1.100 . A opo -D da linha de comando parte do java e conhecido
como System Property, onde qualquer aplicao Java pode receber valores dinmicamente
ao iniciar a JVM. O Wildfly fez uso dessa funcionalidade para tornar a configurao dos
seus subsystems mais fceis de alterar de instncia para instncia.

Configurando System Properties usando


JBoss Web Console
Possvel configurar tambm as System Properties via Web Console. Dessa forma,
possvel configurar sem precisar alterar os parmetros de inicializao. No entanto, ainda
assim necessrio reiniciar o servidor.

Para Adicionar uma System Property, siga os passos abaixo:

Acesse http://localhost:9990

50
System properties

Clique na aba Configuration

Clique em System Properties

51
System properties

Clique em View

Clique em Add . Preencha com o nome da System Property e seu valor e depois clique
em Save

52
System properties

Configurando System Properties usando


JBoss CLI
Tambm possvel utilizar o JBoss CLI para configurar as System Properties. Para isso,
basta executar o script jboss-cli.sh e execute o seguinte comando:

/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)

Exemplo:

/system-property=jboss.bind.address:add(value=192.168.1.2)

Utilizando System Properties no modo Domain


System Properties muito til em ambientes utilizando o modo Domain, pois possvel
configurar o escopo das System Properties das seguintes formas:

Geral (Aplica a todos os servidores daquele ambiente)


Server Group (Aplica aos servidores daquele Server Group especfico)
Server (Aplica-se em uma nica instncia)

53
System properties

No caso de haver uma System Property em mais de um escopo, prevalece aquele que
mais especfico. Ou seja, havendo a mesma System Property Geral e no Server Group,
prevalece a do Server Group, da mesma forma que se houver a mesma System Property no
Server Group e no Server, prevalece a do Server.
4. Expression Language

54
Socket-bindings

Socket-bindings
Socket Bindings define o conjunto de Sockets a serem utilizados pelos Subsystems do
Wildfly. Nele, voc pode definir um nome lgico para esse socket, a porta a ser utilizada, a
qual Interface ir responder, se o trfego somente de sada, etc. Alm disso, com a tag
3
<socket-binding-group> , possvel definir um offset de portas para que instncias

diferentes rodando na mesma mquina fsica no tenham conflito de portas. Abaixo temos
uma configurao de Socket Binding para o perfil Web:

<socket-binding-group name="standard-sockets" default-interface="public" port-offs


et="${jboss.socket.binding.port-offset:0}">
<socket-binding name="management-http" interface="management" port="${jboss.ma
nagement.http.port:9990}"/>
<socket-binding name="management-https" interface="management" port="${jboss.m
anagement.https.port:9993}"/>
<socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
<socket-binding name="http" port="${jboss.http.port:8080}"/>
<socket-binding name="https" port="${jboss.https.port:8443}"/>
<socket-binding name="txn-recovery-environment" port="4712"/>
<socket-binding name="txn-status-manager" port="4713"/>
<outbound-socket-binding name="mail-smtp">
<remote-destination host="localhost" port="25"/>
</outbound-socket-binding>
</socket-binding-group>

Como configurar
Alm da configurao manual no XML, possvel tambm alterar os Socket-Bindings de
outras maneiras a seguir:

Via Web Console


Acesse http://localhost:9990

Clique em Configuration

55
Socket-bindings

Clique em Socket Binding

Clique em View

56
Socket-bindings

Aparecer a listagem dos Socket Bindings disponveis, onde possvel


Adicionar/Remover/Editar os Socket Bindings

Via CLI

/socket-binding-group=new-sockets:add(default-interface=public)

/socket-binding-group=new-sockets/socket-binding=new-socket-binding:write-attribute(na
me=interface,value=unsecure)

57
Socket-bindings

Definindo Port Offset em modo Domain


/host=master/server-config=server-two/:write-attribute(name=socket-binding-port-offset
,value=250)

58
Subsystem datasource

Subsystem datasources
<subsystem xmlns="urn:jboss:domain:datasources:4.0">
<datasources>
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS">

<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
<driver>h2</driver>
<pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>20</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
</datasource>
<xa-datasource jndi-name="java:jboss/datasources/ExampleXADS" pool-name="Examp
leXADS">
<driver>h2</driver>
<xa-datasource-property name="URL">jdbc:h2:mem:test</xa-datasource-property>

<xa-pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>20</max-pool-size>
<prefill>true</prefill>
</xa-pool>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
</xa-datasource>
<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>

</subsystem>

Utilizando driver JDBC como deployment


Baixe o Driver JDBC

59
Subsystem datasource

Se o Driver JDBC do fornecedor ainda no compatvel com a verso JDBC 4, veja na


seo Tornando o Driver JDBC compatvel com a verso 4 para converter o Driver.
Faa o deploy do Driver JDBC:

$ EAP_HOME/bin/jboss-cli.sh
$ deploy driver-jdbc.jar

Caso o deploy tenha sido feito com sucesso, voc ver a seguinte mensagem no log do
servidor:

WFLYJCA0018: Started Driver service with driver-name = jdbc-driver.jar_com.sua.classe.


jdbc

Instalando driver JDBC como mdulo


Baixe o Driver JDBC
Se o Driver JDBC do fornecedor ainda no compatvel com a verso JDBC 4, veja na
seo Tornando o Driver JDBC compatvel com a verso 4 para converter o Driver.
Execute o JBoss CLI

$ EAP_HOME/bin/jboss-cli.sh

No prompt do JBoss CLI, execute o seguinte comando:

module add --name=MODULE_NAME --resources=PATH_TO_JDBC_JAR --dependencies=DEPENDENCIES

Um exemplo para adicionar o Driver JDBC seria assim:

module add --name=com.mysql --resources=/caminho/do/mysql-connector-java-5.1.36-bin.ja


r --dependencies=javax.api,javax.transaction.api

Ao executar o comando anterior, o Wildfly ir:

Criar um subdiretrio WILDFLY_HOME/modules/com/seu/modulo/jdbc/main


Copiar o JAR dentro desse diretrio
Criar um arquivo module.xml contendo a configurao para o mdulo (Veja a
seo Adicionando um mdulo customizado para maiores detalhes)
Conecte-se instncia do Wildfly com o seguinte comando:

60
Subsystem datasource

connect

Registre o Driver JDBC, passando o nome do mdulo recm-adicionado:

/subsystem=datasources/jdbc-driver=DRIVER_NAME:add(driver-name=DRIVER_NAME,driver-modu
le-name=MODULE_NAME,driver-xa-datasource-class-name=XA_DATASOURCE_CLASS_NAME, driver-c
lass-name=DRIVER_CLASS_NAME)

Um exemplo para adicionar o Driver JDBC do MySQL seria:

/subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.
mysql,driver-xa-datasource-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource,
driver-class-name=com.mysql.jdbc.Driver)

Tornando o Driver JDBC compatvel com a


verso 4
Crie um diretrio temporrio para hospedar os arquivos.
Crie dentro desse diretrio um subdiretrio META-INF/services
Dentro do subdiretrio META-INF/services, crie um arquivo chamado java.sql.Driver
Abra o arquivo e escreva em uma nica linha o nome completo da classe com o seu
pacote(denominado Fully-Qualified Class Name). Exemplo para o Driver do MySQL;

com.mysql.jdbc.Driver

Utilize o comando jar do Java para incluir o novo arquivo no Driver JDBC:

$ jar \-uf driver-jdbc.jar META-INF/services/java.sql.Driver

61
Subsystem mail

Subsystem Mail
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=my-s
mtp:add(host=localhost, port=25)

/subsystem=mail/mail-session=mySession:add(jndi-name=java:jboss/mail/MySession)

/subsystem=mail/mail-session=mySession/server=smtp:add(outbound-socket-binding-ref=my-
smtp, username=user, password=pass, tls=true)

@Resource(lookup="java:jboss/mail/MySession")
private Session session;

Configurando um servidor POP3


/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=my-p
op3-binding:add(host=localhost, port=110)
/subsystem=mail/mail-session=mySession/server=pop3:add(outbound-socket-binding-ref=my-
pop3-binding, username=user, password=pass)

Configurando um servidor IMAP


/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=my-i
map-binding:add(host=localhost, port=143)
/subsystem=mail/mail-session=mySession/server=imap:add(outbound-socket-binding-ref=my-
imap-binding, username=user, password=pass)

Enviando seu primeiro email com uma


aplicao java

62
Subsystem logging

Subsystem Logging
Em modo Standalone: WILDLFY_HOME/standalone/server/log
Em modo Domain: WILDFLY_HOME/domain/servers/SERVIDOR/log/server.log

Configurando Logging
Em modo Standalone: WILDFLY_HOME/standalone/configuration/logging.properties
Em modo Domain: WILDFLY_HOME/domain/servers/SERVIDOR/data/server.log

Inspecionando erros em tempo de bootstrap


/core-service=management:read-boot-errors

Configurando Logging por aplicao


<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.0.Final-redhat-1</version>
<scope>provided</scope>
</dependency>

import org.jboss.logging.Logger;

private static final Logger LOGGER = Logger.getLogger(MinhaClasse.class);

LOGGER.debug("debug");
LOGGER.info("info");
LOGGER.error("error");
LOGGER.trace("trace");
LOGGER.fatal("fatal");

Para empacotamentos EAR, no diretrio META-INF


Para empacotamentos WAR, no diretrio WEB-INF/classes

63
Subsystem logging

Desabilitando Logging por aplicao

/subsystem=logging:write-attribute(name=use-deployment-logging-config,value=false)

Visualizando arquivos de log

64
Subsystem segurana

65
Subsystem servios Web

66
Subsystem Transaes

67
Subsystem Remoting

68
Subsystem IO

69
Subsystem Batch

Subsystem batch
<subsystem xmlns="urn:jboss:domain:batch-jberet:1.0">
<default-job-repository name="in-memory"/>
<default-thread-pool name="batch"/>
<job-repository name="in-memory">
<in-memory/>
</job-repository>
<thread-pool name="batch">
<max-threads count="10"/>
<keepalive-time time="30" unit="seconds"/>
</thread-pool>
</subsystem>

70
Subsystem Messaging

Subsystem Messaging

71
Alta disponibilidade (HA)

72
Subsystem jGroups

73
Subsystem Infinispan

74
Wildfly como loadbalancer

75
Configurando loadbalancer externos

76
Modo Domain passo a passo

77
Primeiros Passos

78

You might also like