<!DOCTYPE html>
<html lang="en">
  <head>

    <meta charset="UTF-8">
      <title>Application Resources</title>
    <meta name="description" content="Apache TomEE">
    <meta name="author" content="Apache TomEE">
    <meta name="google-translate-customization" content="f36a520c08f4c9-0a04e86a9c075ce9-g265f3196f697cf8f-10">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">

    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le styles -->
    <link href="./resources/css/bootstrap.css" rel="stylesheet">
    <link href="./resources/css/prettify.css" rel="stylesheet">
    <!--link href="./resources/css/bootstrap-mods.css" rel="stylesheet"-->
    <link href="./resources/css/main.css" rel="stylesheet">
    <link href="./resources/font-awesome-4.6.3/css/font-awesome.min.css" rel="stylesheet">

    <script type="text/javascript">
        var t = encodeURIComponent(document.title.replace(/^\s+|\s+$/g,""));
        var u = encodeURIComponent(""+document.URL);
    
      function fbshare () {
          window.open(
                  "http://www.facebook.com/sharer/sharer.php?u="+u,
                  'Share on Facebook',
                  'width=640,height=426');
      };
      function gpshare () {
          window.open(
                  "https://plus.google.com/share?url="+u,
                  'Share on Google+',
                  'width=584,height=385');
      };
      function twshare () {
          window.open(
                  "https://twitter.com/intent/tweet?url="+u+"&text="+t,
                  'Share on Twitter',
                  'width=800,height=526');
      };
      function pinshare () {
          window.open("//www.pinterest.com/pin/create/button/?url="+u+"&media=http%3A%2F%2Ftomee.apache.org%2Fresources%2Fimages%2Ffeather-logo.png&description="+t,
                  'Share on Pinterest',
                  'width=800,height=526');
      };
    </script>

    <!-- Le fav and touch icons -->
    <link rel="shortcut icon" href="./favicon.ico">
    <link rel="apple-touch-icon" href="./resources/images/apple-touch-icon.png">
    <link rel="apple-touch-icon" sizes="72x72" href="./resources/images/apple-touch-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="114x114" href="./resources/images/apple-touch-icon-114x114.png">

    <script src="./resources/js/prettify.js" type="text/javascript"></script>
    <script src="./resources/js/jquery-latest.js"></script>
    <script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
    <script src="./resources/js/common.js"></script>
    <script src="./resources/js/prettyprint.js"></script>
    <!--script src="//assets.pinterest.com/js/pinit.js" type="text/javascript" async></script//-->
    
    <script type="text/javascript">

      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-2717626-1']);
      _gaq.push(['_setDomainName', 'apache.org']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();

    </script>
  </head>

  <body>

    <div class="topbar" data-dropdown="dropdown">
      <div class="fill">
        <div class="container">
          <a class="brand" href="./index.html">Apache TomEE</a>
          <ul class="nav">
              <li class="dropdown">
                  <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                  Apache
                      <b class="caret"></b>
                  </a>
                  <ul class="dropdown-menu">
                     <!-- <li><a href="./misc/whoweare.html">Who we are?</a></li> -->
                     <!-- <li><a href="./misc/heritage.html">Heritage</a></li> -->
                     <li><a href="http://www.apache.org">Apache Home</a></li>
                     <!-- <li><a href="./misc/resources.html">Resources</a></li> -->
                     <li><a href="./misc/contact.html">Contact</a></li>
                     <li><a href="./misc/legal.html">Legal</a></li>
                     <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
                     <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
                     <li class="divider"/>
                     <li><a href="http://www.apache.org/security">Security</a></li>
                  </ul>
              </li>
              <li><a href="./index.html">Home</a></li>
              <li><a href="./downloads.html">Downloads</a></li>
              <li><a href="./documentation.html">Documentation</a></li>
              <li><a href="./examples-trunk/index.html">Examples</a></li>
              <li><a href="./support.html">Support</a></li>
              <li><a href="./contribute.html">Contribute</a></li>
              <li><a href="./security/index.html">Security</a></li>
          </ul>

            <!-- Google CSE Search Box Begins  -->
            <FORM class="pull-right" id="searchbox_010475492895890475512:_t4iqjrgx90" action="http://www.google.com/cse">
                <INPUT type="hidden" name="cx" value="010475492895890475512:_t4iqjrgx90">
                <INPUT type="hidden" name="cof" value="FORID:0">
                <INPUT size="18" width="130" style="width:130px" name="q" type="text" placeholder="Search">
            </FORM>
            <!--<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_010475492895890475512:_t4iqjrgx90"></SCRIPT>-->
            <!-- Google CSE Search Box Ends -->
        </div>
      </div>
    </div>

    <div class="container">
    

<div class="page-header">
    <small><a href="./index.html">Home</a></small><br>
    <h1>Application Resources

        <div style="float: right; position: relative; bottom: -10px; ">
            <a onclick="javascript:gpshare()" class="gp-share sprite" title="Share on Google+">share [gp]</a>
            <a onclick="javascript:fbshare()" class="fb-share sprite" title="Share on Facebook">share [fb]</a>
            <a onclick="javascript:twshare()" class="tw-share sprite" title="Share on Twitter">share [tw]</a>
            <a onclick="javascript:pinshare()" class="pin-share sprite" title="Share on Pinterest">share [pin]</a>
            <a data-toggle="modal" href="#edit" class="edit-page" title="Contribute to this Page">contribute</a>
        </div>
    </h1>
</div>

<p><a name="ApplicationResources"></a></p>

<h1>Resources</h1>

<p>TomEE provides a simple but powerful way to define resources that can be injected into managed components inside your application, or looked up via JNDI. To use a resource, it needs to be defined in the <code>tomee.xml</code> configuration file, a <code>resources.xml</code> file within an application, or as a system property. Defining a resource in <code>tomee.xml</code> will make it available server-wide, whereas defining the resource within a <code>resources.xml</code> file makes it available to a specific application.</p>

<p>As a simple example, a JMS queue can be defined within <code>tomee.xml</code> with the following configuration.</p>

<pre><code>&lt;tomee&gt;
    &lt;Resource id="MyQueue" type="javax.jms.Queue"/&gt;
&lt;/tomee&gt;
</code></pre>

<p>Once the resource has been defined, the server will create an instance of the resource during startup, and it will be available to be injected into managed components using the <code>@Resource</code> annotation, as shown below. The <code>name</code> attribute on the <code>@Resource</code> annotation should match the <code>id</code> attribute on the <code>Resource</code> tag.</p>

<pre><code>public class JmsClient {

    @Resource(name="MyQueue")
    private Queue queue;

    public void sendMessage() {
        // implementation here...
    }

}
</code></pre>

<p>As an alternative to defining a resource in XML, resources can also be defined using system properties:</p>

<pre><code>MyQueue = new://Resource?type=javax.jms.Queue
</code></pre>

<p>Resources, or attributes for resources specified using system properties will override definitions specified in <code>tomee.xml</code>.
Server-wide resources can be looked up in JNDI under the following name: openejb:Resources/resource id.</p>

<h1>Defining Resources</h1>

<p><a name="DefiningResources"></a></p>

<p>The <code>&lt;Resource&gt;</code> tag has a number of attributes, and a resource may also have a number of fields that can be configured by adding properties to the body of the <code>Resource</code> tag.</p>

<p>For example, a DataSource resource needs a JDBC driver, URL, username and password to be able to connect to a database. That would be configured with the following syntax. Notice the key/value pair syntax for the properties within the <code>&lt;Resource&gt;</code> tag.</p>

<pre><code>&lt;Resource id="DB" type="DataSource"&gt;
  JdbcDriver  com.mysql.jdbc.Driver
  JdbcUrl     jdbc:mysql://localhost/test
  UserName    test
  Password    password
&lt;/Resource&gt;
</code></pre>

<p>Specifying the key/value pairs specific to a Resource can also be done when defining the resource via system properties. This is done be specifying an additional property for each key/value pair, using the resource ID as a prefix: <code>&lt;resourceId&gt;.&lt;propertyName&gt;=&lt;value&gt;</code>. The system properties equivalent of the resource above is:</p>

<pre><code>p.setProperty("DB", "new://Resource?type=DataSource");
p.setProperty("DB.JdbcDriver", "com.mysql.jdbc.Driver");
p.setProperty("DB,JdbcUrl", "jdbc:mysql://localhost/test");
p.setProperty("DB.UserName", "test");
p.setProperty("DB.Password", "password");
</code></pre>

<p>The <code>&lt;Resource&gt;</code> tag has a number of attributes which control the way that the resource get created.</p>

<ul>
<li>type</li>
</ul>

<p>A type that TomEE knows. The type is associated with a provider that knows how to create that type, and also any default properties that the resource should have if they are not specified in the resource definition. See <a href="https://github.com/apache/tomee/blob/tomee-1.7.x/tomee/tomee-webapp/src/main/resources/META-INF/org.apache.tomee/service-jar.xml">service-jar.xml</a> for an example set of service providers that come with TomEE.</p>

<ul>
<li>provider</li>
</ul>

<p>Explicitly specifies a provider to create the resource, using defaults for any properties not specified.</p>

<ul>
<li>class-name</li>
</ul>

<p>The fully qualified class that creates the resource. This might the resource class itself, which is created by calling the constructor, or a factory class that provides a specific factory method to create the resource.</p>

<ul>
<li>factory-name</li>
</ul>

<p>The name of the method to call to create the resource. If this is not specified, the constructor for the class specified by class-name will be used.</p>

<ul>
<li>constructor</li>
</ul>

<p>Specifies a comma separated list of constructor arguments. These can be other services, or attributes on the resource itself.</p>

<h1>Custom resources</h1>

<p>TomEE allows you to define resources using your own Java classes, and these can also be injected into managed components in the same way as known resource types are.</p>

<p>So the following simple resource</p>

<pre><code>public class Configuration {

    private String url;
    private String username;
    private int poolSize;

    // getters and setters
}
</code></pre>

<p>Can be defined in <code>tomee.xml</code> using the following configuration (note the <code>class-name</code> attribute):</p>

<pre><code>&lt;Resource id="config" class-name="org.superbiz.Configuration"&gt;
    url http://localhost
    username tomee
    poolSize 20
&lt;/Resource&gt;
</code></pre>

<p>This resource must be available in TomEE's system classpath - i.e. it must be defined in a .jar within the <code>lib/</code> directory.</p>

<h1>Field and properties</h1>

<p>As shown above, a resource class can define a number of fields, and TomEE will attempt to apply the values from the resource definition onto those fields.</p>

<p>As an alternative to this, you can also add a properties field as shown below, and this will have any used properties from the resource configuration set added to it. So as an alternative to the above code, you could do:</p>

<pre><code>public class Configuration {

    private Properties properties;

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(final Properties properties) {
        this.properties = properties;
    }

}
</code></pre>

<p>Using the same resource definition:</p>

<pre><code>&lt;Resource id="config" class-name="org.superbiz.Configuration"&gt;
    url http://localhost
    username tomee
    poolSize 20
&lt;/Resource&gt;
</code></pre>

<p>the url, username and poolSize values will now be available in the properties field, so for example, the username property could be accessed via properties.getProperty("username");</p>

<h1>Application resources</h1>

<p>Resources can also be defined within an application, and optionally use classes from the application's classpath. To define resources in a .war file, include a <code>WEB-INF/resources.xml</code>. For an ejb-jar module, use <code>META-INF/resources.xml</code>.</p>

<p>The format of <code>resources.xml</code> uses the same <code>&lt;Resource&gt;</code> tag as <code>tomee.xml</code>. One key difference is the root element of the XML is <code>&lt;resources&gt;</code> and not <code>&lt;tomee&gt;</code>.</p>

<pre><code>&lt;resources&gt;
    &lt;Resource id="config" class-name="org.superbiz.Configuration"&gt;
        url http://localhost
        username tomee
        poolSize 20
    &lt;/Resource&gt;
&lt;/resources&gt;
</code></pre>

<p>This mechanism allows you to package your custom resources within your application, alongside your application code, rather than requiring a .jar file in the <code>lib/</code> directory.</p>

<p>Application resources are bound in JNDI under openejb:Resource/appname/resource id.</p>

<h1>Additional resource properties</h1>

<p>Resources are typically discovered, created, and bound to JNDI very early on in the deployment process, as other components depend on them. This may lead to problems where the final classpath for the application has not yet been determined, and therefore TomEE is unable to load your custom resource. </p>

<p>The following properties can be used to change this behavior.</p>

<ul>
<li>Lazy</li>
</ul>

<p>This is a boolean value, which when true, creates a proxy that defers the actual instantiation of the resource until the first time it is looked up from JNDI. This can be useful if the resource's classpath until the application is started (see below), or to improve startup time by not fully initializing resources that might not be used.</p>

<ul>
<li>UseAppClassLoader </li>
</ul>

<p>This boolean value forces a lazily instantiated resource to use the application classloader, instead of the classloader available when the resources were first processed.</p>

<ul>
<li>InitializeAfterDeployment</li>
</ul>

<p>This boolean setting forces a resource created with the Lazy property to be instantiated once the application has started, as opposed to waiting for it to be looked up. Use this flag if you require the resource to be loaded, irrespective of whether it is injected into a managed component or manually looked up.</p>

<p>By default, all of these settings are <code>false</code>, unless TomEE encounters a custom application resource that cannot be instantiated until the application has started. In this case, it will set these three flags to <code>true</code>, unless the <code>Lazy</code> flag has been explicitly set.</p>

<h1>Initializing resources</h1>

<h2>constructor</h2>

<p>By default, if no factory-name attribute and no constructor attribute is specified on the <code>Resource</code>, TomEE will instantiate the resource using its no-arg constructor. If you wish to pass constructor arguments, specify the arguments as a comma separated list:</p>

<pre><code>&lt;Resource id="config" class-name="org.superbiz.Configuration" constructor="id, poolSize"&gt;
    url http://localhost
    username tomee
    poolSize 20
&lt;/Resource&gt;
</code></pre>

<h2>factory-name method</h2>

<p>In some circumstances, it may be desirable to add some additional logic to the creation process, or to use a factory pattern to create resources. TomEE also provides this facility via the <code>factory-name</code> method. The <code>factory-name</code> attribute on the resource can reference any no argument method that returns an object on the class specified in the <code>class-name</code> attribute.</p>

<p>For example:</p>

<pre><code>public class Factory {

    private Properties properties;

    public Object create() {

         MyResource resource = new MyResource();
         // some custom logic here, maybe using this.properties

         return resource;
    }

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(final Properties properties) {
        this.properties = properties;
    }

}

&lt;resources&gt;
    &lt;Resource id="MyResource" class-name="org.superbiz.Factory" factory-name="create"&gt;
        UserName tomee
    &lt;/Resource&gt;
&lt;/resources&gt;
</code></pre>

<h2>@PostConstruct / @PreDestroy</h2>

<p>As an alternative to using a factory method or a constructor, you can use @PostConstruct and @PreDestroy methods within your resource class (note that you cannot use this within a different factory class) to manage any additional creation or cleanup activities. TomEE will automatically call these methods when the application is started and destroyed. Using @PostConstruct will effectively force a lazily loaded resource to be instantiated when the application is starting - in the same way that the <code>InitializeAfterDeployment</code> property does.</p>

<pre><code>public class MyClass {

    private Properties properties;

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(final Properties properties) {
        this.properties = properties;
    }

    @PostConstruct
        public void postConstruct() throws MBeanRegistrationException {
            // some custom initialization
        }
    }

}
</code></pre>

