In this article we will learn how to create a simple clustered HTTP application using WildFly bootable jar option
That being said, in order to provision a bootable WildFly instance with HTTP Clustering we need the web-server and web-clustering layer in our wildfly-jar-maven-plugin configuration:
<build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-jar-maven-plugin</artifactId> <version>2.0.0.Final</version> <configuration> <feature-pack-location>[email protected](org.jboss.universe:community-universe)#${version.wildfly}</feature-pack-location> <layers> <layer>web-server</layer> <layer>web-clustering</layer> </layers> <excluded-layers> <layer>deployment-scanner</layer> </excluded-layers> </configuration> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Please notice that the web-clustering layer does not include mod_cluster but uses Infinispan and jgroups to make up the cluster. Therefore, putting a mod_cluster front-end in the picture won’t enable discover of servers.
That being said, we will create a minimal Servlet application which simply stores a counter in the session, so that we can check if the HTTP Session is working:
@WebServlet(urlPatterns = {"/"}) public class DemoServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Integer count = 1; HttpSession session = request.getSession(false); if (session == null) { session = request.getSession(); out.println("Session created: "+session.getId()); session.setAttribute( "counter", count ); } else { out.println("Welcome Back!"); count = (Integer) session.getAttribute( "counter" ); ++count; session.setAttribute( "counter", count ); } out.println("<br>Counter " + count); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
Also, enable in web.xml the application to be distributable:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <distributable/> </web-app>
You can build you application with:
mvn package
Now open two shells and start two instances of the application server:
$ java -jar target/cluster-demo-bootable.jar -Djboss.node.name=node1 $ java -jar target/cluster-demo-bootable.jar -Djboss.node.name=node2 -Djboss.socket.binding.port-offset=100
You will see from the Console logs that the Cluster has been created:
09:57:39,478 INFO [org.infinispan.CLUSTER] (thread-6,ejb,node1) ISPN000094: Received new cluster view for channel ejb: [node1|1] (2) [node1, node2] 09:57:39,492 INFO [org.infinispan.CLUSTER] (thread-6,ejb,node1) ISPN100000: Node node2 joined the cluster 09:57:40,160 INFO [org.infinispan.CLUSTER] (remote-thread--p3-t1) [Context=default-server] ISPN100002: Starting rebalance with members [node1, node2], phase READ_OLD_WRITE_ALL, topology id 2
Now you can try reaching the Servlet (deployed on the Root context) at http://localhost:8080
Now you can try crashing this server (Control+C for example). You will see from the other server’s logs that:
09:57:55,687 INFO [org.infinispan.CLUSTER] (thread-7,ejb,node2) ISPN100001: Node node1 left the cluster
Now, reach the second server and check that the counter is still increasing:
You can check the source code for this example at: https://github.com/fmarchioni/mastertheboss/tree/master/bootable-jar/cluster