Статьи

Сервис RESTFul для данных GigaSpaces с использованием SparkJava

Я наткнулся на SparkJava вчера. Это действительно интересный микро-фреймворк, особенно для Java, где на самом деле нет ничего микро и что-то подобное крайне необходимо Их сайт хорошо объясняет, как это работает, и начинает работу. Я был и работает в течение нескольких минут.

Я создаю демонстрации и доказательства концепций как часть моей работы и всегда ищу эффективный и простой способ сделать что-то. RESTful пример  поймал мой взгляд. Я решил расширить это и показать, как вы можете легко предоставлять данные, хранящиеся в GigaSpaces.

Я создал веб-проект Maven с использованием архетипа Maven  : создать  цель,

mvn  -DgroupId=com.gigaspaces.spark -DartifactId=gs-spark -DarchetypeArtifactId=maven-archetype-webapp

Я взял RESTful код, упомянутый выше. Поскольку я хочу запустить службу RESTful в GigaSpaces, я изменил код для  реализации  интерфейса SparkApplication и определения маршрутов в методе init ().

Я также создал web.xml как предложено здесь

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
	<display-name>Archetype Created Web Application</display-name>

	<filter>
		<filter-name>SparkFilter</filter-name>
		<filter-class>spark.servlet.SparkFilter</filter-class>
		<init-param>
			<param-name>applicationClass</param-name>
			<param-value>com.gigaspaces.spark.BooksService</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>SparkFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

Я изменил операции CRUD, чтобы идти против GigaSpace вместо карты. Полный код BooksService здесь,

package com.gigaspaces.spark;

import static spark.Spark.delete;
import static spark.Spark.get;
import static spark.Spark.post;
import static spark.Spark.put;

import java.util.Random;

import org.openspaces.core.GigaSpace;
import org.openspaces.core.GigaSpaceConfigurer;
import org.openspaces.core.space.UrlSpaceConfigurer;

import spark.Request;
import spark.Response;
import spark.Route;
import spark.servlet.SparkApplication;

public class BooksService implements SparkApplication {

	/**
	 * Map holding the books
	 */

	private GigaSpace gigaSpace;

	public void init() {

		if (gigaSpace == null) {
			gigaSpace = new GigaSpaceConfigurer(new UrlSpaceConfigurer(
					"/./bookSpace").space()).gigaSpace();
		}

		// Creates a new book resource, will return the ID to the created
		// resource
		// author and title are sent as query parameters e.g.
		// /books?author=Foo&title=Bar
		post(new Route("/books") {
			Random random = new Random();

			@Override
			public Object handle(Request request, Response response) {
				String author = request.queryParams("author");
				String title = request.queryParams("title");
				Book book = new Book(author, title);

				int id = random.nextInt(Integer.MAX_VALUE);
				book.setId(id + "");

				gigaSpace.write(book);

				response.status(201); // 201 Created
				return id;

			}
		});

		// Gets the book resource for the provided id
		get(new Route("/books/:id") {
			@Override
			public Object handle(Request request, Response response) {
				Book template = new Book();

				template.setId(request.params(":id"));

				Book book = gigaSpace.read(template);
				if (book != null) {
					return "Title: " + book.getTitle() + ", Author: "
							+ book.getAuthor();
				} else {
					response.status(404); // 404 Not found
					return "Book not found";
				}
			}
		});

		// Updates the book resource for the provided id with new information
		// author and title are sent as query parameters e.g.
		// /books/<id>?author=Foo&title=Bar
		put(new Route("/books/:id") {
			@Override
			public Object handle(Request request, Response response) {
				String id = request.params(":id");

				Book template = new Book();

				template.setId(id);

				Book book = gigaSpace.read(template);

				if (book != null) {
					String newAuthor = request.queryParams("author");
					String newTitle = request.queryParams("title");
					if (newAuthor != null) {
						book.setAuthor(newAuthor);
					}
					if (newTitle != null) {
						book.setTitle(newTitle);
					}

					gigaSpace.write(book);
					return "Book with id '" + id + "' updated";
				} else {
					response.status(404); // 404 Not found
					return "Book not found";
				}
			}
		});

		// Deletes the book resource for the provided id
		delete(new Route("/books/:id") {
			@Override
			public Object handle(Request request, Response response) {
				String id = request.params(":id");
				
				Book template = new Book();

				template.setId(id);

				Book book = gigaSpace.take(template);
				
				if (book != null) {
					return "Book with id '" + id + "' deleted";
				} else {
					response.status(404); // 404 Not found
					return "Book not found";
				}
			}
		});

		// Gets all available book resources (id's)
		get(new Route("/books") {
			@Override
			public Object handle(Request request, Response response) {
				String ids = "";

				Book[] books = gigaSpace.readMultiple(new Book());
				
				for (Book book:books)
					ids = book.getId() + " " + ids;

				return ids;
			}
		});

	}
}

Для простоты я создаю GigaSpace внутри сервисного / веб-контейнера RESTful, но в реальных приложениях вы будете подключаться к внешнему кластеру GigaSpace, который можно изменить путем обновления URL-адреса GigaSpace. Для встроенного пространства используйте  «/./bookSpace», а для удаленного пространства используйте URL «jini: // * / * / bookSpace».

Исходный код находится в репозитории github здесь . Файл README содержит инструкции о том, как запустить это на вашей стороне.

Как вы можете видеть, SparkJava является перспективной платформой. Очень простая настройка и код, необходимый для создания веб-приложений.

Надеюсь, что это поможет другим, ищущим простые веб-приложения на Java