<h1>Examples</h1>

<p>The following examples demonstrate including custom resources within your application:</p>

<ul>
<li>resources-jmx-example</li>
<li>resources-declared-in-webapp</li>
</ul>




        <div id="edit" class="modal hide fade in" style="display: none; ">
            <div class="modal-header">
                <a class="close" data-dismiss="modal">x</a>

                <h3>Thank you for contributing to the documentation!</h3>
            </div>
            <div class="modal-body">
                <h4>Any help with the documentation is greatly appreciated.</h4>
                <p>All edits are reviewed before going live, so feel free to do much more than fix typos or links.  If you see a page that could benefit from an entire rewrite, we'd be thrilled to review it.  Don't be surprised if we like it so much we ask you for help with other pages :)</p>
                <small>NOTICE: unless indicated otherwise on the pages in question, all editable content available from apache.org is presumed to be licensed under the Apache License (AL) version 2.0 and hence all submissions to apache.org treated as formal Contributions under the license terms.</small>
                <!--[if gt IE 6]>
                <h4>Internet Explorer Users</h4>
                <p>If you are not an Apache committer, click the Yes link and enter a <i>anonymous</i> for the username and leave the password empty</p>
                <![endif]-->

            </div>
            <div class="modal-footer">
                Do you have an Apache ID?
                <a href="javascript:void(location.href='https://cms.apache.org/redirect?uri='+escape(location.href))" class="btn">Yes</a>
                <a href="javascript:void(location.href='https://anonymous:@cms.apache.org/redirect?uri='+escape(location.href))" class="btn">No</a>
            </div>
        </div>
        <script src="./resources/js/bootstrap-modal.js"></script>

        <footer>
            <p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.
                Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation.
                All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
        </footer>

    </div> <!-- /container -->

    <!-- Javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="./resources/js/bootstrap-dropdown.js"></script>

  </body>
</html>
