Escolar Documentos
Profissional Documentos
Cultura Documentos
of Contents
Prefácio 1.1
Introdução 1.2
O que é o Wildfly? 1.2.1
Instalação 1.2.2
Requisitos 1.2.2.1
Downloads 1.2.2.2
Instalação passo a passo 1.2.2.3
Criando usuário de gerenciamento 1.2.2.4
Instalando como Serviço no Linux 1.2.2.5
Instalando como Serviço no Windows 1.2.2.6
Estrutura - Cada coisa em seu lugar! 1.3
Diretórios 1.3.1
Arquivos de configuração 1.3.2
Modo Standalone x Domain 1.3.3
Profiles e suas diferenças 1.3.4
Classloader Modular 1.4
O que é e como funciona? 1.4.1
Adicionando um módulo customizado 1.4.2
Definindo dependências explícitas de módulos em sua aplicação 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 segurança 1.5.6
Subsystem serviços Web 1.5.7
Subsystem Transações 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
Prefácio
O livro é gratuito e toda e qualquer informação aqui encontrada é de autoria dos membros
da comunidade e do JBUG:Brasil, qualquer novo conteúdo será revisado e googlado antes
de ser publicado. Todo e qualquer conteúdo aqui encontrado pode ser compartilhado porém
de forma alguma poderá ser utilizado para fins comerciais, sendo destinado aos usuários do
Brasil, só será disponibilizado em pt-BR.
Este livro irá abordar desde a instalação e configuração do Servidor de aplicações WildFly.
Se você está procurando informações sobre o WildFly, este livro é o lugar certo.
Contribuições
O livro está em constante edição e sempre que achar que algum conteúdo ainda não
abordado é interessante por favor nos envie sua sugestão.
Qualquer contribuição é bem vinda, clone o projeto, faça suas alterações e nos envie um
pull request para que possamos validar o conteúdo que você escreveu.
Utilize o GitHub para realizar fork deste livro e efetuar suas alterações. Maiores informações
podem ser encontradas no link abaixo.
Comunidade
Estamos no IRC: No freenode, canal #jbug-brasil e jboss.org.
E também no telegram, grupo JBug Brasil, sinta-se a vontade para entrar no grupo através
deste convite.
4
Prefácio
Erros/Sugestões? :-)
Achou algum erro de qualquer espécie ou até mesmo algum conteúdo que você não
concorde? Sinta-se a vontade para corrigir ou enviar sugestões.
5
Introdução
Introdução
Java é o nome dado tanto à linguagem de programação largamente conhecida quanto à
plataforma por trás da linguagem. Sua popularidade se deve ao fato de que a linguagem é
compilada em um código intermediário (conhecida como Bytecode) para execução dentro
da Máquina Virtual Java (ou JVM). Isso proporcionou ao Java uma série de facilidades na
programação que permite ao desenvolvedor se preocupar somente em programar o que
realmente é necessário para a programação, deixando questões como coleta de lixo
(Garbage Collection), performance de execução de código nativo, gerenciamento de
memória e outros para a Máquina Virtual Java. Tal característica hoje é utilizada em outras
linguagens de programação, como .NET e Python, tamanha a importância da Máquina
Virtual nos paradigmas atuais de linguagens de programação.
Isso proporcionou à Máquina Virtual Java não somente executar programas escritas na
linguagem Java como também outras linguagens. Atualmente, é possível executar
programas escritos em Groovy, Scala, Python, Ruby e outros na Máquina Virtual Java por
conta dessas linguagens disponibilizarem compiladores especiais que permitem criar o
Bytecode para executar na JVM.
6
Introdução
A plataforma Java, desde a sua concepção, recebeu algumas divisões com o objetivo de
tornar a evolução da plataforma focado em seus devidos objetivos, dentre eles podemos
citar:
Java Standard Edition (ou Java SE): É o nome dado à plataforma nas sua mais básica
utilização, cobrindo toda a implementação da Linguagem Java, do Bytecode e da JVM.
Java Enterprise Edition (ou Java EE): É o nome dado à plataforma com foco em
aplicações corporativas (objetivo desde livro), cobrindo características como
persistência de dados, distributabilidade, segurança e outros assuntos pertinentes.
Desde a versão 1.6 do Java EE a plataforma se dividiu em dois perfis (profiles): web:
Onde tudo o que será utilizado/disponibilidado por um fornecedor serão características
que permitem o desenvolvimento de uma aplicação Web full: Onde o que será
utilizado/disponibilizado pelo fornecedor serão todo o perfil Web mais características
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 específico é dividida dois
perfis, sendo eles:
Connected Limited Device Configuration (ou CLDC): Um perfil com foco em
dispositivos que possuem conexão limitada ou nenhuma conexão com a Internet
Connected Device Configuration (ou CDC): Um perfil com foco em dispositivos que
possuem conexão com Internet
Java Card: Uma plataforma muito específica com foco no desenvolvimento de
aplicações 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 não iremos extender em descrever
todas. Conforme já mencionado, o objetivo deste livro está no foco ao Java EE, onde o
Wildfly implementa suas características.
7
Introdução
Sendo assim, a JCP define como determinada plataforma deve ser construída, ficando a
cargo das empresas interessadas em ter um software alinhado àquela plataforma
literalmente implementar aquelas especificações. Hoje, empresas como Oracle, Red Hat e
IBM são as principais que trabalham para implementar essas especificações em suas
soluções.
O Wildfly, então, é uma implementação da plataforma Java EE. Isso significa que todas as
especificações determinadas para uma determinada versão do Java EE (a versão mais
recente é a Java EE 1.7) foram implementadas no Wildfly.
Distributabilidade
Persistência
Segurança
Gerenciamento de Transações
Mensageria
Entre outros...
8
Introdução
É importante lembrar que o objetivo da especificação Java EE (sim, Java EE também é uma
especificação, conhecida como Umbrella Specification) é padronizar o uso de determinadas
tecnologias e portanto ela não tem como objetivo criar inovações tecnológicas em torno da
plataforma. Seu objetivo principal é evitar o fenômeno chamado de Vendor Lock-In, que é
um fornecedor "prender" seus clientes a uma característica muito específica e que altera
uma funcionalidade do Java EE. Claro que há outros aspectos que o Java EE não pretende
controlar, como por exemplo Clustering, sendo esse livre para o fornecedor criar sua própria
implementação. A este caso específico foi dada essa liberdade de implementação para
permitir a livre concorrência entre seus fornecedores e atraí-os para a comunidade Java.
1. Unparalleled Speed: O Wildfly possui um startup mais veloz, o processo de boot foi
otimizado desde o Wildfly 8, agora os processos são iniciado paralelamente para
eliminar esperas desnecessárias e aproveitar o poder dos processadores multi-core.
Os serviços não críticos são mantidos em gelo até o primeiro uso.A partir do Wildfly 8
foi inserido um novo web server de alta performance, o undertow que tem a habilidade
de escalar mais de um milhão de conexões. Isso nos dá a capacidade de atender
alguns requisitos de modernas aplicações web, como: Conectividade, Responsividade
e Habilidade de escalar.
9
Introdução
comando e utilizando o Gerenciar web. Não se preocupe, iremos abordar esses temas
nos próximos capítulos. Ainda é possível executar o Wildfly de dois modos: Standalone
(uma JVM) ou Domain (várias JVMs), isto também será abordado em capítulos futuros.
7. Based on the Best of Open Source: RestEasy, Weld, Hibernate, HornetQ e Arquillian
são algumas das tecnologias que estão presentes no Wildfly.
10
O que é o Wildfly?
O que é o Wildfly?
Wildfly, também conhecido como JBoss, é um servidor de aplicação Java EE desenvolvido
em Java e pode ser executado em qualquer Sistema Operacional, 32 ou 64 bits que tenha
suporte ao Java.
Houve então uma votação 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 divisão de Middleware da Red Hat) e depois de uma pré-seleção cinco
nomes foram selecionados para a votação da comunidade. Wildfly foi o nome mais votado
entre vários outros, a troca de nomes foi oficialmente anunciada no JUDCon Brazil de 2013
em São Paulo e mais tarde Mark Little postou em seu blog o anúncio.
11
Instalação
Instalação
Este capítulo irá abordar o processo de instalação passo a passo desde os downloads até a
primeira inicialização do Wildfly e também os primeiros passos após sua instalação.
12
Requisitos
Requisitos
Para executar o Wildfly o único requisito é possuir uma máquina física ou virtual
independentemente do sistema operacional com memória suficiente para a execução. A
quantidade de memória necessária pode variar de acordo com a aplicação que será
executada. A configuração padrão do Wildfly está configurada da seguinte maneira:
-Xms64m -Xmx512m
O que significa que o mínimo de memória utilizada é 64mb e pode crescer até 512mb.
Porém o principal requisito é o seu interesse por este magnífico Servidor de Aplicação.
Vamos começar, no próximo tópico vamos aos Downloads e consequentemente a
instalação.
13
Downloads
Downloads
No presente momento, iremos utilizar o Wildfly versão 10.1.0.Final no decorrer dos
próximos tópicos. Sendo este conteúdo atualizado conforme novas versões forem lançadas.
Além das versões Final existem também as Beta e Alpha que são lançadas antes da Final
com o intuito de testar o Servidor de Aplicação para que a versão Final seja o mais perto
possível de ser bug free.
Podemos encontrar todas as versões disponíveis para download neste link, realize o
download da versão 10.1.0.Final ou clique aqui para realizar o download.
Não se preocupe, caso esteja utilizando Windows os próximos passos serão muito
semelhantes, os principais pontos diferentes serão nos arquivos selecionados para
download, também está disponível para download o arquivo extensão .zip.
Se precisa usar Java 7 não se preocupe, o Wildfly também é compatível com a versão 7 do
Java.
Neste caso irei utilizar a versão 8 do Java que pode ser encontrado neste link.
Lembre-se que para realizar o download do Java é necessário escolher o binário de acordo
com o Sistema Operacional que estiver utilizando. Neste caso estaremos utilizando o
seguinte binário: jdk-8u101-linux-x64.rpm. Se preferir você também pode utilizar o
OpenJDK, o que torna a instalação bem mais simples no Linux
Ou
14
Downloads
Após a finalização 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 próximo tópico.
15
Instalação passo a passo
Bom, como todos nós temos o direito de escolha, para ilustrar os exemplos deste tópico e
dos demais irei usar a seguinte configuração:
Obs: O banco de dados não será necessário neste primeiro momento, mas será utilizado
em capítulos futuros.
Neste caso utilizarei um usuário chamado _wildfly _que será somente utilizado para
executar o WildFly, para criar o usuário execute o seguinte comando:
16
Instalação passo a passo
# cd /opt
# ln -s wildfly-10.1.0.Final wildfly
# ll /opt
total 0
drwxr-xr-x. 10 root root 220 Jul 28 01:02 wildfly-10.1.0.Final
Note que as permissões de usuário e grupo estão configuradas para o usuário root, como
boas práticas não iremos utilizar o usuário root para execução do WildFly, e sim o usuário
criado anteriormente, altere as permissões com o seguinte comando:
Caso ocorra tudo bem durante a inicialização do WildFly você terá um log muito semelhante
a este:
17
Instalação passo a passo
JBOSS_HOME: /opt/wildfly-10.1.0.Final
JAVA: java
=========================================================================
18
Instalação passo a passo
19
Instalação 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)
20
Criando usuário de gerenciamento
Neste tópico iremos abordar somente a criação de usuário de gerenciamento bem como
acessar a console de gerenciamento.
Caso você tente acessar a console de gerenciamento sem ter antes, criado o usuário você
será redirecionado para a página abaixo informando que é necessário executar o script add-
user.sh (add-user.bat para Windows) para adicionar um usuário de gerenciamento
utilizando o realm ManagementRealm:
Acesse http://localhost:9990
21
Criando usuário de gerenciamento
$ ./add-user.sh
22
Criando usuário de gerenciamento
Logo a seguir você será informado que o usuário admin já existe porém está desativado e
irá lhe mostrar as opções disponíveis:
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 opção de atualizar usuário existente e seus grupos, ativar o usuário existente ou
digitar um novo username. Neste caso iremos somente atualizar a senha do usuário admin,
por padrão esta opção já está selecionada, apenas tecle enter.
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 próximo passo é definir os grupos, no momento não será necessário 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'
23
Criando usuário de gerenciamento
O script irá perguntá-lo se se este usuário será utilizado para autenticação entre 2
servidores WildFly (Veremos com mais detalhes este processo na configuração do modo
Domain). Neste caso será um usuário 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
Dicas
24
Criando usuário de gerenciamento
username=8959126dd54df47f694cd762a51a1a6f
25
Criando usuário de gerenciamento
#
# Password restriction
#
# Password must not match the username. Valid values: TRUE or FALSE.
password.restriction.mustNotMatchUsername=TRUE
# 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
Para alterar a política de senha conforme suas necessidades apenas edite a propriedade
desejada neste arquivo e salve. As configurações realizadas já serão aplicadas na criação
do próximo usuário.
26
Instalando como Serviço no Linux
Init.d
Executar o WildFly como serviso utilizando o init.d é um tarefa simples, assim como
utilizando o systemd que será abordado a seguir. Todos os scripts utilizando estão
localizados no diretório $JBOSS_HOME/docs/contrib/scripts/init.d/. Dentro deste diretório
podemos ver os seguintes arquivos:
wildfly.conf: Por fim, o arquivo de configuração utilizado pelos dois arquivos init
descritos acima.
O primeiro passo é copiar o o arquivo de script, de arcordo com sua distribuição Linux, para
o diretório /etc/init.d. Como utilizamos o Fedora, iremos executar o seguinte comando:
27
Instalando como Serviço no Linux
cp /opt/wildfly/docs/contrib/scripts/init.d/wildfly-init-redhat.sh /etc/init.d/wildfly
Agora precisamos copiar o arquivo de configuração wildfly.conf para onde o script espera
que ele esteja, em /etc/default como podemos observar no script copiado anteriormente:
(...)
(...)
mkdir -p /etc/default
cp /opt/wildfly/docs/contrib/scripts/init.d/wildfly.conf /etc/default
O próximo passo será editar o arquivo wildfly.conf previamente copiado com as seguintes
informações:
#Location of Java
JAVA_HOME=/usr/java/jdk1.8.0_45
# Location of WildFly
JBOSS_HOME=/opt/wildfly/
Note que é possível executar em modo domain, além de passar outros parâmetros, como:
28
Instalando como Serviço no Linux
Caso tudo ocorra bem, a seguinte saída deve ser mostrada no console:
Systemd
O arquivo de configuração do systemd disponibilizado na instalação do WildFly já está
pronto para uso, sendo necessário realizar somente alguns passos antes de executá-lo
como serviço.
29
Instalando como Serviço no Linux
Neste ponto, será necessário ter efetuado os passos descritos no tópico Instalação passo a
passo. Com o ambiente pré configurado, siga os passos abaixo:
# 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á estão pré configurados, depois de executar todos os passos acima, já
estamos prontos para iniciar o wildfly.
Para configurar o serviço do WildFly para usar o modo Domain ao invés do modo
Standalone (padrão), edite o arquivo wildfly.service localizado em /etc/wildfly conforme o
exemplo abaixo:
Por padrão o endereço de bind vem configurado como 0.0.0.0, não é uma boa prática
deixá-lo com essa configuração, altere o endeço de bind para o endereço de IP do servidor
em que o WildFly será executado. Para alterar o endereço de bind edite o mesmo arquivo
citado acima da seguinte maneira, como exemplo será utilizado o ip 192.168.1.10:
30
Instalando como Serviço no Linux
31
Instalando como Serviço no Windows
Instalar o WildFly 10 como um serviço Windows está muito mais simples do que nas
versões anteriores. Não é necessário instalar nenhuma biblioteca de terceiro uma vez que o
WildFly prove tudo que você precisa para executar esta atividade.
Como comentado no capítulo anterior os arquivos para executar o WildFly como serviço
estão localizados na pasta JBOSS_HOME/docs/contrib/scripts/service.
Para instalar o serviço em modo standalone basta executar o seguinte comando dentro da
pasta JBOSS_HOME/docs/contrib/scripts/service pela linha de comando.
service install
Agora você pode gerenciar o serviço, realizando start, stop ou restart pelo Windows
Service. Caso a instalação tenha ocorrido corretamente, será possível ver o serviço em
Windows Service para isto acesse:
service start
service restart
service stop
Para executar em modo domain, é necessário passar mais alguns parâmetros para o
comando service.bat como Domain controller (Por padrão é 127.0.0.1 e porta 9990) e
também o nome do host (por padrão é "master").
32
Instalando como Serviço no Windows
33
Estrutura - Cada coisa em seu lugar!
34
Diretórios
Diretórios
O WildFly manteve praticamente a mesma estrutura de diretórios do JBoss AS 7, enxuta e
centralizada. Para aqueles que ainda não estão familiarizados com essa nova estrutura, a
próxima seção descreverá em detalhes abaixo.
$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
35
Diretórios
<subsystem xmlns="urn:jboss:domain:logging:3.0">
Note que ele está utilizando a versão 3.0 do schema logging. Este mesmo
padrão é válido para todos os outros subsystems.
domain - Abriga toda a configuração do modo domain bem como os arquivos dos
servidores gerenciados (veremos melhor sobre isso mais a frente) e arquivos de
deployments, arquivos temporários e arquivos de logs.
configuration - Contém todos os arquivos de configuração do modo domínio.
domain_xml_history - Contém todo o histórico dos arquivos de configuração.
current - Armazena a configuração corrente com sufixos v1, v2, vX.
snapshot - Armazena os snapshots, obtidos através do comando CLI
/host=HOSTNAME:take-snapshot
36
Diretórios
37
Arquivos de configuração
Arquivos de configuração
Desde o JBoss AS 7, a configuração é 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 não teve alterações, porém se você
ainda não a conhece irá achar um pouco estranho a forma como está distribuída agora.
QUando comparada com a versões mais antigas do JBoss, temo uma grande diferença,
principalmente porque os arquivos de configuração eram diversos, em diferentes diretórios,
componentes, etc. Se você está migrando do JBoss AS 6 ou versões anteriores, é de
extrema importância que você leia este capítulo para ficar antenado com a estrutura dos
arquivos de configuração do WildFly.
O intuíto deste tópico será somente descrever os principais arquivos de configurações e sua
aplicabilidade, será tratado em tópicos posteriores como configurar o WildFly.
Configurações em geral;
Configurações do modo standalone;
Configurações do modo domínio.
Configurações Gerais
Iremos começar com as confiugurações bem básicas que são as configurações realizadas
dentro do diterório bin. Nele temos os seguintes arquivos de configuração:
Obs: O wildFly 10 já possui suporte ao PowerShell, note que já há vários scripts com o
sufixo ps1 no diretório bin.
38
Arquivos de configuração
39
Modo Standalone x Domain
Modo Standalone
O modo Standalone é o modo tradicional das versões anteriores. Basicamente implica em
ter uma instalação diferente (ou um diretório standalone diferente) para cada instância1 de
Wildfly. Ou seja, para cada Wildfly rodando no seu ambiente é necessário alterar seus
próprios arquivo de configuração, suas próprias opções de execução para JVM, etc.
Modo Domain
O modo Domain é o modo que foi introduzido no JBoss AS 7 onde é possível gerenciar um
conjunto de instâncias Wildfly, agrupando-os e assim permitindo compartilhar configurações
comuns entre eles. Além de compartilhar configurações, é possível também através de um
único console de gerenciamento iniciar ou parar instâncias (ou grupos inteiros), verificar seu
status e estatísticas de cada subsystem (falaremos sobre isso mais adiante), etc.
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 é necessário ter em
mente as seguintea perguntas:
Com base nessas perguntas, você consegue decidir com bastante clareza e segurança qual
o melhor modo a ser utilizado.
isoladamente. ↩
41
Profiles e suas diferenças
Arquivo de
Perfil Utilização
configuração*
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 características de HA
$ ./standalone.sh -c standalone-full-ha.xml
42
Profiles e suas diferenças
Os profiles são estruturados da mesma maneira que os profiles do modo standalone, porém
com uma pequena diferença, repare na tabela abaixo:
Nome do
Perfil Utilização
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 características de HA
Full c/ Permite o uso do perfil Java EE Full com características
full-ha
HA de HA
<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 também 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 definição de grupo de
servidores temos o parâmetro profile para cada um deles.
43
Profiles e suas diferenças
44
Classloader Modular
ClassLoader Modular
ClassLoaders são parte de qualquer aplicação Java, nela reserva a responsabilidade de
carregar dinamicamente as classes para a Máquina Virtual Java (JVM) para então criar
objetos a partir daquela classe. Geralmente essas classes são carregadas sob demanda,
ou seja, à medida que objetos são instanciados o ClassLoader carrega o bytecode da
classe em memória.
1. Bootstrap
2. Extension
3. System
45
Classloader Modular
46
O que é e como funciona?
47
Adicionando um módulo customizado
Nome do módulo
├── main
│ ├── module.xml
| └── biblioteca.jar
O módulo precisa ter uma estrutura similar aos pacotes em java, ou seja, se você possui um
pacote chamado br.com.empresa.aplicacao então você precisa ter um diretório criado para
cada nome. Nesse exemplo, teria que haver um diretório com dentro do diretório br
contendo um subdiretório empresa/aplicacao. Dentro dessa estrutura há um diretório main,
onde espera-se que seja a última versão daquele módulo (ou a versão padrão, como quer
que queira chamar). Caso você queira criar várias versões do mesmo módulo, basta criar
um subdiretório dentro do diretório do módulo contendo o nome da versão. Por fim, todos os
arquivos .jar pertencentes a esse módulo devem ser copiados dentro do caminho /main (ou
/versao, caso esteja criando uma nova versão do módulo) e o arquivo module.xml. Esse
arquivo serve como um metadado dentro do módulo, especificando os jars pertencentes a
esse módulo bem como suas dependências. Abaixo um exemplo:
com
├── myjars
│ ├── jfreechart
│ │ ├── main
| │ | ├── jfreechart.jar
| │ | ├── common.jar
| │ | └── module.xml
│ │ ├── 1.0.15
| │ | ├── jfreechart.jar
| │ | ├── common.jar
| │ | └── module.xml
O arquivo module.xml
48
Adicionando um módulo customizado
Para descrever o módulo, é necessário criar um arquivo xml para indicar os jars
pertencentes a este módulo bem como suas dependências.
49
Definindo dependências explícitas de módulos em sua aplicação
50
Configurando WildFly 10
Configurando WildFly 10
Nos próximos tópicos, iremos conhecer como configurar cada componente Java EE do
Wildfly e seus componentes de infraestrutura (como logging), mas antes de darmos início é
necessário entendermos como eles foram desenvolvidos no Wildfly.
Extension
O Extension do Wildfly é a forma como o Wildfly Core pode reconhecer novas
funcionalidades e assim agregar ao seu funcionamento principal. Basicamente, a função do
extension é registrar uma funcionalidade para o Wildfly Core carregar em memória e
também gerenciar o ciclo de vida dela. Por exemplo, as extensions listadas no perfil padrão
(standalone.xml) são 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
51
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, é possível extender a funcionalidade através da
configuração via xml. O Subsystem é onde realmente você terá o suporte a Servlets no
Wildfly, EJB, Transações, Logging, etc. Como exemplo, abaixo temos a configuração do
subsystem Logging:
52
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>
Histórico de alterações
Uma das maiores funcionalidades no Wildfly é o registro histórico de configurações. Dessa
forma, se houver qualquer alteração nos arquivos de configuração (seja ela editando
manualmente o arquivo, via JBoss CLI ou Console Web), o Wildfly irá criar um backup das
alterações. Isso permite que no caso de alguma alteração afetar negativamente o ambiente
é possível reverter a alteração apenas copiando a última versão alterada.
53
Configurando WildFly 10
A estrutura de histório está descrita no capítulo Diretórios. Para recuperar o arquivo, basta
sobreesrcrever o atual com um dos snapshots que ficam dentro do diretório snapshots (o
snapshot é o nome do arquivo de configuração seguido da data e hora de alteração).
2. NIC = Network Interface Card, ou simplesmente Interface de Rede ↩
3. Definimos offset a soma a ser colocada no número 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, então o número da porta é 8230. ↩
54
System properties
System properties
Voltando rapidamente ao tópico Interfaces, reparou em algo interessante na configuração?
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, é possível
definir dinâmicamente um valor a ele ou apenas aceitar o valor padrão (que no caso desse
exemplo é 127.0.0.1 ). Essa funcionalidade permite que você utilize placeholders dentro
dos arquivos de configuração permitindo que você defina esses valores ao inicializar o
servidor sem precisar configurar os arquivos para cada instância.
Para inicializar uma instância 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 instância de Wildfly com todos os seus serviços respondendo
ao IP 192.168.1.100 . A opção -D da linha de comando é parte do java e é conhecido
como System Property, onde qualquer aplicação Java pode receber valores dinâmicamente
ao iniciar a JVM. O Wildfly fez uso dessa funcionalidade para tornar a configuração dos
seus subsystems mais fáceis de alterar de instância para instância.
Para Adicionar uma System Property através da console de gerenciamento, siga os passos
abaixo:
Acesse http://localhost:9990
55
System properties
56
System properties
Clique em View
Clique em Add . Preencha com o nome da System Property e seu valor e depois clique
em Save
57
System properties
/system-property=PROPERTY_NAME:add(value=PROPERTY_VALUE)
Exemplo:
/system-property=jboss.bind.address:add(value=192.168.1.2)
58
System properties
-Dminha.propriedade=meu_valor
Repare no -D, é este prefixo que define que o valor que o sucede é uma SystemProperty e
o que está depois do sinal de igual = é o seu respectivo valor.
$WFLY_HOME/bin/standalone.sh -Dminha.propriedade=meu_valor
[domain@localhost:9990 /] /system-property=minha.propriedade:add(value=test)
{
"outcome" => "success",
"result" => undefined,
"server-groups" => {
"main-server-group" => {"host" => {"master" => {
"server-one" => {"response" => {"outcome" => "success"}},
"server-two" => {"response" => {"outcome" => "success"}}
}}},
"other-server-group" => {"host" => {"master" => {"server-three" => {"respons
e" => {"outcome" => "success"}}}}}
}
}
59
System properties
[domain@localhost:9990 /] /host=master/server=server-one/system-property=minha.prope
rty:read-resource
{
"outcome" => "success",
"result" => {"value" => "test"}
}
[domain@localhost:9990 /] /host=master/server=server-three/system-property=minha.pro
perty:read-resource
{
"outcome" => "success",
"result" => {"value" => "test"}
}
Server Group (Aplica aos servidores daquele Server Group específico), neste caso
outra propriedade de sistema será adicionada para validar a configuração:
[domain@localhost:9990 /] /server-group=other-server-group/system-property=other.ser
ver.group:add(value="Outra Grupo de Servidores")
{
"outcome" => "success",
"result" => undefined,
"server-groups" => {"other-server-group" => {"host" => {"master" => {"server-thr
ee" => {"response" => {"outcome" => "success"}}}}}}
}
Note que esta propriedade de sistema estará disponíveis somente para servidores
gerenciados membros do grupo de servidores other-server-group. Note que ela não está
disponível no server-one:
[domain@localhost:9990 /] /host=master/server=server-one/system-property=minha.prope
rty:read-resource
{
"outcome" => "success",
"result" => {"value" => "test"}
}
No caso de haver uma System Property em mais de um escopo, prevalece aquele que é
mais específico. 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.
60
System properties
61
Socket-bindings
Socket-bindings
Socket Bindings define o conjunto de Sockets a serem utilizados pelos Subsystems do
Wildfly. Nele, você pode definir um nome lógico para esse socket, a porta a ser utilizada, a
qual Interface irá responder, se o tráfego é somente de saída, etc. Além disso, com a tag
3
<socket-binding-group> , é possível definir um offset de portas para que instâncias
diferentes rodando na mesma máquina física não tenham conflito de portas. Abaixo temos
uma configuração de Socket Binding para o perfil Web:
Como configurar
Além da configuração manual no XML, é possível também alterar os Socket-Bindings de
outras maneiras a seguir:
Clique em Configuration
62
Socket-bindings
Clique em View
63
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)
64
Socket-bindings
Interfaces
Interfaces são denominações lógicas para interfaces de rede que irão se associar aos
sockets (ver próxima seção) para expor algum serviço de rede para os Subsystems. As
Interfaces podem associar os sockets para um IP em específico ou até mesmo para uma
NIC2 da máquina física, permitindo então dedicar o tráfego de rede dos Subsystems do
Wildfly passar por uma interface específica 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>
65
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>
66
Subsystem datasource
Se o Driver JDBC do fornecedor ainda não é compatível com a versão JDBC 4, veja na
seção Tornando o Driver JDBC compatível com a versão 4 para converter o Driver.
Faça 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:
$ EAP_HOME/bin/jboss-cli.sh
67
Subsystem datasource
connect
/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)
/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)
com.mysql.jdbc.Driver
Utilize o comando jar do Java para incluir o novo arquivo no Driver JDBC:
68
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;
69
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
import org.jboss.logging.Logger;
LOGGER.debug("debug");
LOGGER.info("info");
LOGGER.error("error");
LOGGER.trace("trace");
LOGGER.fatal("fatal");
70
Subsystem logging
/subsystem=logging:write-attribute(name=use-deployment-logging-config,value=false)
71
Subsystem segurança
72
Subsystem serviços Web
73
Subsystem Transações
74
Subsystem servidor Web
75
Subsystem Remoting
76
Subsystem IO
77
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>
78
Subsystem Messaging
Subsystem Messaging
79
Alta disponibilidade (HA)
80
Subsystem jGroups
81
Subsystem Infinispan
82
Wildfly como loadbalancer
83
Configurando loadbalancer externos
84
Modo Domain passo a passo
85
Primeiros Passos
86