Forcing servlet loading?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Forcing servlet loading?

Blumenthal, Uri - 0553 - MITLL

I have the following problem.

 

First, my configuration. My environment is comprised of:

1.      Somebody else’s specialized server that talks proprietary protocol and does weird things, and that is accessible over the network;

2.      My Tomcat server that houses my RESTful servlet edu.mit.WeirdQuery implemented in Jersey;

3.      Native C library that implements interface to that weird server.

 

My servlet (2) needs to talk to that remote server (1). The only way to do so is by invoking functions in that native library (2). I implemented the interface between (2) and (3) via JNI. At initialization the native library gets loaded, connection to the server (1) established, and from that point on my servlet (2) can process RESTful requests and interact with that weird server.

 

As I understand, currently Tomcat (and/or Jersey) would load my servlet when the first REST request arrives for it (and then my servlet would run @PostConstruct init() and do all those nifty things to get the connection up and running).

 

It all works, but there is a problem: for reasons I don’t want to delve into right now, I need to initialize my servlet (2) when the Tomcat comes up, rather than when the first REST request comes in, and Tomcat/Jersey load and initialize my servlet.

 

I tried to trick Tomcat into loading my servlet by adding the following to its web.xml file:

 

     <servlet>

                <servlet-name>my-servlet</servlet-name>

                <servlet-class>edu.mit.WeirdQuery</servlet-class>

                <load-on-startup>2</load-on-startup>

     </servlet>

 

to make Tomcat load it upon startup. The result was that the servlet and the server both froze. L

 

Yes, I know this server doesn’t display the best manners – but it’s not under my control, and I need to proxy RESTful requests for it.

 

Would appreciate any advice.

 

Thanks!

-- 

Regards,

Uri Blumenthal

 

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Forcing servlet loading?

Pavel Bucek-2

Hi Uri,

it's not possible to assess this issue without having some more information about the server itself.

Was there any log produced? Is the JVM still running? Can you do jstack <pid>?

Also, how is your edu.mit.WeirdQuery servlet using Jersey? Why don't you use org.glassfish.jersey.servlet.ServletContainer?

(I mean something like:

<servlet>
    <servlet-name>testServlet1</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.glassfish.jersey.tests.integration.servlet_25_init_1.Servlet25init1</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>testServlet1</servlet-name>
    <url-pattern>/servlet_path/*</url-pattern>
</servlet-mapping>
)

Ah, you most likely do the JNI stuff there somehow and then extending or wrapping Jersey Servlet (is that correct?). Anyway, it could be implemented in a class managed by Jersey, but that shouldn't really matter.

Regards,
Pavel


On 14/09/16 16:04, Blumenthal, Uri - 0553 - MITLL wrote:

I have the following problem.

 

First, my configuration. My environment is comprised of:

1.      Somebody else’s specialized server that talks proprietary protocol and does weird things, and that is accessible over the network;

2.      My Tomcat server that houses my RESTful servlet edu.mit.WeirdQuery implemented in Jersey;

3.      Native C library that implements interface to that weird server.

 

My servlet (2) needs to talk to that remote server (1). The only way to do so is by invoking functions in that native library (2). I implemented the interface between (2) and (3) via JNI. At initialization the native library gets loaded, connection to the server (1) established, and from that point on my servlet (2) can process RESTful requests and interact with that weird server.

 

As I understand, currently Tomcat (and/or Jersey) would load my servlet when the first REST request arrives for it (and then my servlet would run @PostConstruct init() and do all those nifty things to get the connection up and running).

 

It all works, but there is a problem: for reasons I don’t want to delve into right now, I need to initialize my servlet (2) when the Tomcat comes up, rather than when the first REST request comes in, and Tomcat/Jersey load and initialize my servlet.

 

I tried to trick Tomcat into loading my servlet by adding the following to its web.xml file:

 

     <servlet>

                <servlet-name>my-servlet</servlet-name>

                <servlet-class>edu.mit.WeirdQuery</servlet-class>

                <load-on-startup>2</load-on-startup>

     </servlet>

 

to make Tomcat load it upon startup. The result was that the servlet and the server both froze. L

 

Yes, I know this server doesn’t display the best manners – but it’s not under my control, and I need to proxy RESTful requests for it.

 

Would appreciate any advice.

 

Thanks!

-- 

Regards,

Uri Blumenthal

 


Loading...