NullPointerException triggered by ConversationWiperThread
---------------------------------------------------------

                 Key: ORCHESTRA-34
                 URL: https://issues.apache.org/jira/browse/ORCHESTRA-34
             Project: MyFaces Orchestra
          Issue Type: Bug
          Components: Conversation
    Affects Versions: 1.3
            Reporter: Simon Kitching


As reported by Petr Juza, a NullPointerException can be triggered by the 
ConversationWiperThread:
Exception in thread
"org.apache.myfaces.orchestra.conversation.ConversationWiperThread"
java.lang.NullPointerException
        at
org.apache.myfaces.orchestra.conversation.ConversationManager.findConver
sationContextId(ConversationManager.java:140)
        at
org.apache.myfaces.orchestra.conversation.ConversationManager.removeAndI
nvalidateConversationContext(ConversationManager.java:343)
        at
org.apache.myfaces.orchestra.conversation.ConversationManager.checkTimeo
uts(ConversationManager.java:626)
        at
org.apache.myfaces.orchestra.conversation.ConversationWiperThread._run(C
onversationWiperThread.java:113)
        at
org.apache.myfaces.orchestra.conversation.ConversationWiperThread.run(Co
nversationWiperThread.java:90)

After initial investigation, the problem appears to be that the 
ConversationWiperThread is detecting a ConversationContext timeout, and so is 
trying to delete the ConversationContext. However in the 
ConversationManager.removeAndInvalidateConversationContext(ctx) method, a check 
is done to see if the context being removed is the "current one", in order to 
prevent code within a request from accidentally deleting the context that is 
being used to process that request. However this check requires the 
FrameworkAdapter - but there is no FrameworkAdapter instance for a background 
thread like the ConversationWiperThread:

public void removeAndInvalidateConversationContext(ConversationContext context)
{
  .....
  if (context.getIdAsLong().equals(findConversationContextId()))
   ...

where findConversationContextId tries to use FrameworkAdapter to look in the 
current HttpRequest object.

Here, we could check whether a FrameworkAdapter exists, and if not then assume 
that the context is not the "current" one. Ideally, we would actually block the 
wiper thread from deleting a context if it is "locked", but the odds of a 
context timing out while actually in use are very low indeed.

I'm a little puzzled why I don't see this exception in the logs for my apps 
that use Orchestra...

Note that this exception is fairly harmless: it just disables the 
ConversationWiperThread

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to