Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java web service without a web application server

We have a message processing server, which

  • start a few threads
  • processing the message
  • interact with the database etc.....

now the client want to have a web service server on the server, they will be able to querying the message processing server, with a web service client. e.g. give me all the messages for today, or delete the message with id....

the problem are:

  • The server just a standard j2se application, doesn't run inside application server, like tomcat or glassfish.
  • To handle a Http request, do I need to implement a http server?
  • I would like to use the nice j2ee annotation such as @webservice, @webmothod etc... is there any library or framework I can use
like image 589
Junchen Liu Avatar asked Oct 12 '12 13:10

Junchen Liu


People also ask

Does Tomcat need a web server?

Tomcat is a web server of its own, so a separate web server like Apache is not required. You probably will want to change Tomcat's port though, since it defaults to 8080 and web sites are usually on port 80.

Does spring need Application Server?

One of the most popular uses is as a web server, using one of the many supported embedded servlet containers and template engines. However, Spring Boot has a number of uses that do not require a web server: console applications, job scheduling, batch or stream processing, serverless applications, and more.

Can spring boot run without Tomcat?

You can use Spring Boot without embedded Tomcat web server if you don't need it. Just exclude embedded Tomcat from Spring Boot Web Starter (spring-boot-starter-web).


1 Answers

You don't need a third party library to use jax-ws annotations. J2SE ships with jax-ws, so all the annotations are still available to you. You can achieve lightweight results with the following solution, but for anything optimized/multi-threaded, it's on your own head to implement:

  1. Design a SEI, service endpoint interface, which is basically a java interface with web-service annotations. This is not mandatory, it's just a point of good design from basic OOP.

    import javax.jws.WebService;
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.soap.SOAPBinding;
    import javax.jws.soap.SOAPBinding.Style;
    
    @WebService
    @SOAPBinding(style = Style.RPC) //this annotation stipulates the style of your ws, document or rpc based. rpc is more straightforward and simpler. And old.
    public interface MyService{
    @WebMethod String getString();
    
    }
    
  2. Implement the SEI in a java class called a SIB service implementation bean.

    @WebService(endpointInterface = "com.yours.wsinterface") //this binds the SEI to the SIB
    public class MyServiceImpl implements MyService {
    public String getResult() { return "result"; }
     }
    
  3. Expose the service using an Endpoint import javax.xml.ws.Endpoint;

    public class MyServiceEndpoint{
    
    public static void main(String[] params){
      Endpoint endPoint =  EndPoint.create(new MyServiceImpl());
      endPoint.publish("http://localhost:9001/myService"); //supply your desired url to the publish method to actually expose the service.
       }
    }
    

The snippets above, like I said, are pretty basic, and will perform poorly in production. You'll need to work out a threading model for requests. The endpoint API accepts an instance of Executor to support concurrent requests. Threading's not really my thing, so I'm unable to give you pointers.

like image 118
kolossus Avatar answered Oct 04 '22 23:10

kolossus