Avoiding FAQ posts by providing a NAGGING log
adrian.brock Apr 14, 2005 4:23 PMDo you think it would be a good idea to provide a "NAGGING" log?
The idea being that it will log warnings about potentially stupid configurations
or feature uses
to a separate log that can be turned off if people really know what they are doing.
e.g. The follow code points out the commonly seen misconfiguration
read-only + commit-option B. i.e. The data is reloaded on every finegrained
invocation on the entity bean.
NOTE: This one is a difficult example, since such a configuration works just fine
with the DTO pattern and getDTO() is the only invocation on the ejb for each transaction.
Index: EntitySynchronizationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/EntitySynchronizationInterceptor.java,v retrieving revision 1.86 diff -u -r1.86 EntitySynchronizationInterceptor.java --- EntitySynchronizationInterceptor.java 10 Aug 2004 17:12:58 -0000 1.86 +++ EntitySynchronizationInterceptor.java 14 Apr 2005 20:16:30 -0000 @@ -21,6 +21,7 @@ import org.jboss.ejb.EntityEnterpriseContext; import org.jboss.ejb.GlobalTxEntityMap; import org.jboss.invocation.Invocation; +import org.jboss.logging.Logger; import org.jboss.metadata.ConfigurationMetaData; import org.jboss.util.NestedRuntimeException; @@ -45,6 +46,8 @@ public class EntitySynchronizationInterceptor extends AbstractInterceptor { + private static final Logger nag = Logger.getLogger("org.jboss.nagging"); + /** * The variable <code>vcrThread</code> holds the valid context refresher thread for * this interceptor, so it may be shut down in stop. @@ -66,6 +69,9 @@ */ protected EntityContainer container; + /** Whether we have warned about non performant synchronization */ + private boolean warnedSynchronizationFAQ = false; + public Container getContainer() { return container; @@ -296,11 +302,13 @@ // Keep instance active, but invalidate state case ConfigurationMetaData.B_COMMIT_OPTION: // Invalidate state (there might be other points of entry) + logSynchronizationFAQ(); ctx.setValid(false); break; // Invalidate everything AND Passivate instance case ConfigurationMetaData.C_COMMIT_OPTION: + logSynchronizationFAQ(); try { @@ -349,11 +357,13 @@ // Keep instance active, but invalidate state case ConfigurationMetaData.B_COMMIT_OPTION: // Invalidate state (there might be other points of entry) + logSynchronizationFAQ(); ctx.setValid(false); break; // Invalidate everything AND Passivate instance case ConfigurationMetaData.C_COMMIT_OPTION: + logSynchronizationFAQ(); try { // Do not call release if getId() is null. This means that @@ -384,7 +394,19 @@ } } } - + + private void logSynchronizationFAQ() + { + if (warnedSynchronizationFAQ == false) + { + warnedSynchronizationFAQ = true; + nag.warn("The use of read-only or lack of a transaction and not using a cache (commit-option B/C) " + + "will mean reloading of data on every entity bean invocation! ejb-name=" + + container.getBeanMetaData().getEjbName()); + + } + } + protected class InstanceSynchronization implements Synchronization {