JBoss / Wildfly

★Standalone mode vs Domain mode

Standalone mode

1つのJavaVMプロセスで1つのJBossサーバを起動

それぞれのJBossサーバを個別に管理

複数のJBossサーバでクラスタを構成

Domain mode

多数のJBossホスト(サーバの起動・停止やアプリケーションのデプロイ)を管理ホストから一元管理

★インストール

echo 'JBOSS_HOME="/opt/jboss-eap-6.1"' | sudo tee -a /etc/environment

source /etc/environment

echo $JBOSS_HOME

$JBOSS_HOME/bin/standalone.conf JVM起動設定

$JBOSS_HOME/standalone/configuration/standalone.xml ログ出力設定など

★ユーザ設定

cd $JBOSS_HOME

bin/add-user.sh → 手順

あるいは

bin/add-user.sh -u jboss -p 'xxx' -r ManagementRealm

※ one AS process to connect to another AS process: no

bin/add-user.sh -u jboss -p 'xxx' -r ApplicationRealm

※ one AS process to connect to another AS process: yes

設定ファイルのパス

$JBOSS_HOME/standalone/configuration/mgmt-users.properties

$JBOSS_HOME/domain/configuration/mgmt-users.properties

$JBOSS_HOME/standalone/configuration/application-users.properties

$JBOSS_HOME/domain/configuration/application-users.properties

$JBOSS_HOME/standalone/configuration/application-roles.properties

$JBOSS_HOME/domain/configuration/application-roles.properties

★Protect resources

web.xml

<security-constraint>

<web-resource-collection>

<web-resource-name>Restricted Access</web-resource-name>

