| type=page | |
| status=published | |
| title=Using Enterprise JavaBeans Technology | |
| next=container_managed-persistence.html | |
| prev=webapps.html | |
| ~~~~~~ | |
| Using Enterprise JavaBeans Technology | |
| ===================================== | |
| [[GSDVG00010]][[beahl]] | |
| [[using-enterprise-javabeans-technology]] | |
| 8 Using Enterprise JavaBeans Technology | |
| --------------------------------------- | |
| This chapter describes how Enterprise JavaBeans ( EJB) technology is | |
| supported in the Oracle GlassFish Server. | |
| The following topics are addressed here: | |
| * link:#beahn[Value Added Features] | |
| * link:#beahw[EJB Timer Service] | |
| * link:#beahx[Using Session Beans] | |
| * link:#beail[Using Read-Only Beans] | |
| * link:#beait[Using Message-Driven Beans] | |
| For general information about enterprise beans, see | |
| "https://javaee.github.io/tutorial/partentbeans.html[Enterprise Beans]" | |
| in The Java EE 8 Tutorial. | |
| [NOTE] | |
| ======================================================================= | |
| The Web Profile of the GlassFish Server supports the EJB 3.1 Lite | |
| specification, which allows enterprise beans within web applications, | |
| among other features. The full GlassFish Server supports the entire EJB | |
| 3.1 specification. For details, see | |
| http://jcp.org/en/jsr/detail?id=318[JSR 318] | |
| (`http://jcp.org/en/jsr/detail?id=318`). | |
| The GlassFish Server is backward compatible with 1.1, 2.0, 2.1, and 3.0 | |
| enterprise beans. However, to take advantage of version 3.1 features, | |
| you should develop new beans as 3.1 enterprise beans. | |
| ======================================================================= | |
| [[beahn]][[GSDVG00145]][[value-added-features]] | |
| Value Added Features | |
| ~~~~~~~~~~~~~~~~~~~~ | |
| The GlassFish Server provides a number of value additions that relate to | |
| EJB development. References to more in-depth material are included. | |
| The following topics are addressed here: | |
| * link:#beaho[Read-Only Beans] | |
| * link:#beahp[The `pass-by-reference` Element] | |
| * link:#beahq[Pooling and Caching] | |
| * link:#beahu[Priority Based Scheduling of Remote Bean Invocations] | |
| * link:#beahv[Immediate Flushing] | |
| [[beaho]][[GSDVG00420]][[read-only-beans]] | |
| Read-Only Beans | |
| ^^^^^^^^^^^^^^^ | |
| Another feature that the GlassFish Server provides is the read-only | |
| bean, an EJB 2.1 entity bean that is never modified by an EJB client. | |
| Read-only beans avoid database updates completely. | |
| [NOTE] | |
| ======================================================================= | |
| Read-only beans are specific to the GlassFish Server and are not part of | |
| the Enterprise JavaBeans Specification, v2.1. Use of this feature for an | |
| EJB 2.1 bean results in a non-portable application. | |
| To make an EJB 3.0 entity read-only, use `@Column` annotations to mark | |
| its columns `insertable=false` and `updatable=false`. | |
| ======================================================================= | |
| A read-only bean can be used to cache a database entry that is | |
| frequently accessed but rarely updated (externally by other beans). When | |
| the data that is cached by a read-only bean is updated by another bean, | |
| the read-only bean can be notified to refresh its cached data. | |
| The GlassFish Server provides a number of ways by which a read-only | |
| bean's state can be refreshed. By setting the | |
| `refresh-period-in-seconds` element in the `glassfish-ejb-jar.xml` file | |
| and the `trans-attribute` element (or `@TransactionAttribute` | |
| annotation) in the `ejb-jar.xml` file, it is easy to configure a | |
| read-only bean that is one of the following: | |
| * Always refreshed | |
| * Periodically refreshed | |
| * Never refreshed | |
| * Programmatically refreshed | |
| Read-only beans are best suited for situations where the underlying data | |
| never changes, or changes infrequently. For further information and | |
| usage guidelines, see link:#beail[Using Read-Only Beans]. | |
| [[beahp]][[GSDVG00421]][[the-pass-by-reference-element]] | |
| The `pass-by-reference` Element | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The `pass-by-reference` element in the `glassfish-ejb-jar.xml` file | |
| allows you to specify the parameter passing semantics for colocated | |
| remote EJB invocations. This is an opportunity to improve performance. | |
| However, use of this feature results in non-portable applications. See | |
| "link:../application-deployment-guide/dd-elements.html#GSDPG00219[pass-by-reference]" in GlassFish Server Open Source | |
| Edition Application Deployment Guide. | |
| [[beahq]][[GSDVG00422]][[pooling-and-caching]] | |
| Pooling and Caching | |
| ^^^^^^^^^^^^^^^^^^^ | |
| The EJB container of the GlassFish Server pools anonymous instances | |
| (message-driven beans, stateless session beans, and entity beans) to | |
| reduce the overhead of creating and destroying objects. The EJB | |
| container maintains the free pool for each bean that is deployed. Bean | |
| instances in the free pool have no identity (that is, no primary key | |
| associated) and are used to serve method calls. The free beans are also | |
| used to serve all methods for stateless session beans. | |
| Bean instances in the free pool transition from a Pooled state to a | |
| Cached state after `ejbCreate` and the business methods run. The size | |
| and behavior of each pool is controlled using pool-related properties in | |
| the EJB container or the `glassfish-ejb-jar.xml` file. | |
| In addition, the GlassFish Server supports a number of tunable | |
| parameters that can control the number of "stateful" instances (stateful | |
| session beans and entity beans) cached as well as the duration they are | |
| cached. Multiple bean instances that refer to the same database row in a | |
| table can be cached. The EJB container maintains a cache for each bean | |
| that is deployed. | |
| To achieve scalability, the container selectively evicts some bean | |
| instances from the cache, usually when cache overflows. These evicted | |
| bean instances return to the free bean pool. The size and behavior of | |
| each cache can be controlled using the cache-related properties in the | |
| EJB container or the `glassfish-ejb-jar.xml` file. | |
| Pooling and caching parameters for the `glassfish-ejb-jar.xml` file are | |
| described in "link:../application-deployment-guide/dd-elements.html#GSDPG00095[bean-cache]" in GlassFish Server Open | |
| Source Edition Application Deployment Guide. | |
| [[beahr]][[GSDVG00285]][[pooling-parameters]] | |
| Pooling Parameters | |
| ++++++++++++++++++ | |
| One of the most important parameters for GlassFish Server pooling is | |
| `steady-pool-size`. When `steady-pool-size` is set to a value greater | |
| than 0, the container not only pre-populates the bean pool with the | |
| specified number of beans, but also attempts to ensure that this number | |
| of beans is always available in the free pool. This ensures that there | |
| are enough beans in the ready-to-serve state to process user requests. | |
| Note that the `steady-pool-size` and `max-pool-size` parameters only | |
| govern the number of instances that are pooled over a long period of | |
| time. They do not necessarily guarantee that the number of instances | |
| that may exist in the JVM at a given time will not exceed the value | |
| specified by `max-pool-size`. For example, suppose an idle stateless | |
| session container has a fully-populated pool with a `steady-pool-size` | |
| of 10. If 20 concurrent requests arrive for the EJB component, the | |
| container creates 10 additional instances to satisfy the burst of | |
| requests. The advantage of this is that it prevents the container from | |
| blocking any of the incoming requests. However, if the activity dies | |
| down to 10 or fewer concurrent requests, the additional 10 instances are | |
| discarded. | |
| Another parameter, `pool-idle-timeout-in-seconds`, allows the | |
| administrator to specify the amount of time a bean instance can be idle | |
| in the pool. When `pool-idle-timeout-in-seconds` is set to greater than | |
| 0, the container removes or destroys any bean instance that is idle for | |
| this specified duration. | |
| [[beahs]][[GSDVG00286]][[caching-parameters]] | |
| Caching Parameters | |
| ++++++++++++++++++ | |
| GlassFish Server provides a way that completely avoids caching of entity | |
| beans, using commit option C. Commit option C is particularly useful if | |
| beans are accessed in large number but very rarely reused. For | |
| additional information, refer to | |
| link:transaction-service.html#beajh[Commit Options]. | |
| The GlassFish Server caches can be either bounded or unbounded. Bounded | |
| caches have limits on the number of beans that they can hold beyond | |
| which beans are passivated. For stateful session beans, there are three | |
| ways (LRU, NRU and FIFO) of picking victim beans when cache overflow | |
| occurs. Caches can also passivate beans that are idle (not accessed for | |
| a specified duration). | |
| [[beahu]][[GSDVG00423]][[priority-based-scheduling-of-remote-bean-invocations]] | |
| Priority Based Scheduling of Remote Bean Invocations | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| You can create multiple thread pools, each having its own work queues. | |
| An optional element in the `glassfish-ejb-jar.xml` file, | |
| `use-thread-pool-id`, specifies the thread pool that processes the | |
| requests for the bean. The bean must have a remote interface, or | |
| `use-thread-pool-id` is ignored. You can create different thread pools | |
| and specify the appropriate thread pool ID for a bean that requires a | |
| quick response time. If there is no such thread pool configured or if | |
| the element is absent, the default thread pool is used. | |
| [[beahv]][[GSDVG00424]][[immediate-flushing]] | |
| Immediate Flushing | |
| ^^^^^^^^^^^^^^^^^^ | |
| Normally, all entity bean updates within a transaction are batched and | |
| executed at the end of the transaction. The only exception is the | |
| database flush that precedes execution of a finder or select query. | |
| Since a transaction often spans many method calls, you might want to | |
| find out if the updates made by a method succeeded or failed immediately | |
| after method execution. To force a flush at the end of a method's | |
| execution, use the `flush-at-end-of-method` element in the | |
| `glassfish-ejb-jar.xml` file. Only non-finder methods in an entity bean | |
| can be flush-enabled. (For an EJB 2.1 bean, these methods must be in the | |
| Local, Local Home, Remote, or Remote Home interface.) See | |
| "link:../application-deployment-guide/dd-elements.html#GSDPG00156[flush-at-end-of-method]" in GlassFish Server Open | |
| Source Edition Application Deployment Guide. | |
| Upon completion of the method, the EJB container updates the database. | |
| Any exception thrown by the underlying data store is wrapped as follows: | |
| * If the method that triggered the flush is a `create` method, the | |
| exception is wrapped with `CreateException`. | |
| * If the method that triggered the flush is a `remove` method, the | |
| exception is wrapped with `RemoveException`. | |
| * For all other methods, the exception is wrapped with `EJBException`. | |
| All normal end-of-transaction database synchronization steps occur | |
| regardless of whether the database has been flushed during the | |
| transaction. | |
| [[beahw]][[GSDVG00146]][[ejb-timer-service]] | |
| EJB Timer Service | |
| ~~~~~~~~~~~~~~~~~ | |
| The EJB Timer Service uses a database to store persistent information | |
| about EJB timers. The EJB Timer Service in GlassFish Server is | |
| preconfigured to use an embedded version of the Apache Derby database. | |
| The EJB Timer Service configuration can store persistent timer | |
| information in any database supported by the GlassFish Server for | |
| persistence. For a list of the JDBC drivers currently supported by the | |
| GlassFish Server, see the link:../release-notes/toc.html#GSRLN[GlassFish Server Open Source | |
| Edition Release Notes]. For configurations of supported and other | |
| drivers, see "link:../administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC | |
| Drivers]" in GlassFish Server Open Source Edition Administration Guide. | |
| The timer service is automatically enabled when you deploy an | |
| application or module that uses it. You can verify that the timer | |
| service is running by accessing the following URL: | |
| [source,oac_no_warn] | |
| ---- | |
| http://localhost:8080/ejb-timer-service-app/timer | |
| ---- | |
| To change the database used by the EJB Timer Service, set the EJB Timer | |
| Service's Timer DataSource setting to a valid JDBC resource. If the EJB | |
| Timer Service has already been started in a server instance, you must | |
| also create the timer database table. DDL files are located in | |
| as-install`/lib/install/databases`. | |
| Using the EJB Timer Service is equivalent to interacting with a single | |
| JDBC resource manager. If an EJB component or application accesses a | |
| database either directly through JDBC or indirectly (for example, | |
| through an entity bean's persistence mechanism), and also interacts with | |
| the EJB Timer Service, its data source must be configured with an XA | |
| JDBC driver. | |
| You can change the following EJB Timer Service settings. You must | |
| restart the server for the changes to take effect. | |
| Minimum Delivery Interval:: | |
| Specifies the minimum time in milliseconds before an expiration for a | |
| particular timer can occur. This guards against extremely small timer | |
| increments that can overload the server. The default is `1000`. | |
| Maximum Redeliveries:: | |
| Specifies the maximum number of times the EJB timer service attempts | |
| to redeliver a timer expiration after an exception or rollback of a | |
| container-managed transaction. The default is `1`. | |
| Redelivery Interval:: | |
| Specifies how long in milliseconds the EJB timer service waits after a | |
| failed `ejbTimeout` delivery before attempting a redelivery. The | |
| default is `5000`. | |
| Timer DataSource:: | |
| Specifies the database used by the EJB Timer Service. The default is | |
| `jdbc/__TimerPool`. + | |
| [width="100%",cols="100%",] | |
| |======================================================================= | |
| a| | |
| Caution: | |
| Do not use the `jdbc/__TimerPool` resource for timers in clustered | |
| GlassFish Server environments. You must instead use a custom JDBC | |
| resource or the `jdbc/__default` resource. See the instructions below, | |
| in link:#gktqo[To Deploy an EJB Timer to a Cluster]. Also refer to | |
| "link:../administration-guide/jdbc.html#GSADG00747[Enabling the jdbc/__default Resource in a Clustered | |
| Environment]" in GlassFish Server Open Source Edition Administration | |
| Guide. | |
| |======================================================================= | |
| For information about the `asadmin list-timers` and | |
| `asadmin migrate-timers` subcommands, see the link:../reference-manual/toc.html#GSRFM[GlassFish | |
| Server Open Source Edition Reference Manual]. For information about | |
| migrating EJB timers, see "link:../ha-administration-guide/instances.html#GSHAG00190[Migrating EJB Timers]" in | |
| GlassFish Server Open Source Edition High Availability Administration | |
| Guide. | |
| You can use the `--keepstate` option of the `asadmin redeploy` command | |
| to retain EJB timers between redeployments. | |
| The default for `--keepstate` is false. This option is supported only on | |
| the default server instance, named `server`. It is not supported and | |
| ignored for any other target. | |
| When the `--keepstate` is set to true, each application that uses an EJB | |
| timer is assigned an ID in the timer database. The EJB object that is | |
| associated with a given application is assigned an ID that is | |
| constructed from the application ID and a numerical suffix. To preserve | |
| active timer data, GlassFish Server stores the application ID and the | |
| EJB ID in the timer database. To restore the data, the class loader of | |
| the newly redeployed application retrieves the EJB timers that | |
| correspond to these IDs from the timer database. | |
| For more information about the `asadmin redeploy` command, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| [[gktqo]][[GSDVG00070]][[to-deploy-an-ejb-timer-to-a-cluster]] | |
| To Deploy an EJB Timer to a Cluster | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| This procedure explains how to deploy an EJB timer to a cluster. | |
| By default, the GlassFish Server 5.0 timer service points to the | |
| preconfigured `jdbc/__TimerPool` resource, which uses an embedded Apache | |
| Derby database configuration that will not work in clustered | |
| environments. | |
| The problem is that embedded Apache Derby database runs in the GlassFish | |
| Server Java VM, so when you use the `jdbc/__TimerPool` resource, each | |
| DAS and each clustered server instance will have its own database table. | |
| Because of this, clustered server instances will not be able to find the | |
| database table on the DAS, and the DAS will not be able to find the | |
| tables on the clustered server instances. | |
| The solution is to use either a custom JDBC resource or the | |
| `jdbc/__default` resource that is preconfigured but not enabled by | |
| default in GlassFish Server. The `jdbc/__default` resource does not use | |
| the embedded Apache Derby database by default. | |
| [[GSDVG547]] | |
| Before You Begin | |
| If creating a new timer resource, the resource should be created before | |
| deploying applications that will use the timer. | |
| [CAUTION] | |
| ======================================================================= | |
| Do not use the `jdbc/__TimerPool` resource for timers in clustered | |
| GlassFish Server environments. You must instead use a custom JDBC | |
| resource or the `jdbc/__default` resource. See | |
| "olink:GSADG00747[Enabling the jdbc/__default Resource in a Clustered | |
| Environment]" in GlassFish Server Open Source Edition Administration | |
| Guide. | |
| ======================================================================= | |
| 1. Execute the following command: + | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin set configs.config.cluster_name-config.ejb-container.ejb-timer-service.timer- | |
| datasource=jdbc/my-timer-resource | |
| ---- | |
| 2. Restart the DAS and the target cluster(s). + | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin stop-cluster cluster-name | |
| asadmin stop-domain domain-name | |
| asadmin start-domain domain-name | |
| asadmin start-cluster cluster-name | |
| ---- | |
| [[GSDVG548]] | |
| Troubleshooting | |
| If you inadvertently used the `jdbc/__TimerPool` resource for your EJB | |
| timer in a clustered GlassFish Server environment, the DAS and the | |
| clustered server instances will be using separate Apache Derby database | |
| tables that are running in individual Java VMs. For timers to work in a | |
| clustered environment, the DAS and the clustered server instances must | |
| share a common database table. | |
| If you attempt to deploy an application with EJB timers without setting | |
| the timer resource correctly, the startup will fail, and you will be | |
| left with a marker file, named `ejb-timer-service-app`, on the DAS that | |
| will prevent the Timer Service from correctly creating the database | |
| table. | |
| The solution is to remove the marker file on the DAS, restart the DAS | |
| and the clusters, and then redploy any applications that rely on the | |
| offending EJB timer. The marker file is located on the DAS in | |
| domain-dir`/generated/ejb/``ejb-timer-service-app`. | |
| [[beahx]][[GSDVG00147]][[using-session-beans]] | |
| Using Session Beans | |
| ~~~~~~~~~~~~~~~~~~~ | |
| This section provides guidelines for creating session beans in the | |
| GlassFish Server environment. | |
| The following topics are addressed here: | |
| * link:#beahy[About the Session Bean Containers] | |
| * link:#beaib[Stateful Session Bean Failover] | |
| * link:#beaii[Session Bean Restrictions and Optimizations] | |
| Information on session beans is contained in the Enterprise JavaBeans | |
| Specification, v3.1. | |
| [[beahy]][[GSDVG00425]][[about-the-session-bean-containers]] | |
| About the Session Bean Containers | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Like an entity bean, a session bean can access a database through Java | |
| Database Connectivity (JDBC) calls. A session bean can also provide | |
| transaction settings. These transaction settings and JDBC calls are | |
| referenced by the session bean's container, allowing it to participate | |
| in transactions managed by the container. | |
| A container managing stateless session beans has a different charter | |
| from a container managing stateful session beans. | |
| The following topics are addressed here: | |
| * link:#beahz[Stateless Container] | |
| * link:#beaia[Stateful Container] | |
| [[beahz]][[GSDVG00287]][[stateless-container]] | |
| Stateless Container | |
| +++++++++++++++++++ | |
| The stateless container manages stateless session beans, which, by | |
| definition, do not carry client-specific states. All session beans (of a | |
| particular type) are considered equal. | |
| A stateless session bean container uses a bean pool to service requests. | |
| The GlassFish Server specific deployment descriptor file, | |
| `glassfish-ejb-jar.xml`, contains the properties that define the pool: | |
| * `steady-pool-size` | |
| * `resize-quantity` | |
| * `max-pool-size` | |
| * `pool-idle-timeout-in-seconds` | |
| For more information about `glassfish-ejb-jar.xml`, see | |
| "link:../application-deployment-guide/dd-files.html#GSDPG00079[The glassfish-ejb-jar.xml File]" in GlassFish Server | |
| Open Source Edition Application Deployment Guide. | |
| The GlassFish Server provides the `wscompile` and `wsdeploy` tools to | |
| help you implement a web service endpoint as a stateless session bean. | |
| For more information about these tools, see the link:../reference-manual/toc.html#GSRFM[GlassFish | |
| Server Open Source Edition Reference Manual]. | |
| [[beaia]][[GSDVG00288]][[stateful-container]] | |
| Stateful Container | |
| ++++++++++++++++++ | |
| The stateful container manages the stateful session beans, which, by | |
| definition, carry the client-specific state. There is a one-to-one | |
| relationship between the client and the stateful session beans. At | |
| creation, each stateful session bean (SFSB) is given a unique session ID | |
| that is used to access the session bean so that an instance of a | |
| stateful session bean is accessed by a single client only. | |
| Stateful session beans are managed using cache. The size and behavior of | |
| stateful session beans cache are controlled by specifying the following | |
| `glassfish-ejb-jar.xml` parameters: | |
| * `max-cache-size` | |
| * `resize-quantity` | |
| * `cache-idle-timeout-in-seconds` | |
| * `removal-timeout-in-seconds` | |
| * `victim-selection-policy` | |
| The `max-cache-size` element specifies the maximum number of session | |
| beans that are held in cache. If the cache overflows (when the number of | |
| beans exceeds `max-cache-size`), the container then passivates some | |
| beans or writes out the serialized state of the bean into a file. The | |
| directory in which the file is created is obtained from the EJB | |
| container using the configuration APIs. | |
| For more information about `glassfish-ejb-jar.xml`, see | |
| "link:../application-deployment-guide/dd-files.html#GSDPG00079[The glassfish-ejb-jar.xml File]" in GlassFish Server | |
| Open Source Edition Application Deployment Guide. | |
| The passivated beans are stored on the file system. The Session Store | |
| Location setting in the EJB container allows the administrator to | |
| specify the directory where passivated beans are stored. By default, | |
| passivated stateful session beans are stored in application-specific | |
| subdirectories created under domain-dir`/session-store`. | |
| [NOTE] | |
| ======================================================================= | |
| Make sure the `delete` option is set in the `server.policy` file, or | |
| expired file-based sessions might not be deleted properly. For more | |
| information about `server.policy`, see link:securing-apps.html#beabx[The | |
| `server.policy` File]. | |
| ======================================================================= | |
| The Session Store Location setting also determines where the session | |
| state is persisted if it is not highly available; see | |
| link:#beaic[Choosing a Persistence Store]. | |
| [[beaib]][[GSDVG00426]][[stateful-session-bean-failover]] | |
| Stateful Session Bean Failover | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| An SFSB's state can be saved in a persistent store in case a server | |
| instance fails. The state of an SFSB is saved to the persistent store at | |
| predefined points in its life cycle. This is called checkpointing. If | |
| SFSB checkpointing is enabled, checkpointing generally occurs after any | |
| transaction involving the SFSB is completed, even if the transaction | |
| rolls back. | |
| However, if an SFSB participates in a bean-managed transaction, the | |
| transaction might be committed in the middle of the execution of a bean | |
| method. Since the bean's state might be undergoing transition as a | |
| result of the method invocation, this is not an appropriate instant to | |
| checkpoint the bean's state. In this case, the EJB container checkpoints | |
| the bean's state at the end of the corresponding method, provided the | |
| bean is not in the scope of another transaction when that method ends. | |
| If a bean-managed transaction spans across multiple methods, | |
| checkpointing is delayed until there is no active transaction at the end | |
| of a subsequent method. | |
| The state of an SFSB is not necessarily transactional and might be | |
| significantly modified as a result of non-transactional business | |
| methods. If this is the case for an SFSB, you can specify a list of | |
| checkpointed methods. If SFSB checkpointing is enabled, checkpointing | |
| occurs after any checkpointed methods are completed. | |
| The following table lists the types of references that SFSB failover | |
| supports. All objects bound into an SFSB must be one of the supported | |
| types. In the table, No indicates that failover for the object type | |
| might not work in all cases and that no failover support is provided. | |
| However, failover might work in some cases for that object type. For | |
| example, failover might work because the class implementing that type is | |
| serializable. | |
| [[GSDVG549]][[sthref18]][[fvyed]] | |
| Table 8-1 Object Types Supported for Java EE Stateful Session Bean State | |
| Failover | |
| [width="100%",cols="45%,55%",options="header",] | |
| |======================================================================= | |
| |Java Object Type |Failover Support | |
| |Colocated or distributed stateless session, stateful session, or entity | |
| bean reference |Yes | |
| |JNDI context |Yes, `InitialContext` and `java:comp/env` | |
| |UserTransaction |Yes, but if the instance that fails is never | |
| restarted, any prepared global transactions are lost and might not be | |
| correctly rolled back or committed. | |
| |JDBC DataSource |No | |
| |Java Message Service (JMS) ConnectionFactory, Destination |No | |
| |JavaMail Session |No | |
| |Connection Factory |No | |
| |Administered Object |No | |
| |Web service reference |No | |
| |Serializable Java types |Yes | |
| |Extended persistence context |No | |
| |======================================================================= | |
| For more information about the `InitialContext`, see | |
| link:jndi.html#beans[Accessing the Naming Context]. For more information | |
| about transaction recovery, see link:transaction-service.html#beanm[Using | |
| the Transaction Service]. For more information about Administered | |
| Objects, see "link:../administration-guide/jms.html#GSADG00599[Administering JMS Physical Destinations]" | |
| in GlassFish Server Open Source Edition Administration Guide. | |
| [NOTE] | |
| ======================================================================= | |
| Idempotent URLs are supported along the HTTP path, but not the RMI-IIOP | |
| path. For more information, see link:webapps.html#beage[Configuring | |
| Idempotent URL Requests]. | |
| If a server instance to which an RMI-IIOP client request is sent crashes | |
| during the request processing (before the response is prepared and sent | |
| back to the client), an error is sent to the client. The client must | |
| retry the request explicitly. When the client retries the request, the | |
| request is sent to another server instance in the cluster, which | |
| retrieves session state information for this client. | |
| HTTP sessions can also be saved in a persistent store in case a server | |
| instance fails. In addition, if a distributable web application | |
| references an SFSB, and the web application's session fails over, the | |
| EJB reference is also failed over. For more information, see | |
| link:webapps.html#beahe[Distributed Sessions and Persistence]. | |
| If an SFSB that uses session persistence is undeployed while the | |
| GlassFish Server instance is stopped, the session data in the | |
| persistence store might not be cleared. To prevent this, undeploy the | |
| SFSB while the GlassFish Server instance is running. | |
| ======================================================================= | |
| Configure SFSB failover by: | |
| * link:#beaic[Choosing a Persistence Store] | |
| * link:#beaid[Enabling Checkpointing] | |
| * link:#beaih[Specifying Methods to Be Checkpointed] | |
| [[beaic]][[GSDVG00289]][[choosing-a-persistence-store]] | |
| Choosing a Persistence Store | |
| ++++++++++++++++++++++++++++ | |
| The following types of persistent storage are supported for passivation | |
| and checkpointing of the SFSB state: | |
| * The local file system - Allows a single server instance to recover the | |
| SFSB state after a failure and restart. This store also provides | |
| passivation and activation of the state to help control the amount of | |
| memory used. This option is not supported in a production environment | |
| that requires SFSB state persistence. This is the default storage | |
| mechanism if availability is not enabled. | |
| * Other servers - Uses other server instances in the cluster for session | |
| persistence. Clustered server instances replicate session state. Each | |
| backup instance stores the replicated data in memory. This is the | |
| default storage mechanism if availability is enabled. | |
| Choose the persistence store in one of the following ways: | |
| * To use the local file system, first disable availability. Select the | |
| Availability Service component under the relevant configuration in the | |
| Administration Console. Uncheck the Availability Service box. Then | |
| select the EJB Container component and edit the Session Store Location | |
| value. The default is domain-dir`/session-store`. | |
| * To use other servers, select the Availability Service component under | |
| the relevant configuration in the Administration Console. Check the | |
| Availability Service box. To enable availability for the EJB container, | |
| select the EJB Container Availability tab, then check the Availability | |
| Service box. All instances in an GlassFish Server cluster should have | |
| the same availability settings to ensure consistent behavior. | |
| For more information about SFSB state persistence, see the | |
| link:../ha-administration-guide/toc.html#GSHAG[GlassFish Server Open Source Edition High Availability | |
| Administration Guide]. | |
| [[gkpdg]][[GSDVG00033]][[using-the---keepstate-option]] | |
| Using the `--keepstate` Option | |
| If you are using the file system for persistence, you can use the | |
| `--keepstate` option of the `asadmin redeploy` command to retain the | |
| SFSB state between redeployments. | |
| The default for `--keepstate` is false. This option is supported only on | |
| the default server instance, named `server`. It is not supported and | |
| ignored for any other target. | |
| Some changes to an application between redeployments prevent this | |
| feature from working properly. For example, do not change the set of | |
| instance variables in the SFSB bean class. | |
| If any active SFSB instance fails to be preserved or restored, none of | |
| the SFSB instances will be available when the redeployment is complete. | |
| However, the redeployment continues and a warning is logged. | |
| To preserve active state data, GlassFish Server serializes the data and | |
| saves it in memory. To restore the data, the class loader of the newly | |
| redeployed application deserializes the data that was previously saved. | |
| For more information about the `asadmin redeploy` command, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| [[gkpef]][[GSDVG00034]][[using-the---asyncreplication-option]] | |
| Using the `--asyncreplication` Option | |
| If you are using replication on other servers for persistence, you can | |
| use the `--asyncreplication` option of the `asadmin deploy` command to | |
| specify that SFSB states are first buffered and then replicated using a | |
| separate asynchronous thread. If `--asyncreplication` is set to true | |
| (default), performance is improved but availability is reduced. If the | |
| instance where states are buffered but not yet replicated fails, the | |
| states are lost. If set to false, performance is reduced but | |
| availability is guaranteed. States are not buffered but immediately | |
| transmitted to other instances in the cluster. | |
| For more information about the `asadmin deploy` command, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| [[beaid]][[GSDVG00290]][[enabling-checkpointing]] | |
| Enabling Checkpointing | |
| ++++++++++++++++++++++ | |
| The following sections describe how to enable SFSB checkpointing: | |
| * link:#beaie[Server Instance and EJB Container Levels] | |
| * link:#beaif[Application and EJB Module Levels] | |
| * link:#beaig[SFSB Level] | |
| [[beaie]][[GSDVG00035]][[server-instance-and-ejb-container-levels]] | |
| Server Instance and EJB Container Levels | |
| To enable SFSB checkpointing at the server instance or EJB container | |
| level, see link:#beaic[Choosing a Persistence Store]. | |
| [[beaif]][[GSDVG00036]][[application-and-ejb-module-levels]] | |
| Application and EJB Module Levels | |
| To enable SFSB checkpointing at the application or EJB module level | |
| during deployment, use the `asadmin deploy` or `asadmin deploydir` | |
| command with the `--availabilityenabled` option set to `true`. For | |
| details, see the link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition | |
| Reference Manual]. | |
| [[beaig]][[GSDVG00037]][[sfsb-level]] | |
| SFSB Level | |
| To enable SFSB checkpointing at the SFSB level, set | |
| `availability-enabled="true"` in the `ejb` element of the SFSB's | |
| `glassfish-ejb-jar.xml` file as follows: | |
| [source,oac_no_warn] | |
| ---- | |
| <glassfish-ejb-jar> | |
| ... | |
| <enterprise-beans> | |
| ... | |
| <ejb availability-enabled="true"> | |
| <ejb-name>MySFSB</ejb-name> | |
| </ejb> | |
| ... | |
| </enterprise-beans> | |
| </glassfish-ejb-jar> | |
| ---- | |
| [[beaih]][[GSDVG00291]][[specifying-methods-to-be-checkpointed]] | |
| Specifying Methods to Be Checkpointed | |
| +++++++++++++++++++++++++++++++++++++ | |
| If SFSB checkpointing is enabled, checkpointing generally occurs after | |
| any transaction involving the SFSB is completed, even if the transaction | |
| rolls back. | |
| To specify additional optional checkpointing of SFSBs at the end of | |
| non-transactional business methods that cause important modifications to | |
| the bean's state, use the `checkpoint-at-end-of-method` element within | |
| the `ejb` element in `glassfish-ejb-jar.xml`. | |
| For example: | |
| [source,oac_no_warn] | |
| ---- | |
| <glassfish-ejb-jar> | |
| ... | |
| <enterprise-beans> | |
| ... | |
| <ejb availability-enabled="true"> | |
| <ejb-name>ShoppingCartEJB</ejb-name> | |
| <checkpoint-at-end-of-method> | |
| <method> | |
| <method-name>addToCart</method-name> | |
| </method> | |
| </checkpoint-at-end-of-method> | |
| </ejb> | |
| ... | |
| </enterprise-beans> | |
| </glassfish-ejb-jar> | |
| ---- | |
| For details, see "link:../application-deployment-guide/dd-elements.html#GSDPG00108[checkpoint-at-end-of-method]" in | |
| GlassFish Server Open Source Edition Application Deployment Guide. | |
| The non-transactional methods in the `checkpoint-at-end-of-method` | |
| element can be the following: | |
| * `create` methods defined in the home or business interface of the | |
| SFSB, if you want to checkpoint the initial state of the SFSB | |
| immediately after creation | |
| * For SFSBs using container managed transactions only, methods in the | |
| remote interface of the bean marked with the transaction attribute | |
| TX_NOT_SUPPORTED or TX_NEVER | |
| * For SFSBs using bean managed transactions only, methods in which a | |
| bean managed transaction is neither started nor committed | |
| Any other methods mentioned in this list are ignored. At the end of | |
| invocation of each of these methods, the EJB container saves the state | |
| of the SFSB to persistent store. | |
| [NOTE] | |
| ======================================================================= | |
| If an SFSB does not participate in any transaction, and if none of its | |
| methods are explicitly specified in the `checkpoint-at-end-of-method` | |
| element, the bean's state is not checkpointed at all even if | |
| `availability-enabled="true"` for this bean. | |
| For better performance, specify a small subset of methods. The methods | |
| chosen should accomplish a significant amount of work in the context of | |
| the Java EE application or should result in some important modification | |
| to the bean's state. | |
| ======================================================================= | |
| [[beaii]][[GSDVG00427]][[session-bean-restrictions-and-optimizations]] | |
| Session Bean Restrictions and Optimizations | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| This section discusses restrictions on developing session beans and | |
| provides some optimization guidelines. | |
| * link:#beaij[Optimizing Session Bean Performance] | |
| * link:#beaik[Restricting Transactions] | |
| * link:#glanq[EJB Singletons] | |
| [[beaij]][[GSDVG00292]][[optimizing-session-bean-performance]] | |
| Optimizing Session Bean Performance | |
| +++++++++++++++++++++++++++++++++++ | |
| For stateful session beans, colocating the stateful beans with their | |
| clients so that the client and bean are executing in the same process | |
| address space improves performance. | |
| [[beaik]][[GSDVG00293]][[restricting-transactions]] | |
| Restricting Transactions | |
| ++++++++++++++++++++++++ | |
| The following restrictions on transactions are enforced by the container | |
| and must be observed as session beans are developed: | |
| * A session bean can participate in, at most, a single transaction at a | |
| time. | |
| * If a session bean is participating in a transaction, a client cannot | |
| invoke a method on the bean such that the `trans-attribute` element (or | |
| `@TransactionAttribute` annotation) in the `ejb-jar.xml` file would | |
| cause the container to execute the method in a different or unspecified | |
| transaction context or an exception is thrown. | |
| * If a session bean instance is participating in a transaction, a client | |
| cannot invoke the `remove` method on the session object's home or | |
| business interface object, or an exception is thrown. | |
| [[glanq]][[GSDVG00294]][[ejb-singletons]] | |
| EJB Singletons | |
| ++++++++++++++ | |
| EJB Singletons are created for each server instance in a cluster, and | |
| not once per cluster. | |
| [[beail]][[GSDVG00148]][[using-read-only-beans]] | |
| Using Read-Only Beans | |
| ~~~~~~~~~~~~~~~~~~~~~ | |
| A read-only bean is an EJB 2.1 entity bean that is never modified by an | |
| EJB client. The data that a read-only bean represents can be updated | |
| externally by other enterprise beans, or by other means, such as direct | |
| database updates. | |
| [NOTE] | |
| ======================================================================= | |
| Read-only beans are specific to the GlassFish Server and are not part of | |
| the Enterprise JavaBeans Specification, v2.1. Use of this feature for an | |
| EJB 2.1 bean results in a non-portable application. | |
| To make an EJB 3.0 entity bean read-only, use `@Column` annotations to | |
| mark its columns `insertable=false` and `updatable=false`. | |
| ======================================================================= | |
| Read-only beans are best suited for situations where the underlying data | |
| never changes, or changes infrequently. | |
| The following topics are addressed here: | |
| * link:#beaim[Read-Only Bean Characteristics and Life Cycle] | |
| * link:#beain[Read-Only Bean Good Practices] | |
| * link:#beaio[Refreshing Read-Only Beans] | |
| * link:#beais[Deploying Read-Only Beans] | |
| [[beaim]][[GSDVG00428]][[read-only-bean-characteristics-and-life-cycle]] | |
| Read-Only Bean Characteristics and Life Cycle | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Read-only beans are best suited for situations where the underlying data | |
| never changes, or changes infrequently. For example, a read-only bean | |
| can be used to represent a stock quote for a particular company, which | |
| is updated externally. In such a case, using a regular entity bean might | |
| incur the burden of calling `ejbStore`, which can be avoided by using a | |
| read-only bean. | |
| Read-only beans have the following characteristics: | |
| * Only entity beans can be read-only beans. | |
| * Either bean-managed persistence (BMP) or container-managed persistence | |
| (CMP) is allowed. If CMP is used, do not create the database schema | |
| during deployment. Instead, work with your database administrator to | |
| populate the data into the tables. See | |
| link:container_managed-persistence.html#beajj[Using Container-Managed | |
| Persistence]. | |
| * Only container-managed transactions are allowed; read-only beans | |
| cannot start their own transactions. | |
| * Read-only beans don't update any bean state. | |
| * `ejbStore` is never called by the container. | |
| * `ejbLoad` is called only when a transactional method is called or when | |
| the bean is initially created (in the cache), or at regular intervals | |
| controlled by the bean's `refresh-period-in-seconds` element in the | |
| `glassfish-ejb-jar.xml` file. | |
| * The home interface can have any number of find methods. The return | |
| type of the find methods must be the primary key for the same bean type | |
| (or a collection of primary keys). | |
| * If the data that the bean represents can change, then | |
| `refresh-period-in-seconds` must be set to refresh the beans at regular | |
| intervals. `ejbLoad` is called at this regular interval. | |
| A read-only bean comes into existence using the appropriate find | |
| methods. | |
| Read-only beans are cached and have the same cache properties as entity | |
| beans. When a read-only bean is selected as a victim to make room in the | |
| cache, `ejbPassivate` is called and the bean is returned to the free | |
| pool. When in the free pool, the bean has no identity and is used only | |
| to serve any finder requests. | |
| Read-only beans are bound to the naming service like regular read-write | |
| entity beans, and clients can look up read-only beans the same way | |
| read-write entity beans are looked up. | |
| [[beain]][[GSDVG00429]][[read-only-bean-good-practices]] | |
| Read-Only Bean Good Practices | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| For best results, follow these guidelines when developing read-only | |
| beans: | |
| * Avoid having any `create` or `remove` methods in the home interface. | |
| * Use any of the valid EJB 2.1 transaction attributes for the | |
| `trans-attribute` element. + | |
| The reason for having `TX_SUPPORTED` is to allow reading uncommitted | |
| data in the same transaction. Also, the transaction attributes can be | |
| used to force `ejbLoad`. | |
| [[beaio]][[GSDVG00430]][[refreshing-read-only-beans]] | |
| Refreshing Read-Only Beans | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| There are several ways of refreshing read-only beans, as addressed in | |
| the following sections: | |
| * link:#beaip[Invoking a Transactional Method] | |
| * link:#beaiq[Refreshing Periodically] | |
| * link:#beair[Refreshing Programmatically] | |
| [[beaip]][[GSDVG00295]][[invoking-a-transactional-method]] | |
| Invoking a Transactional Method | |
| +++++++++++++++++++++++++++++++ | |
| Invoking any transactional method invokes `ejbLoad`. | |
| [[beaiq]][[GSDVG00296]][[refreshing-periodically]] | |
| Refreshing Periodically | |
| +++++++++++++++++++++++ | |
| Use the `refresh-period-in-seconds` element in the | |
| `glassfish-ejb-jar.xml` file to refresh a read-only bean periodically. | |
| * If the value specified in `refresh-period-in-seconds` is zero or not | |
| specified, which is the default, the bean is never refreshed (unless a | |
| transactional method is accessed). | |
| * If the value is greater than zero, the bean is refreshed at the rate | |
| specified. | |
| [NOTE] | |
| ======================================================================= | |
| This is the only way to refresh the bean state if the data can be | |
| modified external to the GlassFish Server. | |
| ======================================================================= | |
| By default, a single timer is used for all instances of a read-only | |
| bean. When that timer fires, all bean instances are marked as expired | |
| and are refreshed from the database the next time they are used. | |
| Use the `-Dcom.sun.ejb.containers.readonly.relative.refresh.mode=true` | |
| flag to refresh each bean instance independently upon access if its | |
| refresh period has expired. The default is `false`. Note that each | |
| instance still has the same refresh period. This additional level of | |
| granularity can improve the performance of read-only beans that do not | |
| need to be refreshed at the same time. | |
| To set this flag, use the `asadmin create-jvm-options` command. For | |
| example: | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin create-jvm-options -Dcom.sun.ejb.containers.readonly.relative.refresh.mode=true | |
| ---- | |
| [[beair]][[GSDVG00297]][[refreshing-programmatically]] | |
| Refreshing Programmatically | |
| +++++++++++++++++++++++++++ | |
| Typically, beans that update any data that is cached by read-only beans | |
| need to notify the read-only beans to refresh their state. Use | |
| ReadOnlyBeanNotifier to force the refresh of read-only beans. | |
| To do this, invoke the following methods on the ReadOnlyBeanNotifier | |
| bean: | |
| [source,oac_no_warn] | |
| ---- | |
| public interface ReadOnlyBeanNotifier extends java.rmi.Remote { | |
| refresh(Object PrimaryKey) throws RemoteException; | |
| } | |
| ---- | |
| The implementation of the ReadOnlyBeanNotifier interface is provided by | |
| the container. The bean looks up ReadOnlyBeanNotifier using a fragment | |
| of code such as the following example: | |
| [source,oac_no_warn] | |
| ---- | |
| com.sun.appserv.ejb.ReadOnlyBeanHelper helper = | |
| new com.sun.appserv.ejb.ReadOnlyBeanHelper(); | |
| com.sun.appserv.ejb.ReadOnlyBeanNotifier notifier = | |
| helper.getReadOnlyBeanNotifier("java:comp/env/ejb/ReadOnlyCustomer"); | |
| notifier.refresh(PrimaryKey); | |
| ---- | |
| For a local read-only bean notifier, the lookup has this modification: | |
| [source,oac_no_warn] | |
| ---- | |
| helper.getReadOnlyBeanLocalNotifier("java:comp/env/ejb/LocalReadOnlyCustomer"); | |
| ---- | |
| Beans that update any data that is cached by read-only beans need to | |
| call the `refresh` methods. The next (non-transactional) call to the | |
| read-only bean invokes `ejbLoad`. | |
| For Javadoc tool pages relevant to read-only beans, go to | |
| `http://glassfish.java.net/nonav/docs/v3/api/` and click on the | |
| `com.sun.appserv.ejb` package. | |
| [[beais]][[GSDVG00431]][[deploying-read-only-beans]] | |
| Deploying Read-Only Beans | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| Read-only beans are deployed in the same manner as other entity beans. | |
| However, in the entry for the bean in the `glassfish-ejb-jar.xml` file, | |
| the `is-read-only-bean` element must be set to true. That is: | |
| `<is-read-only-bean>true</is-read-only-bean>` | |
| Also, the `refresh-period-in-seconds` element in the | |
| `glassfish-ejb-jar.xml` file can be set to some value that specifies the | |
| rate at which the bean is refreshed. If this element is missing, no | |
| refresh occurs. | |
| All requests in the same transaction context are routed to the same | |
| read-only bean instance. Set the `allow-concurrent-access` element to | |
| either `true` (to allow concurrent accesses) or `false` (to serialize | |
| concurrent access to the same read-only bean). The default is `false`. | |
| For further information on these elements, refer to | |
| "link:../application-deployment-guide/dd-files.html#GSDPG00079[The glassfish-ejb-jar.xml File]" in GlassFish Server | |
| Open Source Edition Application Deployment Guide. | |
| [[beait]][[GSDVG00149]][[using-message-driven-beans]] | |
| Using Message-Driven Beans | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| This section describes message-driven beans and explains the | |
| requirements for creating them in the GlassFish Server environment. | |
| The following topics are addressed here: | |
| * link:#beaiu[Message-Driven Bean Configuration] | |
| * link:#beaiy[Message-Driven Bean Restrictions and Optimizations] | |
| [[beaiu]][[GSDVG00432]][[message-driven-bean-configuration]] | |
| Message-Driven Bean Configuration | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| The following topics are addressed here: | |
| * link:#beaiv[Connection Factory and Destination] | |
| * link:#beaiw[Message-Driven Bean Pool] | |
| * link:#beaix[Domain-Level Settings] | |
| For information about setting up load balancing for message-driven | |
| beans, see link:jms.html#beaop[Load-Balanced Message Inflow]. | |
| [[beaiv]][[GSDVG00298]][[connection-factory-and-destination]] | |
| Connection Factory and Destination | |
| ++++++++++++++++++++++++++++++++++ | |
| A message-driven bean is a client to a Connector inbound resource | |
| adapter. The message-driven bean container uses the JMS service | |
| integrated into the GlassFish Server for message-driven beans that are | |
| JMS clients. JMS clients use JMS Connection Factory- and | |
| Destination-administered objects. A JMS Connection Factory administered | |
| object is a resource manager Connection Factory object that is used to | |
| create connections to the JMS provider. | |
| The `mdb-connection-factory` element in the `glassfish-ejb-jar.xml` file | |
| for a message-driven bean specifies the connection factory that creates | |
| the container connection to the JMS provider. | |
| The `jndi-name` element of the `ejb` element in the | |
| `glassfish-ejb-jar.xml` file specifies the JNDI name of the administered | |
| object for the JMS Queue or Topic destination that is associated with | |
| the message-driven bean. | |
| [[beaiw]][[GSDVG00299]][[message-driven-bean-pool]] | |
| Message-Driven Bean Pool | |
| ++++++++++++++++++++++++ | |
| The container manages a pool of message-driven beans for the concurrent | |
| processing of a stream of messages. The `glassfish-ejb-jar.xml` file | |
| contains the elements that define the pool (that is, the `bean-pool` | |
| element): | |
| * `steady-pool-size` | |
| * `resize-quantity` | |
| * `max-pool-size` | |
| * `pool-idle-timeout-in-seconds` | |
| For more information about `glassfish-ejb-jar.xml`, see | |
| "link:../application-deployment-guide/dd-files.html#GSDPG00079[The glassfish-ejb-jar.xml File]" in GlassFish Server | |
| Open Source Edition Application Deployment Guide. | |
| [[beaix]][[GSDVG00300]][[domain-level-settings]] | |
| Domain-Level Settings | |
| +++++++++++++++++++++ | |
| You can control the following domain-level message-driven bean settings | |
| in the EJB container: | |
| Initial and Minimum Pool Size:: | |
| Specifies the initial and minimum number of beans maintained in the | |
| pool. The default is `0`. | |
| Maximum Pool Size:: | |
| Specifies the maximum number of beans that can be created to satisfy | |
| client requests. The default is 3`2`. | |
| Pool Resize Quantity:: | |
| Specifies the number of beans to be created if a request arrives when | |
| the pool is empty (subject to the Initial and Minimum Pool Size), or | |
| the number of beans to remove if idle for more than the Idle Timeout. | |
| The default is `8`. | |
| Idle Timeout:: | |
| Specifies the maximum time in seconds that a bean can remain idle in | |
| the pool. After this amount of time, the bean is destroyed. The | |
| default is `600` (10 minutes). A value of `0` means a bean can remain | |
| idle indefinitely. | |
| For information on monitoring message-driven beans, click the Help | |
| button in the Administration Console. Select the Stand-Alone Instances | |
| component, select the instance from the table, and select the Monitor | |
| tab. Or select the Clusters component, select the cluster from the | |
| table, select the Instances tab, select the instance from the table, and | |
| select the Monitor tab. | |
| [NOTE] | |
| ======================================================================= | |
| Running monitoring when it is not needed might impact performance, so | |
| you might choose to turn monitoring off when it is not in use. For | |
| details, see "olink:GSADG00011[Administering the Monitoring Service]" in | |
| GlassFish Server Open Source Edition Administration Guide. | |
| ======================================================================= | |
| [[beaiy]][[GSDVG00433]][[message-driven-bean-restrictions-and-optimizations]] | |
| Message-Driven Bean Restrictions and Optimizations | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| This section discusses the following restrictions and performance | |
| optimizations that pertain to developing message-driven beans: | |
| * link:#beaiz[Pool Tuning and Monitoring] | |
| * link:#beaja[The `onMessage` Runtime Exception] | |
| [[beaiz]][[GSDVG00301]][[pool-tuning-and-monitoring]] | |
| Pool Tuning and Monitoring | |
| ++++++++++++++++++++++++++ | |
| The message-driven bean pool is also a pool of threads, with each | |
| message-driven bean instance in the pool associating with a server | |
| session, and each server session associating with a thread. Therefore, a | |
| large pool size also means a high number of threads, which impacts | |
| performance and server resources. | |
| When configuring message-driven bean pool properties, make sure to | |
| consider factors such as message arrival rate and pattern, `onMessage` | |
| method processing time, overall server resources (threads, memory, and | |
| so on), and any concurrency requirements and limitations from other | |
| resources that the message-driven bean accesses. | |
| When tuning performance and resource usage, make sure to consider | |
| potential JMS provider properties for the connection factory used by the | |
| container (the `mdb-connection-factory` element in the | |
| `glassfish-ejb-jar.xml` file). For example, you can tune the Open | |
| Message Queue flow control related properties for connection factory in | |
| situations where the message incoming rate is much higher than | |
| `max-pool-size` can handle. | |
| Refer to "link:../administration-guide/monitoring.html#GSADG00011[Administering the Monitoring Service]" in | |
| GlassFish Server Open Source Edition Administration Guide for | |
| information on how to get message-driven bean pool statistics. | |
| [[beaja]][[GSDVG00302]][[the-onmessage-runtime-exception]] | |
| The `onMessage` Runtime Exception | |
| +++++++++++++++++++++++++++++++++ | |
| Message-driven beans, like other well-behaved MessageListeners, should | |
| not, in general, throw runtime exceptions. If a message-driven bean's | |
| `onMessage` method encounters a system-level exception or error that | |
| does not allow the method to successfully complete, the Enterprise | |
| JavaBeans Specification, v3.0 provides the following guidelines: | |
| * If the bean method encounters a runtime exception or error, it should | |
| simply propagate the error from the bean method to the container. | |
| * If the bean method performs an operation that results in a checked | |
| exception that the bean method cannot recover, the bean method should | |
| throw the `javax.ejb.EJBException` that wraps the original exception. | |
| * Any other unexpected error conditions should be reported using | |
| `javax.ejb.EJBException` (`javax.ejb.EJBException` is a subclass of | |
| `java.lang.RuntimeException`). | |
| Under container-managed transaction demarcation, upon receiving a | |
| runtime exception from a message-driven bean's `onMessage` method, the | |
| container rolls back the container-started transaction and the message | |
| is redelivered. This is because the message delivery itself is part of | |
| the container-started transaction. By default, the GlassFish Server | |
| container closes the container's connection to the JMS provider when the | |
| first runtime exception is received from a message-driven bean | |
| instance's `onMessage` method. This avoids potential message redelivery | |
| looping and protects server resources if the message-driven bean's | |
| `onMessage` method continues misbehaving. To change this default | |
| container behavior, use the `cmt-max-runtime-exceptions` property of the | |
| MDB container. Here is an example `asadmin set` command that sets this | |
| property: | |
| [source,oac_no_warn] | |
| ---- | |
| asadmin set server-config.mdb-container.property.cmt-max-runtime-exceptions="5" | |
| ---- | |
| For more information about the `asadmin set` command, see the | |
| link:../reference-manual/toc.html#GSRFM[GlassFish Server Open Source Edition Reference Manual]. | |
| The `cmt-max-runtime-exceptions` property specifies the maximum number | |
| of runtime exceptions allowed from a message-driven bean's `onMessage` | |
| method before the container starts to close the container's connection | |
| to the message source. By default this value is 1; -1 disables this | |
| container protection. | |
| A message-driven bean's `onMessage` method can use the | |
| `jakarta.jms.Message.getJMSRedelivered` method to check whether a received | |
| message is a redelivered message. | |
| [NOTE] | |
| ======================================================= | |
| The `cmt-max-runtime-exceptions` property is deprecated. | |
| ======================================================= | |