JAX-WS and JAX-RS service class instantiation - java

Is it specified somewhere in these API
whether an instance of a MyService class is used
to serve many requests or a different instance is created on a per request basis ?
By what I've experimented It looks like that:
Frameworks implementing JAX-WS, instantate a new instance for
each SOAP request.
Meanwhile frameworks implementing JAX-RS, use the same instance to
serve different requests.
Also, in some cases I guess it is important to know whether a framework is allowed to
unload a service class to free space, does these specifications say something about that ?
thanks.

Related

Using webservices with javax.ws or javax.jws

I'm starting to choose a way to create my webservice, so i found 2 ways to do it:
1) Using the package javax.jws, with annotation #WebService:
#WebService(...)
public class MyServiceImpl {
2) The other way is using javax.ws, with annotation #Path:
#Path("/MyService")
public class MyServiceImpl
In my understand using the second solution is more simple, because when i need to create the Client i just need make a HTTP call (GET/POST). Using the first solution i need create a WSDL client, more complex solution.
So, I would like to know which is the advantage in use FIRST SOLUTION.
The SOAP/WSDL style is useful when a formal contract must be established to describe the interface that the web service offers.The Web Services Description Language (WSDL) describes the details such as messages, operations, bindings, and location of the web service.
Also the SOAP/WSDL style is useful when the application architecture needs to handle asynchronous processing and invocation (e.g. using JAX-WS the assynchronous clients can be created).
The disadvantages of SOAP/WSDL style are
its complexity: tools are required to create a client
heavier on Bandwidth : SOAP requires a heavy XML wrapper arround each request or response
complicated security rules
The advantages of REST style are
simplicity: REST client can be accessed from any browser (however, this is only true for GET method. Data creation request requires also the XML wrapper).
lighter on Bandwidth : data on the wire are usually bare xml elements (not wrapped within the <Envelope><Body> tags).
REST application security rules can be setup using the http standards: the administrator (or firewall) can discern the intent of each message by analyzing the HTTP command used in the request.
For example, a GET request can always be considered safe because it can't, by definition, modify any data.
The disadvantage of REST style is that it still doesn't cover all business requirements
There is no common standard accepted yet for the formal REST service description
REST requests (especially GET method) are not suitable for large amount of data
REST doesn't cover all web services standards, like Transactions, Security, Addressing, Trust, Coordination,

Cloud foundry service broker - implementing REST endpoints

I have a general question on a topic I am starting to learn, but having difficulty imagining the specific implementations for.
I want to implement a service broker for Cloud Foundry. The service broker API is as follows:
http://docs.cloudfoundry.org/services/api.html
I'm new to web programming. I have worked with web applications where I publish html files which reference servlets. But I'm not sure how one goes about implementing, for example:
Route
GET /v2/catalog
I was wondering if someone could give a high level rundown of what is involved in doing this. How do I implement a "path" like this? Let's say I wrote a servlet which hangs around at site.com/Servlet. The service broker will call site.com/Servlet/v2/catalog. How would my Servlet understand this? Would this URI even direct to my Servlet as written? I'm using Liberty (Websphere), but any answer would be useful.
I suggest using the Spring framework - website at https://spring.io/. It might take a bit of learning to understand what Spring is (it has many components that do different things), but Spring provides tools to make writing REST APIs very easy. Spring is well documented, has tons of users, and is quite modern.
For a REST API in Spring, you'd define a "Controller" class that controls incoming HTTP calls to the port you program is listening on.
For your concerns about how your programs understands a GET call to a particular endpoint - Spring provides the #RequestMapping annotation to do exactly this task. Within a class you've annotated with #Controller, you will have the #RequestMapping annotation over a method like this:
#Controller
public class CloudFoundryController {
...
#RequestMapping(value = {"/servlet/v2/catalog"}, method = RequestMethod.GET
public HttpResponse getV2Catalogue() {
...
}
}
When this application detects an HTTP GET request with "/servlet/v2/catalog" as the URL endpoint, then Spring will ensure that the getV2Catalogue() method is called. When the method returns, Spring sends back, over the network, an object of whatever type you've defined in the method header as an http response.
Building a REST service with Spring: https://spring.io/guides/gs/rest-service/

RestEasy: Handling concurrent requests

I need to know the details how rest easy with jBoss handles multiple concurrent request for a webservice. For example I have made a webservice, which downloads a particular file. I need to check how the system will behave if say 100 or more people hit the service at the same time.
Is Resteasy framework handling own its own in multithreading or that needs to handled at our end. Or will the server handle it?
RestEasy is an implementation of the JAX-RS specification. According to JAX-RS for every new HTTP Request a new Rest Resource class is by default constructed (exceptions are e.g when you are inside other frameworks like Spring, which is very unlikely). Given that said, you are guaranteed that your code (actually state) in Rest Resources is thread-safe. But if you have some other code deeper, like something stored in your HTTP session, or some services that are used in your Rest Resources (directly or indirectly), then it is your task to make it thread-safe.

What is a proxy class in a Web Service world?

I am reading Professional XML
By: Bill Evjen; Kent Sharkey; Thiru Thangarathinam; Michael Kay; Alessandro Vernet; Sam Ferguson
Chapter SOAP & WSDl focusses on,
After you have found the service you want to consume, the act of discovery should bring you to the location of the Web service's WSDL file. The WSDL file is an XML description of the Web service's interface. After you have found the WSDL file of the Web service, you can create a proxy class (or your environment automatically creates one for you) that enables you to send messages back and forth to the Web service.
What is the proxy class in para above means and by whom it gets instantiated?
Is the Web Method which I wish to invoke through the SOAP constructed message format is also a method of the object of the proxy class?
The WSDL file is the technical contract which defines the communication interface with a service.
The "proxy class" in your citation, is just the logical representation of the service in your program. You can do this class by yourself, or have it made automatically. Most IDEs out there allow you to import a WSDL and they will generate most of the code needed to communicate with the service. The import tool will most likely create classes with methods and variables that correspond directly to operations and types in the WSDL file.
Your application instantiates the class and you call the methods you need to call by just filling the data as parameters and receiving the response in return. The class handles Object to SOAP message conversion for you. Keep in mind that even though it looks very similar to local function call, it is not - it is not nearly as fast and it involves network communication risks. It is quite possible to have communication errors that you need to handle.

JAXWS caching in JSF

We have an application server that exposes a host of webservices. We are running a tomcat on the side that uses those webservices in JSF applications to provide a user interface. Suppose we have a bean that has a method "getWebservice()" that returns the proxy class used by jaxws to communicate with the webservice. This allows us to interact with the webservice with minimal effort: generate using wsimport, then use #{myBean.webservice.myProperty} etc
However as you can see this would require a lot of webservice interaction when reusing exposed methods. In our usecase most methods are rather static, at least for the duration of a #RequestScoped bean so the interaction of most methods should be cached once it is called (at least for one request).
Currently our setup is to create wrapper services in the bean and each wrapper does exactly the same thing:
if (methodResponse == null)
methodResponse = getWebservice().getMethod();
return methodResponse;
You can see that this gets very tiresome very quickly. Is there a way to annotate a jaxws method for caching? Or can I generate my own proxy class based on the interface and somehow "chain" it to the proxy used by jaxws (and perform generic caching) or can I create my own annotation that performs the caching?
You can create another caching Proxy around your web service client proxy object, and provide it with an InvocationHandler, that caches the result of method invocations.
Check out this blog post to see the complete step-by-step instruction and download sample code.

Categories

Resources