<url-pattern>/*</url-pattern>

</web-resource-collection>

<auth-constraint>

<role-name>user</role-name>

</auth-constraint>

</security-constraint>

<login-config>

<auth-method>BASIC</auth-method>

</login-config>

$JBOSS_HOME/bin/add-user.sh

・Select "Application User" (Added to application-users.properties)

・Create "user" role (Added to application-roles.properties)

★起動

bin/standalone.sh Web Profile起動

bin/standalone.sh -c standalone-full.xml Full Profile起動

bin/standalone.sh #Foreground

nohup bin/standalone.sh & #Background

管理方法

・管理コンソール(Web) 即座に反映 http://localhost:9990

・CLI(コマンドラインインターフェース) 即座に反映

・XML構成ファイル 再起動が必要

★Launch the Command Line Interface in graphical mode

jboss-cli.sh --gui

★停止・再起動

jboss-cli.sh --connect <IP>

jboss-cli.sh -c --command=":shutdown"

jboss-cli.sh --connect --command=:shutdown

jboss-cli.sh -c "/:shutdown()"

jboss-cli.sh -c /:shutdown

jboss-cli.sh -c :shutdown

jboss-cli.sh -c ":shutdown(restart=true)"

あるいは

bin/jboss-cli.sh

connect

:shutdown

:reload

★基本的なコマンド(command line interface)

bin/jboss-cli.sh

cn (or cd)

cd deployment

cd ..

connect

deploy

help (or h)

history

ls

pwn (or pwd)

quit (or q)

undeploy

version

★管理CLIオペレーション

構文 [ノードのパス]:[オペレーション]

read-operation 一覧を表示

:whoami

/subsystem/datasources:read-operation-names ×

/subsystem=datasources:read-operation-names ◯

jboss-cli.sh -c "/system-property=test:add(value='This\ is\ test')"

jboss-cli.sh -c "/system-property=*:read-resource"

jboss-cli.sh -c version

jboss-cli.sh help

jboss-cli.sh -c help

jboss-cli.sh -c "deploy --help"

jboss-cli.sh -c "help --commands"

jboss-cli.sh -c "ls subsystem"

jboss-cli.sh -c "ls extension"

jboss-cli.sh -c "ls profile"

jboss-cli.sh -c "ls interface"

jboss-cli.sh -c "ls socket-binding-group"

★DeployとUndeploy

方法1:File system

cp app/target/xxx.ear $JBOSS_HOME/standalone/deployments/

※ xxx.ear, xxx.war

rm $JBOSS_HOME/standalone/deployments/xxx.ear

方法2:JBoss CLI

jboss-cli.sh -c --commond="deploy app/target/xxx.ear"

jboss-cli.sh -c --commond="undeploy xxx.ear"

jboss-cli.sh -c "deploy /tmp/xxx.war"

jboss-cli.sh -c "undeploy xxx.war"

方法3:JBoss Managment Console

http://localhost:9990/ の Manage Deployments

★ログの設定

$JBOSS_HOME\standalone\configuration\standalone.xml

<profile>

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

<size-rotating-file-handler name="ROTETION_ROOT">

<formatter>

<pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p %x [%c{1}] (%t) %s%E%n"/>

</formatter>

<file relative-to="jboss.server.log.dir" path="xxx_server.log"/>

<rotate-size value="1K"/>

<max-backup-index value="3"/>

<append value="true"/>

</size-rotating-file-handler>

<root-logger>

<level name="INFO"/>

<handlers>

<handler name="CONSOLE"/>

<handler name="ROTETION_ROOT"/>

</handlers>

</root-logger>

★キャッシュ・メッセージキューの設定

方法1:CLIコマンド

bin/jboss-cli.sh --file="xxx.cli"

cliファイル

connect

batch

/subsystem=messaging/hornetq-server=default/jms-queue=xxxQueue:add(entries=["java:/queues/xxxQueue"])

/subsystem=messaging/hornetq-server=default/jms-queue=xxxQueue:remove

/subsystem=infinispan/cache-container=xxxCache/local-cache=application:add(start=EAGER,batching=true)/locking=LOCKING:add(isolation=REPEATABLE_READ)

run-batch

:reload

quit

方法2:standalone.xml編集

<cache-container name="xxxCache">

<local-cache name="application" start="EAGER" batching="true">

<locking isolation="REPEATABLE_READ" />

</local-cache>

</cache-container>

★データベースの設定

jboss-cli.sh -c "/subsystem=datasources:read-resource-description"

bin/jboss-cli.sh -c --command="data-source add --name=H2DS --jndi-name=java:jboss/datasources/H2DS --driver-name=h2 --connection-url=jdbc:h2:mem:h2ds --user-name=sa --password=sa"

bin/jboss-cli.sh -c --command="data-source enable --name=H2DS"

bin/jboss-cli.sh -c --command="data-source remove --name=H2DS"

MySQLを導入

bin/jboss-cli.sh --connect

module add --name=com.mysql --resources=/home/xxx/mysql-connector-java-5.1.13.jar --dependencies=javax.api,javax.transaction.api

cliファイル

connect

batch

/subsystem=datasources/jdbc-driver=mysql:add(\

driver-module-name=com.mysql,\

driver-name=mysql,\

driver-class-name=com.mysql.jdbc.Driver)

あるいは

driver-xa-datasource-class-name=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource)

/subsystem=datasources/data-source=MySqlDS:add(\

enabled=false,\

jndi-name=java:jboss/datasources/test,\

use-java-context=true,\

connection-url="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&connectionCollation=utf8_unicode_ci&characterSetResults=utf8&characterEncoding=utf8",\

user-name=root,\

password=root,\

min-pool-size=2,\

max-pool-size=100,\

driver-name=mysql)

/subsystem=datasources/data-source=MySqlDS:enable

run-batch

:reload

persistence.xml

<persistence-unit name="testUT" transaction-type="JTA">

<jta-data-source>java:jboss/datasources/test</jta-data-source>

...

</persistence-unit>

★Calling remote EJBs

META-INF/jboss-ejb-client.xml

<jboss-ejb-client xmlns="urn:jboss:ejb-client:1.0">

<client-context>

<ejb-receivers>

<remoting-ejb-receiver

outbound-connection-ref="remote-ejb-connection"/>

</ejb-receivers>

</client-context>

</jboss-ejb-client>

CLIファイル

connect

batch

/core-service=management/security-realm=my-remote:add()

/core-service=management/security-realm=my-remote/server-identity=secret:add(value=***)

/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-ejb:add(\

host=127.0.0.1,\

port=4447)

/subsystem=remoting/remote-outbound-connection=remote-ejb-connection:add(\

outbound-socket-binding-ref=remote-ejb,\

security-realm=my-remote,\

username=jboss)

/subsystem=remoting/remote-outbound-connection=remote-ejb-connection/property=SASL_POLICY_NOANONYMOUS:add(value=false)

/subsystem=remoting/remote-outbound-connection=remote-ejb-connection/property=SSL_ENABLED:add(value=false)

run-batch

:reload

★JBoss AS 7でトランザクションの動作を確認

方法1:CDIのTransactionnal Observerで確認

@Inject @Any

private Event<Book> bookEvent;

public void createBook(Book book) {

em.persist(book);

bookEvent.select(new AnnotationLiteral<Created>(){}).fire(book);

}

public void addBook(@Observes(during = AFTER_SUCCESS) @Created Book book) {

...

}

方法2:ロギングシステムにcom.arjuna.ats.jtaカテゴリを追加

${JBOSS_HOME}/bin/jboss-cli.sh

/subsystem=logging/logger=com.arjuna.ats.jta:add

/subsystem=logging/logger=com.arjuna.ats.jta:write-attribute(name="level", value="TRACE")

★圧縮の設定 (standalone.xml)

<property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION" value="on"/>

<property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIME_TYPES" value="text/javascript,text/css,text/html,text/xml,text/json,image/png"/>

★h2(テスト用DB)の内容を確認

http://www.jboss.org/quickstarts/eap/h2-console/

jboss-eap-quickstarts-6.3.0.GAのh2console.warをdeploymentsにいれる

★Using WildFly BOMs

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.wildfly.bom</groupId>

<artifactId>jboss-javaee-7.0-with-all</artifactId>

<version>8.0.0.Final</version>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

#list all deployed applications

jboss-cli.sh -c deploy

jboss-cli.sh -c undeploy

jboss-cli.sh -c "ls deployment"

jboss-cli.sh -c "deploy -l"

jboss-cli.sh -c "undeploy -l"

方法4:standalone.xmlで指定

<deployments>

<deployment name="example-web.war" runtime-name="example-web.war">

<fs-archive path="/.../workspace/example-web/target/example-web.war"/>

</deployment>

<deployment name="example-app.ear" runtime-name="example-app.ear">

<fs-archive path="/.../workspace/example-app/target/example-app.ear"/>

</deployment>

...

</deployments>

★Debug mode

#default debug port: 8787

standalone.sh --debug

standalone.sh -d

standalone.sh -d 6000

standalone.sh --debug 6000

★トランザクションの動作を確認

1.管理コンソールでロギングシステムにcom.arjuna.ats.arjunaカテゴリを追加

2.ログレベルをTRACEにする

★JNDIを確認(jboss-cli.sh起動済み)

/subsystem=naming:jndi-view

★Security Domainについて

設定方式1

standalone/configuration/standalone.xml あるいは domain/configuration/domain.xml

<subsystem xmlns="urn:jboss:domain:security:1.2">

<security-domains>

<security-domain name="my-domain" cache-type="default">

<authentication>

<login-module

code="org.jboss.security.ClientLoginModule"

flag="required" />

</authentication>

</security-domain>

</security-domains>

</subsystem>

設定方式2(CLIファイル)

/subsystem=security/security-domain=my-domain:add(cache-type=default)

/subsystem=security/security-domain=my-domain/authentication=classic:add()

/subsystem=security/security-domain=my-domain/authentication=classic:write-attribute(\

name=login-modules,\

value=[\

{\

"code" => "org.jboss.security.ClientLoginModule",\

"flag" => "required"\

}\

]\

) {allow-resource-service-restart=true}

WEB-INF/jboss-web.xml

<jboss-web>

<security-domain>my-domain</security-domain>

</jboss-web>

ソースコード

import java.security.Principal;

import org.jboss.ejb3.annotation.SecurityDomain;

@Stateless

@SecurityDomain("my-domain")

public class MyEJB {

@Resource

private SessionContext sessionContext;


public Principal getPrincipal() {

return sessionContext.getCallerPrincipal();

}

public String getPrincipalName() {

return getPrincipal().getName();

}

public String getPrincipalInfo() {

return getPrincipal().toString();

}

}

★Configuring the mail session

@Resource(mappedName = "java:jboss/mail/Gmail")

private Session mailSession;

<subsystem xmlns="urn:jboss:domain:mail:2.0">

<mail-session name="default" jndi-name="java:jboss/mail/Default">

<smtp-server outbound-socket-binding-ref="mail-smtp"/>

</mail-session>

<mail-session name="gmail" jndi-name="java:jboss/mail/Gmail" from="<your account>@gmail.com">

<smtp-server outbound-socket-binding-ref="mail-gmail"

ssl="true" username="<your account>@gmail.com" password="<your password>"/>

</mail-session>

</subsystem>

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

port-offset="${jboss.socket.binding.port-offset:0}">

<outbound-socket-binding name="mail-smtp">

<remote-destination host="localhost" port="25"/>

</outbound-socket-binding>

<outbound-socket-binding name="mail-gmail">

<remote-destination host="smtp.gmail.com" port="465"/>

</outbound-socket-binding>

</socket-binding-group>

★プロファイルの比較