= Application Configuration
:jbake-date: 2016-03-16
:jbake-type: page
:jbake-status: published
:jbake-tomeepdf:

== `application.properties`

This file is located in `WEB-INF` for a war and `META-INF` for an ear.

=== `@Asynchronous` configuration

Default pool size for `@Asynchronous` is 5. It can be very small for some applications highly relying on
asynchronism or reactive patterns. Therefore it is possible to customize it adding these entries in `application.properties`:

[.table.table-bordered,options="header"]
|===
| Name | Default| Description
| AsynchronousPool.Size | 5 | Core size of the pool
| AsynchronousPool.CorePoolSize | 5 | Core size of the pool (inherit its default from .Size alias)
| AsynchronousPool.MaximumPoolSize | 5 | Maximum size of the pool
| AsynchronousPool.QueueSize | 5 | Maximum size of the pool
| AsynchronousPool.KeepAliveTime | 1 minute | Thread keep alive duration
| AsynchronousPool.AllowCoreThreadTimeOut | true | Should thread timeout
| AsynchronousPool.QueueType | LINKED (or SYNCHRONOUS if size == 0) | The type of queue of the pool in ARRAY, LINKED, PRIORITY or SYNCHRONOUS (same behavior as java implementations of the same name)
| AsynchronousPool.ShutdownWaitDuration | 1 minute | How many time to wait for the pool to shutdown when undeploying the application
| AsynchronousPool.RejectedExecutionHandlerClass | - | A fully qualified name of a `java.util.concurrent.RejectedExecutionHandler`
|===

=== TimerService and `@Scheduled`

`timerStore.class` allows to switch from the in memory (`org.apache.openejb.core.timer.MemoryTimerStore`) timer storage
for quartz tasks to a custom implementation (using a database or anything for instance). Constructor can take a `TransactionManager`
or nothing.

All quartz properties prefixed with `org.apache.openejb.quartz.` (instead of `org.quartz.`) are passthrough to quartz.

=== CDI

The boolean `openejb.cdi.skip-resource-validation` allows to not validate resources ie `@EJB` and `@Resource` usages in CDI beans.

All properties understood by OpenWebBeans will also be passthrough to OpenWebBeans from this location, see http://openwebbeans.apache.org/owbconfig.html[OWB config] for more details.

=== `@WebServiceRef`

[.table.table-bordered,options="header"]
|===
| Name | Description
| cxf.jaxws.client.wsFeatures | Allows to set WSFeature on the client injection. Values is a list (comma separated) of resource id in resources.xml or fully qualified names.
|===

=== `@Stateless`

[.table.table-bordered,options="header"]
|===
| Name | Description
| AccessTimeout or Timeout | container timeout
| CloseTimeout | container timeout
| BackgroundStartup | Don't create instances in parallel if minimum count is > 0, default to false
|===

== `resources.xml`

`resources.xml` is a tomee.xml using application classloader.

As `tomee.xml` it supports filtering so you can use environment variables and system properties, for instance
to use a MySQL database on OpenShift you can do:

[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <Resource id="MySQL" aliases="myAppDataSourceName" type="DataSource">
    JdbcDriver = com.mysql.jdbc.Driver
    JdbcUrl = jdbc:mysql://${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/rmannibucau?tcpKeepAlive=true
    UserName = ${OPENSHIFT_MYSQL_DB_USERNAME}
    Password = ${OPENSHIFT_MYSQL_DB_PASSWORD}
    ValidationQuery = SELECT 1
    ValidationInterval = 30000
    NumTestsPerEvictionRun = 5
    TimeBetweenEvictionRuns = 30 seconds
    TestWhileIdle = true
    MaxActive = 200
  </Resource>
</resources>
----

`resources.xml` supports `Resource`, `Service` and `Container`.

=== `resources.xml` mechanism

`resources.xml` resources are still available globally like any `tomee.xml` resource.

The actual resource is bound in an application subtree called with the application name and a resource facade is bound
in the global naming tree to be able to route the requests depending the application.

Typically if your application is named `myapp` and your resource id is `myresource` then instead of being registered
as `myresource`, it will get registered as `myapp/myresource`.

If you get any ambiguity in resource name matching try to fully qualified your resource prefixing it with the application name.
