[jboss-jira] [JBoss JIRA] Commented: (JBAS-4116) JRMPInvokerHA fails with a NPE when no JRMPInvoker is setup on the server
Adrian Brock (JIRA)
jira-events at lists.jboss.org
Fri Feb 23 14:22:50 EST 2007
[ http://jira.jboss.com/jira/browse/JBAS-4116?page=comments#action_12354121 ]
Adrian Brock commented on JBAS-4116:
------------------------------------
Any NPE is a bug that should be fixed with better validation at deployment time
or a more human readable message at runtime.
In this case, I don't see why this object is being cached inside the transport anway
since the TransactionPropogationContextUtil is already caching the result.
Seems to me this code should be replaced by (in the transport/invoker)
invocation.setTransaction(TransactionPropogationContextUtil.importTPC(mi.getTransactionPropagationContext()));
New method in TransactionPropogationContextUtil
public static Transaction importTPC(Object tpc)
{
return getTPCImporter().importTransactionPropagationContext(tpc);
}
The only advantage I can see to caching this in the JRMPInvoker
is that you validate that there is such a jndi binding at deployment time.
But this can be done with a dummy getTPCImporter() invocation without caching.
> JRMPInvokerHA fails with a NPE when no JRMPInvoker is setup on the server
> -------------------------------------------------------------------------
>
> Key: JBAS-4116
> URL: http://jira.jboss.com/jira/browse/JBAS-4116
> Project: JBoss Application Server
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: Clustering
> Affects Versions: JBossAS-4.0.5.CR1, JBossAS-4.0.5.GA, JBossAS-4.0.4.GA
> Environment: SuSE Linux 10.2 XEN Instance, AMD64 Dual Core 5000+, 1GB Memory
> Reporter: Andreas Schaefer
> Assigned To: Brian Stansberry
> Priority: Minor
>
> When JRMPInvokerHA is used but instead of the JRMPInvoker another Invoker like the Pooled is used then the JRMPInvokerHA will fail with a NPE on the invoke() method of the JRMPInvokerHA accessing the importTPC() method of the JRMPInvoker:
> Caused by: java.lang.NullPointerException
> at org.jboss.invocation.jrmp.server.JRMPInvoker.importTPC(JRMPInvoker.java:595)
> at org.jboss.invocation.jrmp.server.JRMPInvokerHA.invoke(JRMPInvokerHA.java:151)
> The problem was dormant until now because the variable called 'tcpImporter' is static and so any instance of JRMPInvoker will set it. Unfortunately the variable is not set by the JRMPInvokerHA by itself because the method startService() is overwriten and does not call the super method.
> I fixed that issue this way:
> 1) Extract the setting of the tcpImporter in the JRMPInvoker in its own, protected method:
> protected void createTPCInvoker() {
> // FIXME marcf: This should not be here
> // and the transaction propagation context importer
> tpcImporter = TransactionPropagationContextUtil.getTPCImporter();
> }
> 2). Call this method from within the startService() method of the JRMPInvoker (a) and the JRMPInvokerHA (b):
> a)
> protected void startService() throws Exception
> {
> loadCustomSocketFactories();
> if (log.isDebugEnabled())
> {
> log.debug("RMI Port='" +
> (rmiPort == ANONYMOUS_PORT ? "Anonymous" :
> Integer.toString(rmiPort)) + "'");
> log.debug("Client SocketFactory='" +
> (clientSocketFactory == null ? "Default" :
> clientSocketFactory.toString()) + "'");
> log.debug("Server SocketFactory='" +
> (serverSocketFactory == null ? "Default" :
> serverSocketFactory.toString()) + "'");
> log.debug("Server SocketAddr='" +
> (serverAddress == null ? "Default" :
> serverAddress) + "'");
> log.debug("SecurityDomain='" +
> (sslDomain == null ? "Default" :
> sslDomain) + "'");
> }
> InitialContext ctx = new InitialContext();
> createTPCInvoker();
> // Set the transaction manager and transaction propagation
> // context factory of the GenericProxy class
> Invoker delegateInvoker = createDelegateInvoker();
> // Make the remote invoker proxy available for use by the proxy factory
> Registry.bind(support.getServiceName(), delegateInvoker);
> // Export CI
> exportCI();
> log.debug("Bound JRMP invoker for JMX node");
> ctx.close();
> }
> b)
> protected void startService() throws Exception
> {
> loadCustomSocketFactories();
> if (log.isDebugEnabled())
> {
> log.debug("RMI Port='" + (rmiPort == ANONYMOUS_PORT ?
> "Anonymous" : Integer.toString(rmiPort)+"'"));
> log.debug("Client SocketFactory='" + (clientSocketFactory == null ?
> "Default" : clientSocketFactory.toString()+"'"));
> log.debug("Server SocketFactory='" + (serverSocketFactory == null ?
> "Default" : serverSocketFactory.toString()+"'"));
> log.debug("Server SocketAddr='" + (serverAddress == null ?
> "Default" : serverAddress+"'"));
> log.debug("SecurityDomain='" + (sslDomain == null ?
> "None" : sslDomain+"'"));
> }
> createTPCInvoker();
> exportCI();
> Registry.bind(support.getServiceName(), this);
> }
> I also don't think that the tcpInvoker should be static and I tested it without being static and it worked for me but that is another story.
> -Andy
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list