| 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 |
| `javax.jms.Message.getJMSRedelivered` method to check whether a received |
| message is a redelivered message. |
| |
| |
| [NOTE] |
| ======================================================= |
| |
| The `cmt-max-runtime-exceptions` property is deprecated. |
| |
| ======================================================= |
| |
| |
| |