A software architecture style in which complex applications are composed of small, independent processes communicating with each other using language-agnostic APIs. These services are small, highly decoupled and focus on doing a small task, facilitating a modular approach to system-building.
A single .jar file containing your application, the portions of WildFly required to support it, an internal Maven repository of dependencies, plus a shim to bootstrap it all.
A well-defined collection of application capabilities. May map directly to a WildFly subsystem, or bring in external capabilities such as Netflix Ribbon.
org.wildfly.swarm
wildfly-swarm-jaxrs
${swarm.version}
org.wildfly.swarm
wildfly-swarm-plugin
package
org.wildfly.swarm
wildfly-swarm-jaxrs-weld
${version.swarm}
org.wildfly.swarm
wildfly-swarm-jaxrs-jaxb
${version.swarm}
org.wildfly.swarm
wildfly-swarm-plugin
${version.swarm}
package
$ mvn package
target/myApp-swarm.jar
$ java -jar myApp-swarm.jar
$ mvn wildfly-swarm:run
@Path("/")
public class PricingResource {
@GET
@Path("/book/{id}")
@Produces("application/json")
public Integer search(@PathParam("id") String id, @Context SecurityContext context) {
KeycloakPrincipal principal = (KeycloakPrincipal) context.getUserPrincipal();
if ( principal != null && principal.getKeycloakSecurityContext() != null ) {
return 9;
}
return 10;
}
}
public class Main {
public static void main(String... args) throws Exception {
// Create a simple shrinkwrapped JAX-RS app
Container container = new Container();
JAXRSArchive deployment = ShrinkWrap.create(JAXRSArchive.class);
deployment.addPackage(Main.class.getPackage());
// Make it discoverable via Ribbon
deployment.as(RibbonArchive.class).setApplicationName("pricing");
deployment.as(Secured.class);
container.start();
container.deploy(deployment);
}
}
public class Main {
public static void main(String...args) {
CacheContainer webCache = new CacheContainer("web")
.defaultCache("dist")
.jgroupsTransport(new JGroupsTransport().lockTimeout(60000L))
.distributedCache("dist", distCache -> distCache
.mode("ASYNC")
.l1Lifespan(0L)
.owners(2)
.lockingComponent(new LockingComponent().isolation("REPEATABLE_READ"))
.transactionComponent(new TransactionComponent().mode("BATCH"))
.fileStore(new FileStore()));
InfinispanFraction fraction = new InfinispanFraction();
fraction.cacheContainer( webCache );
Container container = new Container();
container.fraction( fraction );
// Start the container
container.start();
}
}
public class Main {
public static void main(String[] args) throws Exception {
Container container = new Container();
container.subsystem(new TransactionsFraction(4712, 4713));
container.start();
JAXRSArchive deployment = ShrinkWrap.create(JAXRSArchive.class);
deployment.addResource(MyResource.class);
container.deploy(deployment);
}
}
@Path("/")
public class MyResource {
@Path("begincommit")
@GET
@Produces("text/plain")
public String beginCommit() throws Exception {
UserTransaction txn = (UserTransaction) new InitialContext()
.lookup("java:comp/UserTransaction");
String value = "Transaction ";
try {
txn.begin();
value += "begun ok";
try {
txn.commit();
value += " and committed ok";
} catch (final Throwable ex) {
value += " but failed to commit";
}
}
}