= BlazeDS Spring-Boot Starter

This module can be used to configure a BlazeDS server with Spring-Boot.
It automatically kicks in as soon as a services-config.xml is detected in
`META-INF/flex/services-config.xml`

In order to call your Spring services from Flex using Remote objects, all
you need is a Spring-Boot starter:

.init/Application.java
----
package init;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("my.base.package")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
----

In order to do it's magic, you need to add a depdendency to the
the BlazeDS Spring-Boot starter in your pom.xml

.pom.xml
----

...
        <dependency>
            <groupId>org.apache.flex.blazeds</groupId>
            <artifactId>blazeds-spring-boot-starter</artifactId>
            <version>4.7.3-SNAPSHOT</version>
        </dependency>
...

----

The services-config.xml is the core part of this, as it describes
which channels the BlazeDS instance will provide. It has to be located
in the applications classpath in `META-INF/flex/servcies-config.xml`:

.src/main/resources/META-INF/flex/services-config.xml
----
<?xml version="1.0" encoding="UTF-8"?>
<services-config>
    <services>
        <service id="remoting-service" class="flex.messaging.services.RemotingService">
            <adapters>
                <adapter-definition
                        id="java-object"
                        class="flex.messaging.services.remoting.adapters.JavaAdapter"
                        default="true"/>
            </adapters>
            <default-channels>
                <channel ref="websocketAmf"/>
                <channel ref="longPollingAmf"/>
                <channel ref="shortPollingAmf"/>
            </default-channels>
        </service>
    </services>

    <channels>
        <channel-definition id="websocketAmf" class="mx.messaging.channels.StreamingAMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/websocket-amf"
                      class="flex.messaging.endpoints.StreamingAMFEndpoint"/>
            <properties>
                <server-to-client-heartbeat-millis>5000</server-to-client-heartbeat-millis>
                <add-no-cache-headers>true</add-no-cache-headers>
            </properties>
        </channel-definition>
        <channel-definition id="longPollingAmf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/long-polling-amf"
                     class="flex.messaging.endpoints.AMFEndpoint"/>
            <properties>
                <polling-enabled>true</polling-enabled>
                <wait-interval-millis>0</wait-interval-millis>
                <polling-interval-millis>1000</polling-interval-millis>
                <max-waiting-poll-requests>100</max-waiting-poll-requests>
                <piggybacking-enabled>true</piggybacking-enabled>
                <add-no-cache-headers>true</add-no-cache-headers>
            </properties>
        </channel-definition>
        <channel-definition id="shortPollingAmf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/short-polling-amf"
                      class="flex.messaging.endpoints.AMFEndpoint"/>
            <properties>
                <polling-enabled>true</polling-enabled>
                <polling-interval-millis>3000</polling-interval-millis>
                <piggybacking-enabled>true</piggybacking-enabled>
                <add-no-cache-headers>true</add-no-cache-headers>
            </properties>
        </channel-definition>
    </channels>

    <flex-client>
        <!-- Make sure clients are automatically expired -->
        <timeout-minutes>720</timeout-minutes>
    </flex-client>

    <logging>
        <!--
                Logging inside BlazeDS is completely turned off.
                The UniversalExceptionTranslator will handle logging
                of exceptions inside Spring.
        -->
        <target class="flex.messaging.log.ConsoleTarget" level="None"/>
    </logging>
</services-config>
----

As soon as you have Spring services annotated with `@RemotingDestination`
these are automatically accessible.

.src/main/java/my/base/package/movement/MovementService.java
----
package my.base.package.movement;

import org.springframework.flex.remoting.RemotingDestination;
import org.springframework.stereotype.Service;

@Service("movementService")
@RemotingDestination
public class MovementService {

    @Override
    public void stop() {
        System.out.println("Stop");
    }

    @Override
    public void moveForward() {
        System.out.println("Forward");
    }

    @Override
    public void moveLeft() {
        System.out.println("Left");
    }

    @Override
    public void moveRight() {
        System.out.println("Right");
    }

    @Override
    public void moveBack() {
        System.out.println("Back");
    }

}
----

The Flex code for accessing these methods is now:

.src/main/flex/my/base/package/rapiro/movement/MovementService.mxml
----
    <fx:Declarations>
        <s:RemoteObject id="movementService"
                        destination="movementService"
                        endpoint="http://localhost:8080/messagebroker/short-polling-amf"
                        fault="onFault(event)">
            <s:method name="stop" result="onResult(event)"/>
            <s:method name="moveForward" result="onResult(event)"/>
            <s:method name="moveLeft" result="onResult(event)"/>
            <s:method name="moveRight" result="onResult(event)"/>
            <s:method name="moveBack" result="onResult(event)"/>
        </s:RemoteObject>
    </fx:Declarations>
----
