VLINGO XOOM
  • Introduction
  • Overview
    • Quick Reference
  • Getting Started
    • Hello, World!
  • Architecture
  • XOOM Cloud
    • AWS Infrastructure
    • XOOM Cloud Operator
    • XOOM Cloud Demo
  • XOOM Designer
    • Development Guide
      • End-to-End Tests
  • Turbo
    • Annotations
    • Scooter
  • Actors
  • HTTP (REST and RPC)
  • Lattice
    • CQRS
    • Object, Stateful, and Sourced Entities With CQRS
    • Grid
    • Exchange
    • Processes
    • Spaces
    • Projections
    • Routers
  • Streams
  • Schemata
  • GraphQL Server
  • Symbio (Reactive Storage)
    • Journal Storage
    • State Storage
    • Object Storage
    • Adapters
  • Cluster
  • Directory
  • Common Tools
  • Build Plugins
  • Telemetry
  • Wire
  • Auth-Auth
  • Containerization
  • Tools and Patterns for Specific Use Cases
  • Appendix A: Deploy to Pivotal Cloud Foundry
  • FAQ
Powered by GitBook
On this page
  • Your First Program
  • Hello Resource
  • Greeting Resource
  1. Getting Started

Hello, World!

The obligatory "Hello, World!", but it's a pretty cool design and implementation that you will really love. That's because it's a service that demonstrates the reactive platform components.

PreviousGetting StartedNextArchitecture

Last updated 2 years ago

Your First Program

The xoom-helloworld example is a pinned repository on our . To use to it learn, first clone the repository and build the project. Open a console/command window so you can build the xoom-helloworld artifact and start it by executing the built jar file.

Note that snapshot artifacts are hosted on GitHub, which requires credentials to be provided to Maven by way of it's ~/.m2/settings.xml. This is .

$ git clone https://github.com/vlingo/xoom-helloworld.git
...
$ cd xoom-helloworld
$ mvn package
...
java -jar target/xoom-helloworld-withdeps.jar
...
$ 

The above java command executes the jar on the default port 18080. If you would like to use a different port, you must provide it on the command line. This command uses port 8080.

$ java -jar target/xoom-helloworld.jar 8080

The following examples assume that you have started the service with the default port, 18080.

There are two resources, each with multiple endpoints. These are discussed next.

Hello Resource

The first resource is used to get "Hello, World!" and similar messages.

You may curl with GET methods on the following resources.

$ curl -i -X GET http://localhost:18080/hello

The above curl responds with 200 OK and the content body entity "Hello, World!"

You may also provide a path parameter to indicate to whom the service should say "Hello". The second example responds with 200 OK and the content body entity "Hello, Me!"

$ curl -i -X GET http://localhost:18080/hello/Me

Greeting Resource

The second resource is a bit more involved, and is used to maintain any number of Greeting messages. These greetings have the following data associated with them.

  • id: a unique identity

  • message: a text message

  • messageChangedCount: the number of times the message text has changed since first being defined

  • description: a text description of the message

  • descriptionChangedCount: the number of times the description text has changed since first being defined

The first operation used is to define a new Greeting. To do so you POST a JSON object to the /greetings URI.

$ curl -i -X POST -H "Content-Type: application/json" -d '{"id":"","message":"Hey","messageChangedCount":"0","description":"Says Hey","descriptionChangedCount":"0" }' http://localhost:18080/greetings

The resource will respond with (only the id could be different):

HTTP/1.1 201 Created
Location: /greetings/242
Content-Length: 105

{"id":"242","message":"Hey","messageChangedCount":0,"description":"Says Hey","descriptionChangedCount":0}

Following this you may query the new Greeting. The Location of the new Greeting resource is /greetings/{someId}. Let's GET that resource.

$ curl -i -X GET http://localhost:18080/greetings/242

You should see the following:

HTTP/1.1 200 OK
Content-Length: 105

{"id":"242","message":"Hey","messageChangedCount":0,"description":"Says Hey","descriptionChangedCount":0}

Next PATCH the Greeting resource's message.

$ curl -i -X PATCH -H "Content-Type: application/json" -d '{"value":"Yo"}' http://localhost:18080/greetings/242/message

The resource responds with the following. Note that the message has changed to "Yo", and the messageChangedCount is now 1. Also notice that the description and the descriptionChangedCount remain unchanged.

HTTP/1.1 200 OK
Content-Length: 104

{"id":"242","message":"Yo","messageChangedCount":1,"description":"Says Hey","descriptionChangedCount":0}

Next PATCH the Greeting resource's description.

$ curl -i -X PATCH -H "Content-Type: application/json" -d '{"value":"Says Yo"}' http://localhost:18080/greetings/242/description

The resource responds with the following. Note that the description has changed to "Says Yo", and the descriptionChangedCount is now 1.

HTTP/1.1 200 OK
Content-Length: 103

{"id":"242","message":"Yo","messageChangedCount":1,"description":"Says Yo","descriptionChangedCount":1}

Now both the message and the description and the corresponding counts have all changed.

In this Greeting resource example there are various component sets involved. See the following source code.

io.vlingo.xoom.hello.Bootstrap

io.vlingo.xoom.hello.resource.GreetingResource

io.vlingo.xoom.hello.model.Greeting
io.vlingo.xoom.hello.model.GreetingEntity
io.vlingo.xoom.hello.model.GreetingState

io.vlingo.xoom.hello.infra.persistence.GreetingProjectionActor

io.vlingo.xoom.hello.infra.persistence.Queries
io.vlingo.xoom.hello.infra.persistence.QueriesActor

io.vlingo.xoom.hello.infra.persistence.* - lower-level persistence setup and storage access

Documentation for the above components is found in the following links.

In this Hello resource example there is only one component involved,.

GitHub VLINGO organization
explained in more detail and with an example here
io.vlingo.xoom.hello.infra.resource.HelloResource
Starting the World
CQRS Command and Query Models
StatefulEntity
StateStore Persistence
Query Model Projections
Reactive Storage