Uploaded image for project: 'Nuxeo Platform'
  1. Nuxeo Platform
  2. NXP-3630

Nuxeo Java Remote APIs could not be used from a webapp deployed in JBoss

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Blocker
    • Resolution: Duplicate
    • Affects Version/s: 5.2 M4
    • Fix Version/s: 5.4.2
    • Component/s: Runtime

      Description

      The following email thread with Subject: "[Nuxeo-dev] using Nuxeo Java remote APIs" describes the issue and resolution. Let me know if you need more details.

      Sanjay Dalal wrote, On 5/12/2009 12:57 PM:
      > Hi all,
      >
      > Found one bug in JBossServiceLocator.java of nuxeo-runtime APIs.
      >
      > public static String getDefaultSuffix()

      { > return System.getProperty("jboss.home.dir") == null ? "/remote" : "/local"; // if not in jboss return "/remote" > }

      >
      > The above check clearly indicates that it is impossible to use Remote APIs from a client that is also running in another instance of JBoss. It explains why a standalone Java client from command line interface works and the same code fails if run from a war deployed in another JBoss instance.
      >
      > Secondly, you may want to use something as follows to check for system properties.
      >
      > Boolean.getBoolean("org.nuxeo.client.remote") ? "/remote" : "/local";
      >
      > This will make sure you get the right result even if the property is not set or is not true. 2c.
      >
      > Now on to the next bug/problem...
      >
      > sanjay
      >
      >
      >
      > Sanjay Dalal wrote, On 5/11/2009 2:15 PM:
      >> Hi Tiry/Bogdan/all,
      >>
      >> Considering various classloading issues we faced while running Nuxeo and CollectionSpace (client of Nuxeo repository) in the same JBoss server instance, we are now trying to run these in two separate instances: one hosting Nuxeo and the other hosting CollectionSpace. CollectionSpace is deployed as a war. It deploys Nuxeo jars using OSGI and connects to another server running Nuxeo. We use ports-01 configuration of JBoss to run CollectionSpace server and ports-default configuration for the Nuxeo server.
      >>
      >> While we can successfully run a standalone Nuxeo client from command line following Bogdan's instructions (README.txt of nuxeo-core-client), a war client (collectionspace) implemented similarly fails. The attached zip file has two log files.
      >>
      >> 1. java_client.log shows the log from standalone client (attaching for comparison)
      >> 2. short_server.log shows the log from a CS war client
      >>
      >> I have added some System.outs in nuxeo-core-client code with prefix ">>>" for debug purposes.
      >>
      >> It appears that schemaRemotingWorkaround method of NuxeoClient.java fails (see log) with the following exception while invoked from a war.
      >>
      >> 2009-05-11 12:34:54,922 ERROR [STDERR] javax.ejb.EJBException: Invalid (i.e. remote) invocation of local interface (null container)
      >> 2009-05-11 12:34:54,922 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:80)
      >> 2009-05-11 12:34:54,922 ERROR [STDERR] at $Proxy103.getDocumentTypes(Unknown Source)
      >> 2009-05-11 12:34:54,922 ERROR [STDERR] at org.nuxeo.ecm.core.schema.SchemaManagerImpl.importTypes(SchemaManagerImpl.java:101)
      >>
      >> I would think that both the clients use exactly the same nuxeo configuration properties but I might be wrong. Just to be sure, I explicitly set the following properties in both the clients.
      >>
      >> System.setProperty("org.nuxeo.runtime.server.enabled", Boolean.FALSE.toString());
      >> System.setProperty("org.nuxeo.runtime.server.port", "62474");
      >> System.setProperty("org.nuxeo.runtime.server.host", "127.0.0.1");
      >> System.setProperty("org.nuxeo.runtime.1.3.3.streaming.port", "3233");
      >> System.setProperty("org.nuxeo.runtime.streaming.serverLocator", "socket://127.0.0.1:3233");
      >> System.setProperty("org.nuxeo.runtime.streaming.isServer", Boolean.FALSE.toString());
      >>
      >> If I comment out the schemaRemotingWorkaround call, the client successfully completes login. Then it fails with a similar exception while calling openRepository method of the NuxeoClient.
      >>
      >> Looking forward...
      >> thanks,
      >> sanjay
      >>
      >>
      >>
      >>
      >> Tiry wrote, On 4/24/2009 3:42 AM:
      >>> Hi,
      >>>
      >>> This is probably a classloader issue.
      >>> Your war client and nuxeo are in the same JVM and share a parent classloader that is used for jboss-remoting.
      >>> You can try to force call-by-value isolation in Jboss to see if this make it work better.
      >>>
      >>> Tiry
      >>>
      >>> Sanjay Dalal a écrit :
      >>>> Hi Tiry,
      >>>>
      >>>> Thank you. That got me past that hurdle. Seems like some properties were not loaded from the classpath, so currently I set those from my Java code. However, now, I see a ClassCastException for DocumentType (see below). If I comment out schemaRemotingWorkaround (attached NuxeoClient.java), it makes the connection but then I get the same exception while trying to getDefaultRepository down the road. I have packaged the war with all the libs that Bogdan has mentioned in his README (see at the bottom of this email). I think I have made sure that I am packaging the same jars in the war that are also used on the server side of Nuxeo. Do I have to set some classloader specific properties? For example in nxserver.cmd of webengine-server, I see the following two properties.
      >>>>
      >>>> -Djava.rmi.server.RMIClassLoaderSpi=org.nuxeo.runtime.launcher.NuxeoRMIClassLoader -Dsun.lang.ClassLoader.allowArraySyntax=true
      >>>>
      >>>> Looking forward...
      >>>> thanks,
      >>>> sanjay
      >>>>
      >>>> 17:01:55,790 ERROR [STDERR] java.lang.ClassCastException: [Lorg.nuxeo.ecm.core.s
      >>>> chema.DocumentType; cannot be cast to [Lorg.nuxeo.ecm.core.schema.DocumentType;
      >>>> 17:01:55,790 ERROR [STDERR] at $Proxy498.getDocumentTypes(Unknown Source)
      >>>> 17:01:55,790 ERROR [STDERR] at org.nuxeo.ecm.core.schema.SchemaManagerImpl.i
      >>>> mportTypes(SchemaManagerImpl.java:101)
      >>>> 17:01:55,790 ERROR [STDERR] at org.collectionspace.services.nuxeo.NuxeoClien
      >>>> t.schemaRemotingWorkaround(NuxeoClient.java:222)
      >>>> 17:01:55,790 ERROR [STDERR] at org.collectionspace.services.nuxeo.NuxeoClien
      >>>> t.doConnect(NuxeoClient.java:174)
      >>>> 17:01:55,790 ERROR [STDERR] at org.collectionspace.services.nuxeo.NuxeoClien
      >>>> t.tryConnect(NuxeoClient.java:135)
      >>>> 17:01:55,790 ERROR [STDERR] at org.collectionspace.hello.services.Multischem
      >>>> aResource.getRepository(MultischemaResource.java:263)
      >>>> 17:01:55,790 ERROR [STDERR] at org.collectionspace.hello.services.Multischem
      >>>> aResource.createPerson(MultischemaResource.java:72)
      >>>> 17:01:55,790 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(
      >>>> Native Method)
      >>>> 17:01:55,790 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(N
      >>>> ativeMethodAccessorImpl.java:39)
      >>>> 17:01:55,790 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invo
      >>>> ke(DelegatingMethodAccessorImpl.java:25)
      >>>> 17:01:55,790 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:5
      >>>> 97)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.core.MethodInjectorImpl.in
      >>>> voke(MethodInjectorImpl.java:117)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.core.ResourceMethod.invoke
      >>>> OnTarget(ResourceMethod.java:260)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.core.ResourceMethod.invoke
      >>>> (ResourceMethod.java:232)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.core.ResourceMethod.invoke
      >>>> (ResourceMethod.java:166)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.core.DispatcherUtilities.g
      >>>> etJaxrsResponse(DispatcherUtilities.java:142)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.core.SynchronousDispatcher
      >>>> .invoke(SynchronousDispatcher.java:356)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.core.SynchronousDispatcher
      >>>> .invoke(SynchronousDispatcher.java:173)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.plugins.server.servlet.Htt
      >>>> pServletDispatcher.service(HttpServletDispatcher.java:93)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.resteasy.plugins.server.servlet.Htt
      >>>> pServletDispatcher.service(HttpServletDispatcher.java:68)
      >>>> 17:01:55,790 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpSe
      >>>> rvlet.java:803)
      >>>> 17:01:55,790 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterCha
      >>>> in.internalDoFilter(ApplicationFilterChain.java:290)
      >>>> 17:01:55,790 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterCha
      >>>> in.doFilter(ApplicationFilterChain.java:206)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilte
      >>>> r.doFilter(ReplyHeaderFilter.java:96)
      >>>> 17:01:55,790 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterCha
      >>>> in.internalDoFilter(ApplicationFilterChain.java:235)
      >>>> 17:01:55,790 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterCha
      >>>> in.doFilter(ApplicationFilterChain.java:206)
      >>>> 17:01:55,790 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve
      >>>> .invoke(StandardWrapperValve.java:230)
      >>>> 17:01:55,790 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve
      >>>> .invoke(StandardContextValve.java:175)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssocia
      >>>> tionValve.invoke(SecurityAssociationValve.java:182)
      >>>> 17:01:55,790 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValv
      >>>> e.invoke(JaccContextValve.java:84)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.in
      >>>> voke(StandardHostValve.java:127)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.i
      >>>> nvoke(ErrorReportValve.java:102)
      >>>> 17:01:55,805 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnec
      >>>> tionValve.invoke(CachedConnectionValve.java:157)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.catalina.valves.AccessLogValve.inv
      >>>> oke(AccessLogValve.java:562)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.
      >>>> invoke(StandardEngineValve.java:109)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.s
      >>>> ervice(CoyoteAdapter.java:262)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.proc
      >>>> ess(Http11Processor.java:844)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http1
      >>>> 1ConnectionHandler.process(Http11Protocol.java:583)
      >>>> 17:01:55,805 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker
      >>>> .run(JIoEndpoint.java:446)
      >>>> 17:01:55,805 ERROR [STDERR] at java.lang.Thread.run(Thread.java:619)
      >>>> 17:01:55,805 ERROR [STDERR] 57954 [http-127.0.0.1-8080-1] ERROR org.jboss.restea
      >>>> sy.core.SynchronousDispatcher - failed to execute
      >>>>
      >>>> Tiry wrote, On 4/23/2009 3:57 PM:
      >>>>> Hi,
      >>>>>
      >>>>> Looks like you are starting 2 remoting servers on the same IP.
      >>>>> Changing org.nuxeo.runtime.server.enabled property in your client packaging should disable this.
      >>>>> (=> only Nuxeo server should start the remoting server)
      >>>>>
      >>>>> This shouls fix the first error, and may be the other too (Remoting service not found because activation failed because of the SocketAlreadyInUse error).
      >>>>>
      >>>>> PS : I still don't understand what you say about Rest API, but probably I we did not understood ...
      >>>>>
      >>>>> Tiry
      >>>>>
      >>>>>
      >>>>> Sanjay Dalal a écrit :
      >>>>>> Hi,
      >>>>>>
      >>>>>> I had sent this to the main list. Now sending to dev list per Florent's request. Looking forward
      >>>>>>
      >>>>>> thanks,
      >>>>>> sanjay
      >>>>>>
      >>>>>> -------- Original Message --------
      >>>>>> Subject: Re: [Ecm] looking for restful api sample for create and update
      >>>>>> Date: Tue, 21 Apr 2009 10:59:01 -0700
      >>>>>> From: Sanjay Dalal <sanjay.dalal@berkeley.edu>
      >>>>>> To: Bogdan Stefanescu <bstefanescu@nuxeo.com>
      >>>>>> CC: ECM List <ecm@lists.nuxeo.com>
      >>>>>> References: <49C7EDEA.4040007@berkeley.edu> <D38FC5AF-0BB1-4530-8E88-48C39B2F7D40@nuxeo.com> <49EDFDDF.9020001@berkeley.edu>
      >>>>>>
      >>>>>>
      >>>>>>
      >>>>>> Sending again with zipped server log. Thanks in advance.
      >>>>>>
      >>>>>> sanjay
      >>>>>>
      >>>>>> Sanjay Dalal wrote, On 4/21/2009 10:09 AM:
      >>>>>> > Hi Bogdan,
      >>>>>> >
      >>>>>> > At CollectionSpace, we just delivered 0.1 milestone that has web > services that use Nuxeo's RESTful APIs. So, I thought of trying once > again the remote Java API route as Nuxeo's RESTful APIs seem to offer > very minimal functionality as per our needs. I followed your > instructions from README (see email trail below). Note that, I am > trying to connect to Nuxeo repository that is available in the same > JVM where my war (helloworld.war) using the Nuxeo remote APIs (as per > your instructions below) is also deployed. I get JVM_bind exception. I > am attaching the server log for your inspection. You can start > tracking from line #21052. You can also go back in server.log if you > want to check how Nuxeo is deployed. Let me know what am I missing and > which port should I use if port#62474 is not correct. Looking forward > to hear from you.
      >>>>>> >
      >>>>>> > thanks,
      >>>>>> > sanjay
      >>>>>> >
      >>>>>> > 2009-04-20 16:48:18,344 DEBUG > [org.nuxeo.runtime.model.ComponentManager] Dispatching event: > ACTIVATING_COMPONENT: service:org.nuxeo.runtime.remoting.RemotingService
      >>>>>> >
      >>>>>> > 2009-04-20 16:48:18,453 DEBUG [org.jboss.remoting.ServerInvoker] > SocketServerInvoker[UNINITIALIZED] did not find server socket factory > configuration as mbean service or classname. Creating default server > socket factory.
      >>>>>> >
      >>>>>> > 2009-04-20 16:48:18,453 DEBUG [org.jboss.remoting.ServerInvoker] > SocketServerInvoker[UNINITIALIZED] created server socket factory > javax.net.DefaultServerSocketFactory@13acc52
      >>>>>> >
      >>>>>> > 2009-04-20 16:48:18,453 DEBUG [org.jboss.remoting.ServerInvoker] > SocketServerInvoker[UNINITIALIZED] added > org.nuxeo.runtime.remoting.transporter.TransporterHandler@1cf9df7 for > subsystem 'org.nuxeo.runtime.remoting.Server'
      >>>>>> >
      >>>>>> > 2009-04-20 16:48:18,453 DEBUG > [org.jboss.remoting.transport.socket.SocketServerInvoker] > SocketServerInvoker[UNINITIALIZED] starting
      >>>>>> >
      >>>>>> > 2009-04-20 16:48:18,453 ERROR > [org.jboss.remoting.transport.socket.SocketServerInvoker] Error > starting ServerSocket. Bind port: 62474, bind address: /127.0.0.1
      >>>>>> >
      >>>>>> > 2009-04-20 16:48:18,453 ERROR [org.jboss.remoting.transport.Connector] > Error starting connector.
      >>>>>> >
      >>>>>> >
      >>>>>> > Here is the snippet of the code (derived from your client sample). I > have copied the jars you listed in README to > $JBOSS_HOME/server/default/cs/lib directory. All the jars you have > listed are also packaged with the war.
      >>>>>> >
      >>>>>> > From my MultischemaResource.java (deployed under helloworld.war)...
      >>>>>> >
      >>>>>> > synchronized private RepositoryInstance getRepository() throws > Exception {
      >>>>>> > if(repo != null)

      { >>>>>> > return repo; >>>>>> > }

      >>>>>> > Collection<File> files = null;
      >>>>>> > String bundles = > "./cs/lib/nuxeo-runtime-:./cs/lib/nuxeo-";//System.getProperty("nuxeo.bundles"); >
      >>>>>> > if(bundles != null)

      { >>>>>> > files = NuxeoApp.getBundleFiles(new File("."), bundles, ":"); >>>>>> > }

      >>>>>> > NuxeoApp app = new NuxeoApp();
      >>>>>> > app.start();
      >>>>>> > verbose("getRepository: deploying bundles: " + files);
      >>>>>> > if(files != null)

      { >>>>>> > app.deployBundles(files); >>>>>> > }

      >>>>>> >
      >>>>>> > nxClient = NuxeoClient.getInstance();
      >>>>>> > nxClient.tryConnect(CS_NUXEO_HOST, 62474);
      >>>>>> > repo = nxClient.openRepository();
      >>>>>> > verbose("getRepository: repository root: " + > repo.getRootDocument());
      >>>>>> > return repo;
      >>>>>> > }
      >>>>>> >
      >>>>>> >
      >>>>>> >
      >>>>>> > Bogdan Stefanescu wrote, On 3/23/2009 4:46 PM:
      >>>>>> >>
      >>>>>> >>
      >>>>>> >> Hi,
      >>>>>> >>
      >>>>>> >> I just commited a sample o how to start a nuxeo client application >> and connect to a remote server.
      >>>>>> >> See nuxeo-core-client project. Read this for how to run the sample: >> nuxeo-core-client/src/main/java/org/nuxeo/ecm/core/client/sample/README.txt >>
      >>>>>> >>
      >>>>>> >> Bogdan
      >>>>>> >>
      >>>>>> >>
      >>>>>> >> On Mar 23, 2009, at 9:15 PM, Sanjay Dalal wrote:
      >>>>>> >>
      >>>>>> >>> Hi,
      >>>>>> >>>
      >>>>>> >>> Due to classloading problems described in thread, "using Nuxeo Java >>> APIs ", I have temporarily moved to using the RESTful apis (I will >>> get back to Java APIs soon).
      >>>>>> >>>
      >>>>>> >>> I am following the documentation at >>> http://doc.nuxeo.org/5.2/books/nuxeo-book/html-single/#d1801e6206 to >>> write my client. While I can browse the repository by calling the >>> Browse APIs, I am looking for URL and parameter mappings for CREATE >>> (or POST) and UPDATE (or PUT) operations on a document. I can see >>> corresponding Restlets in the source tree, however, I cannot find >>> any documentation at >>> http://doc.nuxeo.org/5.2/books/nuxeo-book/html-single/#d1801e6206. >>> Needless to say that with some effort, I can determine the URL and >>> the parameter mappings from the source code, but APIs should have >>> been documented unless Nuxeo does not support these operations using >>> RESTful APIs in 5.2. Let me know.
      >>>>>> >>>
      >>>>>> >>> Second question, the pattern |"/

      {repo}

      /

      {docid}

      /

      {filename}

      /

      {verb}

      " >>> does not seem to follow "RESTful" URI pattern. Thoughts?|
      >>>>>> >>>
      >>>>>> >>> thanks,
      >>>>>> >>> sanjay
      >>>>>> >>> _______________________________________________
      >>>>>> >>> ECM mailing list
      >>>>>> >>> ECM@lists.nuxeo.com <ECM@lists.nuxeo.com>
      >>>>>> >>> http://lists.nuxeo.com/mailman/listinfo/ecm
      >>>>>> >>> To unsubscribe, go to http://lists.nuxeo.com/mailman/options/ecm
      >>>>>> >>
      >>>>>>
      >>>>>> ------------------------------------------------------------------------
      >>>>>>
      >>>>>> _______________________________________________
      >>>>>> Nuxeo-dev mailing list
      >>>>>> Nuxeo-dev@lists.nuxeo.com
      >>>>>> http://lists.nuxeo.com/mailman/listinfo/nuxeo-dev
      >>>>>
      >>>

        Attachments

          Issue Links

            Activity

              People

              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: