First application (Avalanche - application framework for Java)
"Avalanche - application framework for Java" - implementation of technology erasing the differences between
local and remote code calls. Fault tolerance, scalability,
modifiability, continuous availability come bundled with nice bonuses.
All programming languages ββsuggest starting with writing a simple output program.
Hello world messages. This example is not suitable for demonstrating functional
features of "Avalanche - application framework for Java", since calling this example is always
returns the same string and does not allow to identify the source that returned this
result.
For the first application, you need to implement two classes (function and application), one
interface (function adapter) and one JSP page to display the result. Designed by
the application will run under Tomcat.
Function Class Implementation - DemoFunction
There is nothing special in the function implementation class; it is a regular Java class. As
function class any class can be used. Let the function demo class
returns the following information from the operating system: PID of the process and server name;
operating system version; name of the operating system.
Class Code DemoFunction.java
package ru.funsys.demo.avalanche;
import java.lang.management.ManagementFactory;
import java.util.Hashtable;
public class DemoFunction {
/**
* .<br>
* <br>
* <br>
* <b>os.name</b> - ,<br>
* <b>os.version</b> - <br>
* <b>PID@name</b> -
*
* @return
*/
public Hashtable<String, String> getInfo() {
Hashtable<String, String> result = new Hashtable<String, String>();
result.put("os.name", System.getProperty("os.name"));
result.put("os.version", System.getProperty("os.version"));
result.put("PID@name", ManagementFactory.getRuntimeMXBean().getName());
return result;
}
}
β DemoAdapter
Java, β ,
,
. DemoFunction
DemoAdapter.java
package ru.funsys.demo.avalanche;
import java.util.Hashtable;
import ru.funsys.avalanche.AvalancheRemote;
public interface DemoAdapter {
public Hashtable<String, String> getInfo() throws AvalancheRemote;
}
, DemoAdapter
AvalancheException.
RMI Java,
:
- ( β DemoFunction)
( β DemoAdapter) - ( β DemoAdapter)
(, DemoFunction), ,
.
, .
β DemoApplication
DemoApplication β getInfo() DemoFunction
DemoAdapter. DemoApplication
getInfo() TXT HTML.
DemoApplication.java
package ru.funsys.demo.avalanche;
import java.util.Enumeration;
import java.util.Hashtable;
import ru.funsys.avalanche.Application;
import ru.funsys.avalanche.AvalancheRemote;
public class DemoApplication extends Application {
/**
*
*/
private DemoAdapter info;
/**
*
* HTML .
*
* @param html true, HTML, false
*
* @return HTML
*/
public String getInfo(boolean html) {
StringBuilder builder = new StringBuilder();
if (html) {
builder.append("<table border=\"1\">");
builder.append("<tr><th>key</th><th>value</th></tr>");
}
try {
//
Hashtable<String, String> result = info.getInfo();
for (Enumeration<String> enumeration = result.keys(); enumeration.hasMoreElements(); ) {
String key = enumeration.nextElement();
String value = result.get(key);
if (html) {
builder.append("<tr><td>").append(key).append("</td><td>").append(value).append("</td></tr>");
} else {
builder.append(key).append(": ").append(value).append("\r\n");
}
}
} catch (AvalancheRemote e) {
if (html) {
builder.append("<tr><td>").append("error").append("</td><td>").append(e.getLocalizedMessage()).append("</td></tr>");
} else {
builder.append("error").append(": ").append(e.getLocalizedMessage()).append("\r\n");
}
}
if (html) builder.append("</table>");
return builder.toString();
}
}
: ru.funsys.avalanche.Application.
info , , getAdapter(String name) ru.funsys.avalanche.Application. . .
JSP β first.jsp
JSP . DemoApplication getInfo c true.
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> </title>
</head>
<body>
<h1> </h1>
<jsp:useBean id='DemoApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>
<%= DemoApp.getInfo(true) %>
<br>
</body>
</html>
. .
web.xml
web.xml AvalancheServlet, log4j. AvalancheServlet avalanche-config.xml.
<?xml version="1.0" encoding="UTF-8"?>
<!--
web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"
-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Demo Avalanche</display-name>
<description>
framework Avalanche
</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<display-name>AvalancheServlet</display-name>
<servlet-name>AvalancheServlet</servlet-name>
<servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class>
<init-param>
<param-name>avalanche.config</param-name>
<param-value>${catalina.base}/conf/avalanche-config.xml</param-value>
</init-param>
<init-param>
<param-name>avalanche.log4j</param-name>
<param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
avalanche-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<avalanche name="Demo Application">
<function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description=" " />
<application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" />
</application>
</avalanche>
<function> <application>. <application> <adapter>, uri (. name <function>).
name <application>, DemoApp id DemoApplication JSP .
DemoFunction
, , REST, SOAP .
"Avalanche β application framework for Java" DemoFunction. .
avalanche-config.xml :
- <interface>,
- <connector>, .
RMI
RMI
<interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" />
:
- localhost
- 23000 RMI Remote Server
- rmi-connector
<connector>
<connector class="RMIConnector" name="rmi-connector" port="23000" >
<publish name="info" function="info-function" />
</connector>
:
- rmi-connector
- 23000 RMI Remote Server
- <publish> info-function , info-function info
HTTP
HTTP
<interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />
:
- localhost
- 8080 HTTP Server
- demo
- connector AvalancheServlet
- http-connector
<connector>
<connector class="HTTPConnector" name="http-connector" >
<publish name="info" function="info-function" />
</connector>
:
- http-connector
- <publish> info-function , info-function info
! HTTP , HTTP (Tomcat).
<multipart-config> AvalancheServlet <servlet-mapping> URI web.xml.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"
-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Demo Avalanche</display-name>
<description>
framework Avalanche
</description>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<display-name>AvalancheServlet</display-name>
<servlet-name>AvalancheServlet</servlet-name>
<servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class>
<init-param>
<param-name>avalanche.config</param-name>
<param-value>${catalina.base}/conf/avalanche-config.xml</param-value>
</init-param>
<init-param>
<param-name>avalanche.log4j</param-name>
<param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!-- 50MB max -->
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>AvalancheServlet</servlet-name>
<url-pattern>/connector/*</url-pattern>
</servlet-mapping>
</web-app>
, <application> RMIApp HTTPApp. uri <adapter> -/- , .. rmi-interface/info http-interface/info.
avalanche-config.xml RMI HTTP
<?xml version="1.0" encoding="UTF-8"?>
<avalanche name="Demo Application">
<interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" />
<interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />
<function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description=" " />
<application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" />
</application>
<application class="ru.funsys.demo.avalanche.DemoApplication" name="RMIApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="rmi-interface/info" />
</application>
<application class="ru.funsys.demo.avalanche.DemoApplication" name="HTTPApp" >
<adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="http-interface/info" />
</application>
<connector class="RMIConnector" name="rmi-connector" port="23000" >
<publish name="info" function="info-function" />
</connector>
<connector class="HTTPConnector" name="http-connector" >
<publish name="info" function="info-function" />
</connector>
</avalanche>
JSP first.jsp RMI HTTP, id RMIApp HTTPApp .
rmi.jsp
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> - RMI</title>
</head>
<body>
<h1> - RMI</h1>
<p>
- RMI
</p>
<jsp:useBean id='RMIApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>
<%= RMIApp.getInfo(true) %>
</body>
</html>
http.jsp
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> - HTTP</title>
</head>
<body>
<h1> - HTTP</h1>
<p>
- HTTP
</p>
<jsp:useBean id='HTTPApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/>
<%= HTTPApp.getInfo(true) %>
</body>
</html>
, localhost <interface> avalanche-config.xml, .
, .
, , GitHub