This guide is part of the migrate Java EE app to Azure training
Bind the application to the petstore database in Azure Database for PostgreSQL.
There are 3 steps to configure a data source. These steps are similar to configuring data sources in any on premise Java EE app servers:
In App Service, each instance of an app server is stateless. Therefore, each instance must be
configured on startup to support a JBoss EAP configuration needed by your application. You can configure at
startup by supplying a startup Bash script that calls JBoss/WildFly CLI commands to setup data sources, messaging
providers and any other dependencies. We will create a startup.sh script and place it in the /home
directory of the Web app. The script will:
Install a JBoss EAP module:
# where resources point to JDBC driver for PostgreSQL
# and module xml points to module description, see below
module add --name=org.postgres --resources=/home/site/libs/postgresql-42.2.5.jar --module-xml=/home/site/scripts/postgresql-module.xml
Where postgresql-module.xml describes the module:
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="org.postgres">
<resources>
<!-- ***** IMPORTANT : PATH should point to PostgreSQL Java driver on App Service Linux *******-->
<resource-root path="/home/site/libs/postgresql-42.2.5.jar" />
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>Add a JDBC driver for PostgreSQL:
/subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
Install a data source by using the data-source shortcut command:
data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
A server reload may be required for the changes to take effect:
reload --use-current-server-config=true
These JBoss CLI commands, JDBC driver for PostgreSQL and module XML are available in initial-postgresql/agoncal-application-petstore-ee7/.scripts
Also, you can directly download the latest version of JDBC driver for PostgreSQL
Open pom.xml and update the deployment with the following configuration and run mvn azure-webapp:deploy to deploy.
<deployment>
<resources>
<resource>
<type>war</type>
<directory>${project.basedir}/target</directory>
<includes>
<include>*.war</include>
</includes>
</resource>
<resource>
<type>lib</type>
<directory>${project.basedir}/.scripts/3A-postgresql</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
<resource>
<type>startup</type>
<directory>${project.basedir}/.scripts/3A-postgresql</directory>
<includes>
<include>*.sh</include>
</includes>
</resource>
<resource>
<type>script</type>
<directory>${project.basedir}/.scripts/3A-postgresql</directory>
<includes>
<include>*.cli</include>
<include>*.xml</include>
</includes>
</resource>
</resources>
</deployment>Use Azure CLI to set database connection info:
az webapp config appsettings set \
--resource-group ${RESOURCE_GROUP} --name ${WEBAPP} \
--settings \
POSTGRES_CONNECTION_URL=${POSTGRES_CONNECTION_URL} \
POSTGRES_SERVER_ADMIN_PASSWORD=${POSTGRES_SERVER_ADMIN_PASSWORD} \
POSTGRES_SERVER_ADMIN_FULL_NAME=${POSTGRES_SERVER_ADMIN_FULL_NAME}[
{
"name": "WEBSITE_HTTPLOGGING_RETENTION_DAYS",
"slotSetting": false,
"value": "3"
},
{
"name": "POSTGRES_CONNECTION_URL",
"slotSetting": false,
"value": "jdbc:postgresql://petstore-db.postgres.database.azure.com:5432/postgres?ssl=true"
},
{
"name": "POSTGRES_SERVER_ADMIN_PASSWORD",
"slotSetting": false,
"value": "======= MASKED ======="
},
{
"name": "POSTGRES_SERVER_ADMIN_FULL_NAME",
"slotSetting": false,
"value": "postgres@petstore-db"
}
]
For additional info, please refer to:
- JBoss Data Source Management.
- JBoss/WildFly CLI Guide
- Open SSH session from your development machine to App Service Linux
# Use the Maven profile for PostgreSQL to build from the project base directory
cd ../..
mvn package -Dmaven.test.skip=true -Ddb=postgresqlNote - the postgresql Maven profile is available here.
Deploy to JBoss EAP in App Service Linux:
mvn azure-webapp:deployOpen Java EE application running on App Service Linux and interacting with Azure Database for PostgreSQL
open https://${WEBAPP}.azurewebsites.netpsql --host=${POSTGRES_SERVER_FULL_NAME} --port=5432 \
--username=${POSTGRES_SERVER_ADMIN_FULL_NAME} \
--dbname=${POSTGRES_DATABASE_NAME} --set=sslmode=require
Password for user postgres@petstore-db:
psql (11.1, server 9.6.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=> \l
postgres=> \dt
List of relations
Schema | Name | Type | Owner
--------+--------------------+-------+----------
public | category | table | postgres
public | country | table | postgres
public | customer | table | postgres
public | item | table | postgres
public | order_line | table | postgres
public | product | table | postgres
public | purchase_order | table | postgres
public | t_order_order_line | table | postgres
(8 rows)
postgres=> select name from category;
name
----------
Fish
Dogs
Reptiles
Cats
Birds
(5 rows)
postgres=> \qOpen Java Web app remote log stream from a local machine:
az webapp log tail --name ${WEBAPP} --resource-group ${RESOURCE_GROUP}⬅️ Previous guide: 02 - Create a database
➡️ Next guide: 04 - Monitor Java EE application
