Skip to content

Instantly share code, notes, and snippets.

View maxant's full-sized avatar

Ant Kutschera maxant

View GitHub Profile
@Stateless
public class Service4 {
@Asynchronous
public void foo(Callback<String> c) {
// simulate some long running process
Thread.sleep(5000);
c.apply("bar");
}
@WebServlet(urlPatterns = { "/AsyncServlet3" }, asyncSupported = true)
public class AsyncServlet3 extends HttpServlet {
@EJB private Service4 service;
protected void doGet(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
...
final AsyncContext ctx = request.startAsync(request, response);
service.foo(s -> {
@Stateless
public class Service3 {
@Asynchronous
public void foo(CompletableFuture<String> cf) {
// simulate some long running process
Thread.sleep(5000);
cf.complete("bar");
}
@WebServlet(urlPatterns = { "/AsyncServlet2" }, asyncSupported = true)
public class AsyncServlet2 extends HttpServlet {
@EJB private Service3 service;
protected void doGet(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
final PrintWriter pw = response.getWriter();
pw.write("<html><body>Started publishing with thread " + Thread.currentThread().getId() + "<br>");
response.flushBuffer(); // send back to the browser NOW
package ch.maxant.async;
import java.util.concurrent.Future;
import javax.annotation.Resource;
import javax.ejb.AsyncResult;
import javax.ejb.Asynchronous;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
package ch.maxant.async;
import java.util.concurrent.Future;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
package ch.maxant.async;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.Future;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@maxant
maxant / trading-engine-persistSales.js
Created December 30, 2014 21:04
Modifications to the node.jsj trading engine
function persistSales(sales, callback){
if(sales.length === 0 || process.env.skipPersistence) {
callback(); //nothing to do, so continue immediately
}else{
resources.dbConnection(function(err, connection) {
if(err) callback(err); else {
logger.info('preparing to persist ' + sales.length + ' sales');
var count = sales.length;
_.each(sales, function(sale){ //save them in parallel
connection.query(
@maxant
maxant / Main7.java
Created December 30, 2014 21:02
Handling the end of persistence
persistSales(sales, t -> {
if(t != null){
LOGGER.error("failed to persist sales: " + sales, t);
}else{
LOGGER.info("persisting completed, notifying involved parties...");
sales.stream().forEach(sale -> {
if (sale.getBuyer().listener != null)
sale.getBuyer().listener.onEvent(EventType.PURCHASE, sale);
if (sale.getSeller().listener != null)
sale.getSeller().listener.onEvent(EventType.SALE, sale);
@maxant
maxant / Main6.java
Last active August 29, 2015 14:12
Extra bits related to persistence
private static final String SQL = "INSERT INTO SALES (BUYER_NAME, SELLER_NAME, PRODUCT_ID, PRICE, QUANTITY, PO_ID, SO_ID) VALUES (?, ?, ?, ?, ?, ?, ?)";
private static final ConnectionPool<MySQLConnection> POOL;
static {
Duration connectTimeout = Duration.apply(5.0, TimeUnit.SECONDS);
Duration testTimeout = Duration.apply(5.0, TimeUnit.SECONDS);
Configuration configuration = new Configuration("root", Main.DB_HOST, 3306, Option.apply("password"), Option.apply("TRADER"), io.netty.util.CharsetUtil.UTF_8, 16777216, PooledByteBufAllocator.DEFAULT, connectTimeout, testTimeout);
MySQLConnectionFactory factory = new MySQLConnectionFactory(configuration);
POOL = new ConnectionPool<MySQLConnection>(factory, new PoolConfiguration(1000, 4, 1000, 4000), Main.system.dispatcher());