[jboss-dev-forums] [Design of JBoss Remoting, Unified Invokers] - Re: Remoting 2: Servlet Invoker

ron.sigal@jboss.com do-not-reply at jboss.com
Sun Jan 11 05:05:15 EST 2009


Hi A,

This is an amazing coincidence.  I've just been working on JBPAPP-1274 "Fix JBoss Messaging and JBoss Remoting so that servlet transport can be used", for which I've been trying to get a single client to make EJB2, EJB3, and JBM invocations over the servlet transport.  I've got EJB3 and JBM working, and just a couple of hours ago I was working on an EJB2 invocation.  Unfortunately, the proxy is, for some reason, using the socket transport.

Anyway, as for the jar sizes, I just built a jboss-remoting.jar with jdk1.5.0_06  and jdk1.5.0_15 and got 1047846 and 1046394 bytes, respectively, so that's a possible explanation.  But there's something strange about your line numbers - they don't match what I see under https://svn.jboss.org/repos/jbossremoting/remoting2/tags/2.5.0.SP2.  Don't know what's going there.

Here's how the servlet transport works.  org.jboss.remoting.transport.servlet.web.ServerInvokerServlet gets the invocation and ServerInvokerServlet.processRequest() calls org.jboss.remoting.transport.servlet.ServletServerInvoker.processRequest(), where it's the latter method that isn't being found.  When ServerInvokerServlet is initialized, it gets either the ObjectName or the InvokerLocator of the ServletServerInvoker it's supposed to use.  In the latter case it gets a reference to the actual ServletServerInvoker, so I doubt you'd see an "Unable to find operation" exception in that case.  If ServerInvokerServlet gets an ObjectName, then it makes invocations on an MBean proxy, which is what I guess is happening.  So, the question is, what ObjectName are you initializing ServerInvokerServlet in your web.xml file?

Note that in Remoting 2.2.x, every ServletServerInvoker has the same ObjectName: "jboss.remoting:service=invoker,transport=servlet".  But in Remoting 2.4+, the ObjectNames for ServletServerInvokers are created by


  |    public String getMBeanObjectName()
  |    {
  |       InvokerLocator locator = getLocator();
  |       StringBuffer buffer =
  |          new StringBuffer("jboss.remoting:service=invoker,transport=" + locator.getProtocol());
  |       String host = locator.getHost();
  |       boolean isIPv6 = host.indexOf("[") >= 0 | host.indexOf(":") >= 0;
  |       
  |       buffer.append(",host=");
  |       if (isIPv6)
  |          buffer.append("\"");
  |       buffer.append(locator.getHost());
  |       if (isIPv6)
  |          buffer.append("\"");
  |       
  |       buffer.append(",port=").append(locator.getPort());
  |       Map param = locator.getParameters();
  |       if(param != null)
  |       {
  |          Iterator itr = param.keySet().iterator();
  |          while(itr.hasNext())
  |          {
  |             buffer.append(",");
  |             String key = (String) itr.next();
  |             String value = (String) param.get(key);
  |             buffer.append(key);
  |             buffer.append("=");
  |             buffer.append(value);
  |          }
  |       }
  | 
  |       return buffer.toString();
  |    }
  | 

So, for example, the ObjectName for the EJB2 servlet invoker I'm playing with right now is "jboss.remoting:dataType=invocation,host=127.0.0.1,marshaller=org.jboss.invocation.unified.marshall.InvocationMarshaller,port=8080,return-exception=true,service=invoker,transport=servlet,unmarshaller=org.jboss.invocation.unified.marshall.InvocationUnMarshaller".

Does that help?  By the way, I didn't even know there was a servlet test in the EJB3 test suite.  I'll take a look at that.  But not tonight.  :)

-Ron

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

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



More information about the jboss-dev-forums mailing list