forked from nmcl/TransactionalVert.x
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
975 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# Vert.x STM Module | ||
|
||
A module that exposes the Narayana STM implementation for Vert.x applications. | ||
|
||
Documentation is a bit light at the moment, but the following links provide some background. | ||
|
||
http://jbossts.blogspot.co.uk/2011/06/stm-arjuna.html | ||
|
||
http://jbossts.blogspot.co.uk/2012/02/optimistic-stm.html | ||
|
||
http://jbossts.blogspot.co.uk/2012/03/update-to-stm-api.html | ||
|
||
http://jbossts.blogspot.co.uk/2013/03/stm-vertx-and-pi-part-1.html | ||
|
||
In a nutshell: | ||
|
||
(i) create an interface that defines the type(s) of your STM implementations. Annotate this using | ||
@Transactional You can also use the @Optimistic annotation to choose to have optimistic concurrency | ||
control for instances of the classes derived from the interface. (Default value is @Pessimistic). | ||
|
||
(ii) instrument the interface methods with @WriteLock or @ReadLock. (Default value is @WriteLock). | ||
|
||
(iii) define class(es) derives from the interface. Use the @NotState to select variables which are not | ||
to be serialised as part of the transactional updates. (Default is to serialise everything). You can use | ||
the @State annotation to make it explicit. | ||
|
||
(iv) create a Container that can manage instances of the interface defined in step (i). This is your | ||
"transactional memory pool". Create instances of the classes from step (iii) and pass them to the Container. | ||
|
||
(v) manipulate the objects returned from the Container in step (iv) within the scope of AtomicActions. | ||
|
||
Note, this is NOT distributed transactions. No transaction context will flow between address spaces. | ||
No interposition will occur if you manage to serialise and distribute a transaction context. Distributed | ||
transactions could be added, but since 2PC is a blocking protocol it doesn't necessarily fit naturally | ||
with Vert.x. Perhaps something based on forward compensations, which are not blocking. However, that then | ||
introduces a trade-off between consistency and performance. Definitely a TODO. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,340 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<groupId>org.jboss</groupId> | ||
<artifactId>mod-stm</artifactId> | ||
<packaging>jar</packaging> | ||
<version>1.0-SNAPSHOT</version> | ||
<name>Project - mod-stm</name> | ||
<url>http://maven.apache.org</url> | ||
|
||
<parent> | ||
<groupId>org.sonatype.oss</groupId> | ||
<artifactId>oss-parent</artifactId> | ||
<version>7</version> | ||
</parent> | ||
|
||
<properties> | ||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
|
||
<!-- Set pullInDeps to true if you want any modules specified in the 'includes' and 'deploys' fields | ||
in your mod.json to be automatically pulled in during packaging and added inside your module. Doing this means your | ||
module won't download and install those dependencies at run-time when they're first requested. --> | ||
<vertx.pullInDeps>false</vertx.pullInDeps> | ||
|
||
<!-- Set createFatJar to true if you want to create a fat executable jar which contains the Vert.x binaries | ||
along with the module so it can be run with java -jar <jarname> --> | ||
<vertx.createFatJar>false</vertx.createFatJar> | ||
|
||
<!--Vertx module name--> | ||
<module.name>${project.groupId}~${project.artifactId}~${project.version}</module.name> | ||
|
||
<!-- The directory where the module will be assembled - you can override this on the command line | ||
with -Dmods.directory=mydir --> | ||
<mods.directory>target/mods</mods.directory> | ||
|
||
<!--Dependency versions--> | ||
<vertx.version>2.1M3</vertx.version> | ||
<vertx.testtools.version>2.0.3-final</vertx.testtools.version> | ||
<junit.version>4.11</junit.version> | ||
|
||
<!--Plugin versions--> | ||
<maven.compiler.plugin.version>3.0</maven.compiler.plugin.version> | ||
<maven.resources.plugin.version>2.6</maven.resources.plugin.version> | ||
<maven.clean.plugin.version>2.5</maven.clean.plugin.version> | ||
<maven.vertx.plugin.version>2.0.3-final</maven.vertx.plugin.version> | ||
<maven.surefire.plugin.version>2.14</maven.surefire.plugin.version> | ||
<maven.failsafe.plugin.version>2.14</maven.failsafe.plugin.version> | ||
<maven.surefire.report.plugin.version>2.14</maven.surefire.report.plugin.version> | ||
<maven.javadoc.plugin.version>2.9</maven.javadoc.plugin.version> | ||
<maven.dependency.plugin.version>2.7</maven.dependency.plugin.version> | ||
</properties> | ||
|
||
<repositories> | ||
<repository> | ||
<id>sonatype-nexus-snapshots</id> | ||
<url>https://oss.sonatype.org/content/repositories/snapshots</url> | ||
</repository> | ||
</repositories> | ||
|
||
<dependencies> | ||
<!--Vertx provided dependencies--> | ||
<dependency> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>vertx-core</artifactId> | ||
<version>${vertx.version}</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>vertx-platform</artifactId> | ||
<version>${vertx.version}</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>vertx-hazelcast</artifactId> | ||
<version>${vertx.version}</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
<!--Test dependencies--> | ||
<dependency> | ||
<groupId>junit</groupId> | ||
<artifactId>junit</artifactId> | ||
<version>4.11</version> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>testtools</artifactId> | ||
<version>${vertx.testtools.version}</version> | ||
<scope>test</scope> | ||
</dependency> | ||
|
||
<dependency> | ||
<groupId>org.jboss.narayana.arjunacore</groupId> | ||
<artifactId>arjunacore</artifactId> | ||
<version>5.0.1.Final</version> | ||
<scope>compile</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jboss.narayana.arjunacore</groupId> | ||
<artifactId>txoj</artifactId> | ||
<version>5.0.1.Final</version> | ||
<scope>compile</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jboss.logging</groupId> | ||
<artifactId>jboss-logging</artifactId> | ||
<version>3.1.4.GA</version> | ||
<scope>compile</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.jboss.narayana.stm</groupId> | ||
<artifactId>stm</artifactId> | ||
<version>5.0.1.Final</version> | ||
<scope>compile</scope> | ||
</dependency> | ||
|
||
<!-- Add any other dependencies that you want packaged into your module (in the lib dir) here | ||
as 'compile' dependencies. Here is an example | ||
<dependency> | ||
<groupId>org.hamcrest</groupId> | ||
<artifactId>hamcrest-core</artifactId> | ||
<version>1.3</version> | ||
<scope>compile</scope> | ||
</dependency> | ||
--> | ||
|
||
</dependencies> | ||
|
||
<build> | ||
<plugins> | ||
|
||
<!-- The vert.x Maven plugin --> | ||
<plugin> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>vertx-maven-plugin</artifactId> | ||
<version>${maven.vertx.plugin.version}</version> | ||
<!-- | ||
You can specify extra config to the plugin as required here | ||
<configuration> | ||
<configFile>/path/to/MyVerticle.conf</configFile> | ||
<instances>1</instances> | ||
<classpath>src/main/resources/:src/test/resources/:target/classes/:target/test-classes/</classpath> | ||
</configuration> | ||
--> | ||
<!-- Make sure that the plugin uses the vert.x versions from this pom.xml not from its own pom.xml --> | ||
<dependencies> | ||
<dependency> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>vertx-platform</artifactId> | ||
<version>${vertx.version}</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>vertx-core</artifactId> | ||
<version>${vertx.version}</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>io.vertx</groupId> | ||
<artifactId>vertx-hazelcast</artifactId> | ||
<version>${vertx.version}</version> | ||
</dependency> | ||
</dependencies> | ||
<executions> | ||
<execution> | ||
<id>PullInDeps</id> | ||
<phase>prepare-package</phase> | ||
<goals> | ||
<goal>pullInDeps</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
|
||
<!-- Other plugins required by the build --> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-compiler-plugin</artifactId> | ||
<version>${maven.compiler.plugin.version}</version> | ||
<configuration> | ||
<source>1.7</source> | ||
<target>1.7</target> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<artifactId>maven-clean-plugin</artifactId> | ||
<configuration> | ||
<filesets> | ||
<fileset> | ||
<directory>ObjectStore</directory> | ||
</fileset> | ||
</filesets> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<artifactId>maven-resources-plugin</artifactId> | ||
<version>${maven.resources.plugin.version}</version> | ||
<executions> | ||
<execution> | ||
<id>copy-mod-to-target</id> | ||
<phase>process-classes</phase> | ||
<goals> | ||
<goal>copy-resources</goal> | ||
</goals> | ||
<configuration> | ||
<overwrite>true</overwrite> | ||
<outputDirectory>${mods.directory}/${module.name}</outputDirectory> | ||
<resources> | ||
<resource> | ||
<directory>target/classes</directory> | ||
</resource> | ||
</resources> | ||
</configuration> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-dependency-plugin</artifactId> | ||
<version>${maven.dependency.plugin.version}</version> | ||
<executions> | ||
<execution> | ||
<id>copy-mod-dependencies-to-target</id> | ||
<phase>process-classes</phase> | ||
<goals> | ||
<goal>copy-dependencies</goal> | ||
</goals> | ||
<configuration> | ||
<outputDirectory>${mods.directory}/${module.name}/lib</outputDirectory> | ||
<includeScope>runtime</includeScope> | ||
</configuration> | ||
</execution> | ||
<execution> | ||
<id>copy-mod-dependencies-to-target-dependencies</id> | ||
<phase>process-classes</phase> | ||
<goals> | ||
<goal>copy-dependencies</goal> | ||
</goals> | ||
<configuration> | ||
<outputDirectory>target/dependencies</outputDirectory> | ||
<includeScope>runtime</includeScope> | ||
</configuration> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-surefire-plugin</artifactId> | ||
<version>${maven.surefire.plugin.version}</version> | ||
<configuration> | ||
<includes> | ||
<include>**/unit/*Test*.java</include> | ||
</includes> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-failsafe-plugin</artifactId> | ||
<version>${maven.failsafe.plugin.version}</version> | ||
<configuration> | ||
<systemProperties> | ||
<property> | ||
<name>vertx.mods</name> | ||
<value>${mods.directory}</value> | ||
</property> | ||
</systemProperties> | ||
<includes> | ||
<include>**/integration/**</include> | ||
</includes> | ||
</configuration> | ||
<executions> | ||
<execution> | ||
<goals> | ||
<goal>integration-test</goal> | ||
<goal>verify</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-surefire-report-plugin</artifactId> | ||
<version>${maven.surefire.report.plugin.version}</version> | ||
<executions> | ||
<execution> | ||
<id>generate-test-report</id> | ||
<phase>test</phase> | ||
<goals> | ||
<goal>report-only</goal> | ||
</goals> | ||
</execution> | ||
<execution> | ||
<id>generate-integration-test-report</id> | ||
<phase>integration-test</phase> | ||
<goals> | ||
<goal>failsafe-report-only</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
<plugin> | ||
<artifactId>maven-assembly-plugin</artifactId> | ||
<configuration> | ||
<descriptors> | ||
<descriptor>src/main/assembly/mod.xml</descriptor> | ||
</descriptors> | ||
</configuration> | ||
<executions> | ||
<execution> | ||
<id>assemble</id> | ||
<phase>package</phase> | ||
<goals> | ||
<goal>single</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
<reporting> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-surefire-report-plugin</artifactId> | ||
<version>${maven.surefire.report.plugin.version}</version> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-javadoc-plugin</artifactId> | ||
<version>${maven.javadoc.plugin.version}</version> | ||
<configuration> | ||
<aggregate>true</aggregate> | ||
</configuration> | ||
</plugin> | ||
</plugins> | ||
</reporting> | ||
</project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
Put any Java or Groovy classes used in your module in the java or groovy directories. | ||
|
||
Put any other resources that you want included in your module in the resources directory, this includes any | ||
JavaScript, Ruby, Python, Groovy or CoffeeScript scripts or any other stuff you want in your module. | ||
|
||
The mod.json file also goes in the resources directory so it's copied over too. |
Oops, something went wrong.