Amazon SWF was launched today. How best to consume it with Java / PHP / etc. ?
The current SDK support doesn’t appear to include it. I know it’s new, but does anyone have any good resources on how to consume it, or what changes I’d need to implement in the any of the following SDK’s to get going right away?
Personally, my interest is on the Java & PHP SDK’s…
Updated releases are visible at: http://aws.amazon.com/releasenotes Thanks Bjorn!
I’m using Amazon Simple Workflow Service (SWF) to implement asynchronous business processing using the AWS Flow Framework. It was important to me to have my development build setup using Maven, so that I could easily build from my IDE of choice (IntelliJ IDEA) as well as automate my test builds for continuous integration and production builds for release and deploy.
Most of my time was spent trying to get the auto-generated proxy classes created using AspectJ. This was initially a problem for me in Eclipse as I was using version 3.7 (Indigo) and even after following both the load-time and compile-time weaving instructions in the Setting up the Development Environment documentation I was unable to successfully get the classes blown out. On a hunch I remembered that the documentation says they used Eclipse 3.6 (Helios), so I downloaded this specific version of Eclipse and retried using the load-time weaving approach and it worked like a champ. Looking at the Eclipse logs between these two versions I was able to see that Eclipse 3.7 is missing a dependency for
log4jandfreemarker. I didn’t bother going too far down the road to troubleshoot this further with Eclipse as I’m more of an IntelliJ IDEA user, but I’m sure that it’s most definitely possible to get Eclipse working properly.My next effort was to get an IntelliJ IDEA Maven project up and running with the minimum amount of information in my
pom.xmlto enable the auto-generation of the proxy classes. The clue was the last paragraph of the instructions for load-time weaving in the Setting up the Development Environment documentation, which states:Unless I’m mistaken, the research I’ve done to date indicates that the
aspectj-maven-plugindoesn’t not currently support load-time weaving. Breaking away from doing load-time weaving and utilizing anaop.xmlfile in conjunction withaspectjweaverrunning as a Java agent, I moved to compile-time weaving supported by this plugin. I can’t help but think that when I installed the AWS SDK for Java support directly in Eclipse that it in turn baked in the support found in theaws-java-sdk-flow-build-tools-1.3.3.jardependency. Taking the aforementioned clue, I was finally able to get the proxy classes blowing out by including a dependency foraws-java-sdk-flow-build-tools-1.3.3.jarin mypom.xmlafter installing this JAR into my local Maven repository. The rest of this entry outlines the steps taken to make this all happen.IntelliJ IDEA Project Creation
pom.xml.AWS SDK for Java
In order to reference the necessary types for developing workflows and activities, you will need to download the AWS SDK for Java. It is recommended that you use Maven to include a
dependencyfor this library for your project and build, but you should still download this library in order to get theaws-java-sdk-flow-build-toolslibrary which can be found under thelibdirectory.SWF Flow Build Tools
The AWS SDK for Java download includes a
aws-java-sdk-flow-build-tools-<version>.jarJAR under thelibdirectory. In order to allow the inclusion of a Mavendependencyfor this library, you’ll need to install the JAR into your local Maven repository. You can achieve this by running the following from thelibdirectory of the AWS SDK download:NOTE: Be sure to replace the tokens in the above command with the appropriate version found in your AWS SDK download.
Maven
Your
pom.xmlfile should include the followingdependencies. I’ve included the version numbers I’m using in case you run into breaking changes using different versions:Your
pom.xmlfile should also include the followingplugin. I’m using source include patterns that following a packaging and interface naming convention I use in my code, though you don’t necessarily need to do things this way:Once you’ve include the
pluginlisted above and have at least run a Mavencompile, you should notice anaspectjnode appear under thePluginsnode within the Maven Projects tool window in IntelliJ IDEA. You can also optional add or tweak the elements of theconfigurationsection of theaspectj-maven-pluginplugin if you desire. The various supported settings can be found in theaspectj:compilegoal documentation found here. I’ve haven’t tweaked my plugin configuration yet to ensure that the.javafiles are generated in the proper location under my source directory, though I’m sure this is quite doable.External Libraries
Once you’ve include the set of
dependencieslisted above and have at least run a Mavencompile, you should notice at minimum the following set of dependencies listed under the External Libraries node within the Project tool window in IntelliJ IDEA:Example pom.xml
Defining Workflows
To define a workflow you must create a Java interface that meets the following criteria:
The following is an example workflow interface named
MyWorkflow, and would be contained a file namedMyWorkflow.java, located under the source directorysrc/main/java, and under the package directory structurecom/some/package/workflow. I haven’t included the@WorkflowRegistrationOptionsannotation or other bells and whistles as these aren’t required and are dependent on your particular needs:Defining Activities
To define activities you must create a Java interface that meets the following criteria:
The following is an example activities interface named
MyActivities, and would be contained in a file namedMyActivities.java, located under the source directorysrc/main/java, and under the package directory structurecom/some/package/workflow/activities. I haven’t included the@ActivityRegistrationOptionsannotation or other bells and whistles as these aren’t required and are dependent on your particular needs:Building
In order to ensure that the build process is the same during everyday development as well as for non-development environments (e.g. test, production, etc.), you should run builds in your development tool of choice through Maven. Various aspects have been included in the
aws-java-sdkandaws-java-sdk-flow-build-toolsJARs which are weaved into your workflows and activities, and theaws-java-sdk-flow-build-toolsJAR includes the necessary mechanism to auto-generate the required proxy classes to execute workflows and activities. In order to ensure that you’re working with the latest generated proxy classes, you should take care to clean the generated artifacts before a build in order to throw away unneeded and/or old classes. This can be achieved by running the following command or equivalent in your development tool of choice:If you keep the
showWeaveInfoconfiguration option enabled in theaspectj-maven-pluginplugin, you should see something like the following snippet in your build output, albeit there are only have a few lines of output here due to only having a single workflow and single activities for this run:Auto-Generated Proxies
Once you’ve compiled your workflows and activities you should find the follow set of auto-generated proxy classes have been created. These proxies are to be used within your workflows to call upon your various activities, execute child workflows within other workflows, and also to execute workflows at a top level. NOTE: The strings “Workflow” and “Activities” in the following bullets would actually be the name of your actual workflow and activities interfaces respectively, and you should see the following set of classes created for each of your defined workflow and activities interfaces:
I’m also including some background information to help clarify the type of development environment I’m working on and tools I’m using for day to day coding.
OS
Java
Maven
IntelliJ IDEA (Community Edition)