[jboss-dev-forums] [Design of the JBoss EJB Container] - Question about Remoting, Marshalling, and EJBs

ron.sigal@jboss.com do-not-reply at jboss.com
Sat Mar 8 18:27:42 EST 2008


I'm looking at an old Remoting issue, JBREM-167 "RMI Invoker does not use true remoting marshalling/unmarshalling" and I have a question.  This issue concerns the Remoting RMI transport, which, as an alternative to the more commonly used "socket" transport, makes invocations using Java RMI.  If the "jboss.remoting:service=Connector,transport=socket" Connector in conf/jboss-service.xml were configured to use the RMI tranport, then EJB2 calls would be transported by Java RMI.

Currently, the RMI transport uses org.jboss.invocation.unified.marshall.InvocationMarshaller to marshal invocations on the client side and org.jboss.invocation.unified.marshall.InvocationUnMarshaller to unmarshal invocations on the server side.  Their main function, other than serializing and deserializing the invocation, is to add and remove transaction context information:


  |    // From InvocationMarshaller:
  | 
  |    public Object addDecoration(Object dataObject) throws IOException {
  |         if(dataObject instanceof InvocationRequest)
  |         {
  |            InvocationRequest remoteInv = (InvocationRequest) dataObject;
  | 
  |            if(remoteInv.getParameter() instanceof Invocation)
  |            {
  |               Invocation inv = (Invocation) remoteInv.getParameter();
  | 
  |               MarshalledInvocation marshInv = new MarshalledInvocation(inv);
  | 
  |               if(inv != null)
  |               {
  |                  // now that have invocation object related to ejb invocations,
  |                  // need to get the possible known payload objects and make sure
  |                  // they get serialized.
  | 
  |                  try
  |                  {
  |                     marshInv.setTransactionPropagationContext(getTransactionPropagationContext());
  |                  }
  |                  catch(SystemException e)
  |                  {
  |                     log.error("Error setting transaction propagation context.", e);
  |                     throw new IOException("Error setting transaction context.  Message: " + e.getMessage());
  |                  }
  | 
  |                  // reset the invocation parameter within remote invocation
  |                  remoteInv.setParameter(marshInv);
  |               }
  |               else
  |               {
  |                  //Should never get here, but will check anyways
  |                  log.error("Attempting to marshall Invocation but is null.  Can not proceed.");
  |                  throw new IOException("Can not process data object due to the InvocationRequest's parameter being null.");
  |               }
  | 
  |            }
  |         }
  |         return dataObject;
  |     }
  | 

and


  |    // From InvocationUnMarshaller:
  | 
  |     public Object removeDecoration(Object obj) throws IOException
  |     {
  |         if(obj instanceof InvocationRequest)
  |         {
  |            InvocationRequest remoteInv = (InvocationRequest) obj;
  |            Object param = remoteInv.getParameter();
  | 
  |            if(param instanceof MarshalledInvocation)
  |            {
  |               MarshalledInvocation mi = (MarshalledInvocation) param;
  |               Object txCxt = mi.getTransactionPropagationContext();
  |               if(txCxt != null)
  |               {
  |                  TransactionPropagationContextImporter tpcImporter = TransactionPropagationContextUtil.getTPCImporter();
  |                  mi.setTransaction(tpcImporter.importTransactionPropagationContext(txCxt));
  |               }
  |            }
  |         }
  |         return obj;
  |     }
  | 

On the other hand, when the server returns a response, no marshalling is performed on the server side and no unmarshalling is performed on the client side: the response is passed directly to the RMI runtime.  The point of JBREM-167 is to change the RMI server invoker to use a configured marshaller and to change the RMI client invoker to use a configured unmarshaller.  This way, someone could interpose, for example, encrypting or compressing marshaller/unmarshallers, which is not currently possible.  

My questions:

1. Does anyone care about having this feature?

2. This change would mean that the InvocationMarshaller would be used on the server side when returning a response and InvocationUnMarshaller would be used on the client side to unmarshal the response. Would adding and removing transaction context in the server-to-client direction have any implications?

3. Since EJB3 handles transaction information in an interceptor and doesn't, by default, configure any marshaller or unmarshaller, am I right that this issue is irrelevant to EJB3?

Thanks,
Ron

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4135118#4135118

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4135118



More information about the jboss-dev-forums mailing list