CXF WS-Discovery Example

CXF WS-Discovery Example explain about configuring WS-Discovery service with Apache CXF.
Web Services Dynamic Discovery (WS-Discovery) is a protocol, which enable dynamic discovery of services available on the local network. By default, WS-Discovery uses a UDP based multicast transport to announce new services
Apache CXF is a free and open source project, and a fully featured Webservice framework. It helps you building webservices using different front-end API's, like as JAX-RS and JAX-WS.
WS-Discovery is available from Apache CXF 2.7.x onwards.
Reference-> http://cxf.apache.org/docs/ws-discovery.htm
Required Libraries
You need to download
Following jar must be in ClassPath
- asm-3.3.1.jar
- commons-logging-1.1.1.jar
- cxf-2.7.12.jar
- cxf-services-ws-discovery-api-2.7.12.jar
- cxf-services-ws-discovery-service-2.7.12.jar
- httpasyncclient-4.0-beta3.jar
- httpclient-4.2.5.jar
- httpcore-4.2.4.jar
- httpcore-nio-4.2.4.jar
- jetty-continuation-8.1.15.v20140411.jar
- jetty-http-8.1.15.v20140411.jar
- jetty-io-8.1.15.v20140411.jar
- jetty-server-8.1.15.v20140411.jar
- jetty-util-8.1.15.v20140411.jar
- mina-core-2.0.7.jar
- neethi-3.0.3.jar
- slf4j-api-1.7.7.jar
- slf4j-jdk14-1.7.7.jar
- stax2-api-3.1.4.jar
- woodstox-core-asl-4.4.0.jar
- wsdl4j-1.6.3.jar
- xml-resolver-1.2.jar
- xmlschema-core-2.1.0.jar
CXF WS-Discovery Example
I am creating a sample web service project that pass Student object and return with some changes on that object. The service is using simple POJO (Plain Old Java Object) bean.
Firstly create a Dynamic Web Project (File->New->Dynamic Web Project) named "CXFTutorial" according to following screenshot
Create a Student Object
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Create a Service Interface
This service interface will defines which methods of web service, to be invoked by the client
import javax.jws.WebService;
@WebService
public interface ChangeStudentDetails {
Student changeName(Student student);
}
Implement the Service Interface
Here we implement the service interface created on the previous step
import javax.jws.WebService;
@WebService(endpointInterface = "com.student.ChangeStudentDetails")
public class ChangeStudentDetailsImpl implements ChangeStudentDetails {
public Student changeName(Student student) {
student.setName("Hello "+student.getName());
return student;
}
}
Create a SimpleCXFNonSpringServlet
Here we are using SimpleCXFNonSpringServlet class in order to add service implementation class(ChangeStudentDetailsImpl)
We are not hard coding the port for deploying the service, but using random port. Deployment is done dynamically using CXF WS-Discovery service, so port may change on each deployment.
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import javax.servlet.ServletConfig;
import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
public class SimpleCXFNonSpringServlet extends CXFNonSpringServlet {
private static final long serialVersionUID = 1L;
@Override
public void loadBus(ServletConfig servletConfig) {
super.loadBus(servletConfig);
Bus bus = getBus();
BusFactory.setDefaultBus(bus);
try {
ServerSocket sock = new ServerSocket();
InetSocketAddress s = new InetSocketAddress(InetAddress.getLocalHost(), 0);
sock.bind(s);
int port = sock.getLocalPort();
sock.close();
String address = "http://localhost:" + port + "/ChangeStudent";
System.out.println("Publishing on " + address);
Endpoint.publish(address, new ChangeStudentDetailsImpl());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
web.xml
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet> <display-name>SimpleCXFNonSpringServlet</display-name> <servlet-name>SimpleCXFNonSpringServlet</servlet-name> <servlet-class>com.student.SimpleCXFNonSpringServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SimpleCXFNonSpringServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
Publishing CXF Web Service