ejemplo definicion java playframework-2.0 akka

java - ejemplo - jtextpane definicion



Actores y futuros akka: comprensiĆ³n mediante el ejemplo. (2)

Estoy tratando de aprender los actores y futuros de Akka, pero después de leer los documentos en http://akka.io y hacer http://doc.akka.io/docs/akka/2.0.2/intro/getting-started-first-java.html Todavía tengo algunos problemas con la comprensión. Supongo que calcular el valor de Pi es algo que mucha gente puede relacionar también, pero no yo =). He buscado un poco alrededor, pero no he encontrado ningún ejemplo que se adapte a mí. Por lo tanto, pensé que tomaría un código mío de la vida real, lo introduciría aquí y lo cambiaría por un ejemplo de cómo hacer esto con Akka.

Ok así que aquí vamos:

Tengo una aplicación java play2 donde necesito tomar algunos datos de mi DB e indexarlos en mi instancia de elasticsearch.

  1. Llamo a la base de datos y obtengo los identificadores para los lugares.

  2. Luego divido la lista y creo un par de tareas pendientes que se pueden llamar.

  3. Después de eso, invoco todas las tareas en las que cada tarea recopila los lugares para los identificadores asignados desde la db.

  4. Para cada lugar, indícalo a la instancia de elasticsearch y haz que se pueda buscar.

  5. Hecho.

Aplicación.java:

public class Application extends Controller { private static final int VENUE_BATCH = 1000; private static int size; public static Result index() { List<Long> venueIds = DbService.getAllVenueIds(); size = venueIds.size(); Logger.info("Will index " + size + " items in total."); ExecutorService service = Executors.newFixedThreadPool(getRuntime().availableProcessors()); int startIx = 0; Collection<Callable<Object>> indexTasks = new ArrayList<Callable<Object>>(); do { int endIx = Math.min(startIx + VENUE_BATCH, size); List<Long> subList = venueIds.subList(startIx, endIx); VenueIndexTask indexTask = new VenueIndexTask(subList); indexTasks.add(indexTask); } while ((startIx += VENUE_BATCH) < size); Logger.info("Invoking all tasks!"); try { service.invokeAll(indexTasks); } catch (InterruptedException e) { e.printStackTrace(); } return ok(index.render("Done indexing.")); } }

VenueTask:

public class VenueIndexTask implements Callable<Object> { private List<Long> idSubList; public VenueIndexTask(List<Long> idSubList){ this.idSubList = idSubList; Logger.debug("Creating task which will index " + idSubList.size() + " items. " + "Range: " + rangeAsString() + "."); } @Override public Object call() throws Exception { List<Venue> venues = DbService.getVenuesForIds(idSubList); Logger.debug("Doing some indexing: "+venues.size()); for(Venue venue : venues) { venue.index(); } return null; } private String rangeAsString() { return "[" + idSubList.get(0) + "-" + idSubList.get(idSubList.size() - 1) + "]"; } }

Lugar de encuentro:

@IndexType(name = "venue") public class Venue extends Index { private String name; // Find method static for request public static Finder<Venue> find = new Finder<Venue>(Venue.class); public Venue() { } public Venue(String id, String name) { super.id = id; this.name = name; } @Override public Map toIndex() { HashMap map = new HashMap(); map.put("id", super.id); map.put("name", name); return map; } @Override public Indexable fromIndex(Map map) { if (map == null) { return this; } this.name = (String) map.get("name"); return this; } }

¡Así que todos ustedes, gente Akka, se vuelven locos! Y, por favor, haga todo lo que pueda, proponga una funcionalidad de futuros geniales que pueda usarse o cualquier otro conocimiento / código que pueda usar para aprender esto.


Coursera actualmente dirige un curso sobre programación reactiva que tiene las 3 últimas conferencias sobre Akka y el modelo de actor. Esto incluye conferencias de video y tareas (en Scala, aunque no en Java). Si bien es demasiado tarde para recibir el certificado completo, aún puede unirse al curso y simplemente revisar las últimas tres semanas.

https://class.coursera.org/reactive-001/class


Lo que me gusta de Akka (o cualquier otro sistema basado en mensajes) es pensar como una cinta transportadora, como en las fábricas. Una forma simplificada de pensar en Actores podría ser tomar una Orden de pizza.

  • Usted, el cliente hambriento (Actor / Rol) envía una orden (Un Mensaje) a Pizza Shop

  • El servicio al cliente (actor / rol) toma su pedido, le da el número de pedido (futuro)

  • Si estaba impaciente, es posible que haya esperado en el teléfono / internet / tienda hasta que haya recibido su pizza (una transacción sincrónica / bloqueadora) de lo contrario, estaría contento con el número de pedido y un chequeo de la misma más tarde (sin bloqueo)

  • El servicio al cliente envía el mensaje a los Chefs (Actor) bajo la supervisión de Kitchen Manager (Actor). Esta es una cocina muy procesada muy pesada, con jerarquía. A Akka le gusta eso. Ver Supervision

  • Chef crea una pizza nueva y adjunta los detalles del pedido (Un mensaje nuevo) y se lo pasa al chico de entrega (Actor) a través del gerente de entrega (Actor supervisor).

  • Durante este proceso, los detalles de su pedido no han cambiado, eso sería una pesadilla. ¡No serías feliz si tuvieras pepperoni si quisieras queso simple! ¡Todos los mensajes deben ser inmutables! Sin embargo, puede ser que el mensaje sea diferente para diferentes actores. Un repartidor esperaría una pizza y los detalles del pedido adjuntos, el chef esperaría un pedido. Cuando un mensaje necesita cambiar, se crea un nuevo mensaje.

  • Cada actor es bueno en un rol, ¿qué tan efectivo sería si un hombre tuviera que hacer todas las tareas? Puede ser que algunos actores superen a otros (por ejemplo, 10 hilos para chefs, 2 para repartidores, 1 servicio al cliente).

  • El comportamiento de bloqueo es un dolor, imagina que el servicio al cliente está esperando al chef y al repartidor antes de ver al próximo cliente.

Espero haberte ayudado un poco, este es un gran tema y un gran cambio de mentalidad. Buena suerte