http://wiki4.caucho.com/index.php?title=Getting_started_with_Makai/JAMP&feed=atom&action=history
Getting started with Makai/JAMP - Revision history
2024-03-28T14:01:57Z
Revision history for this page on the wiki
MediaWiki 1.18.0
http://wiki4.caucho.com/index.php?title=Getting_started_with_Makai/JAMP&diff=1085&oldid=prev
Rick at 02:54, 28 June 2013
2013-06-28T02:54:42Z
<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black;">Revision as of 02:54, 28 June 2013</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 518:</td>
<td colspan="2" class="diff-lineno">Line 518:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>[[Using Makai Persistence aka Getting Started with Makai/JAMP part II]]</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>[[Using Makai Persistence aka Getting Started with Makai/JAMP part II]]</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">[[Using Makai event model from HTML 5 Calling JavaScript from Java part III]]</ins></div></td></tr>
</table>
Rick
http://wiki4.caucho.com/index.php?title=Getting_started_with_Makai/JAMP&diff=1081&oldid=prev
Rick at 00:28, 19 June 2013
2013-06-19T00:28:14Z
<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black;">Revision as of 00:28, 19 June 2013</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 516:</td>
<td colspan="2" class="diff-lineno">Line 516:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div></pre></div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div></pre></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">[[Using Makai Persistence aka Getting Started with Makai/JAMP part II]]</ins></div></td></tr>
</table>
Rick
http://wiki4.caucho.com/index.php?title=Getting_started_with_Makai/JAMP&diff=1080&oldid=prev
Rick at 08:50, 16 June 2013
2013-06-16T08:50:22Z
<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black;">Revision as of 08:50, 16 June 2013</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 507:</td>
<td colspan="2" class="diff-lineno">Line 507:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div><pre></div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div><pre></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del style="color: red; font-weight: bold; text-decoration: none;">["reply",{},"me",1,"buy milk--4566919316225680390-1371372542772964000-7"]</del></div></td><td colspan="2"> </td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div><del style="color: red; font-weight: bold; text-decoration: none;"></del></div></td><td colspan="2"> </td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>["query",{},"me",1,"/taskService","addTask","buy milk"]</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>["query",{},"me",1,"/taskService","addTask","buy milk"]</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">["reply",{},"me",1,"buy milk--4566919316225680390-1371372542772964000-7"]</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>["query",{},"me",2,"/taskService","addTask","call wife"]</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>["query",{},"me",2,"/taskService","addTask","call wife"]</div></td></tr>
</table>
Rick
http://wiki4.caucho.com/index.php?title=Getting_started_with_Makai/JAMP&diff=1079&oldid=prev
Rick: Created page with " ==Brief introduction to Makai and JAMP== Makai (TM) is not the final name for this technology. Makai (TM) is a services model based on concepts of high speed, mechanical sym..."
2013-06-16T08:49:47Z
<p>Created page with " ==Brief introduction to Makai and JAMP== Makai (TM) is not the final name for this technology. Makai (TM) is a services model based on concepts of high speed, mechanical sym..."</p>
<p><b>New page</b></p><div><br />
==Brief introduction to Makai and JAMP==<br />
<br />
Makai (TM) is not the final name for this technology. Makai (TM) is a services model based on concepts of high speed, mechanical sympathy computing. Underneath the covers, Makai (TM) is a super charged race engine for maximizing throughput. It is an inherently non-blocking, multithreaded model. It is similar in concept to the LMAX disruptor, apartment thread model, actor model and active objects model. It is none of these, and it is all of these. <br />
<br />
From a developer standpoint Makai (TM) allows you to write services that look like regular Java services. It takes care of thread management, marshaling (JSON or Hessian), and many more things that we will introduce later. Makai (TM) is super charged SOA. With Makai (TM), you can even turn on journaling and use its high speed, reliable async storage to manage all of your operational data with speeds up to 1,000,000 operations per second on commodity server hardware and several million operations per second with souped up servers.<br />
<br />
Makai (TM) services that you write can be accessible within a JVM, or via REST or Websockets.<br />
<br />
<br />
==Example Java App to manage a TODO list==<br />
<br />
<pre><br />
package example;<br />
<br />
<br />
import io.makai.core.Export;<br />
import io.makai.core.Service;<br />
<br />
import java.util.HashSet;<br />
import java.util.Set;<br />
<br />
<br />
@Service("/taskService")<br />
@Export<br />
public class TaskService {<br />
<br />
TaskManager manager = new TaskManager();<br />
OwnerRepo repo = new OwnerRepo();<br />
Group group = new Group(repo, "shared");<br />
<br />
public String addTask(String taskName) {<br />
Task task = new Task(taskName);<br />
manager.addTask(group, task);<br />
return task.id();<br />
}<br />
<br />
public boolean changeDescription(String id, String description) {<br />
Task task = manager.getTaskBy(id);<br />
task.setDescription(description);<br />
return true;<br />
}<br />
<br />
<br />
public Set<TaskData> tasks() {<br />
Set<TaskData> taskData = new HashSet<>();<br />
<br />
for (Task task : manager.tasks()) {<br />
taskData.add(new TaskData(task)) ;<br />
}<br />
return taskData;<br />
}<br />
<br />
}<br />
<br />
</pre><br />
<br />
Files for this project:<br />
<pre><br />
.<br />
├── makaiExample.iml<br />
├── pom.xml<br />
├── taskListModel<br />
│ ├── model.iml<br />
│ ├── pom.xml<br />
│ ├── src<br />
│ │ ├── main<br />
│ │ │ ├── java<br />
│ │ │ │ └── example<br />
│ │ │ │ ├── Group.java<br />
│ │ │ │ ├── OwnerRepo.java<br />
│ │ │ │ ├── Person.java<br />
│ │ │ │ ├── Task.java<br />
│ │ │ │ ├── TaskManager.java<br />
│ │ │ │ ├── TaskOwner.java<br />
│ │ │ │ └── Utils.java<br />
│ │ │ └── resources<br />
│ │ └── test<br />
│ │ └── java<br />
│ │ └── io<br />
│ │ └── jamp<br />
│ │ └── example<br />
│ │ └── model<br />
│ │ └── TaskManagerTest.java<br />
│ └── taskListModel.iml<br />
└── taskListService<br />
├── pom.xml<br />
├── src<br />
│ └── main<br />
│ ├── java<br />
│ │ ├── example<br />
│ │ │ ├── TaskData.java<br />
│ │ │ └── TaskService.java<br />
│ │ └── io<br />
│ │ └── makai<br />
│ │ └── example<br />
│ ├── resources<br />
│ │ └── META-INF<br />
│ │ └── beans.xml<br />
│ └── webapp<br />
│ ├── META-INF<br />
│ │ └── MANIFEST.MF<br />
│ ├── WEB-INF<br />
│ │ └── resin-web.xml<br />
│ └── todo.html<br />
└── taskListService.iml<br />
</pre><br />
<br />
Support classes, Task.java and TaskManager.java<br />
<br />
<pre><br />
package example;<br />
<br />
<br />
import java.util.Random;<br />
<br />
public class Task {<br />
<br />
private static final String NULL = "NULL";<br />
<br />
private static int count =0;<br />
private long timestamp;<br />
private String objectId=NULL;<br />
private String name=NULL;<br />
private String description=NULL;<br />
private TaskOwner owner = TaskOwner.NO_OWNER;<br />
<br />
public Task task(String name) {<br />
Task task = new Task(name);<br />
return task;<br />
}<br />
public Task(String name) {<br />
this.timestamp = System.currentTimeMillis();<br />
this.name = name;<br />
this.objectId = String.format("%s-%s-%s-%s",<br />
name, new Random().nextLong(), System.nanoTime(), count++);<br />
}<br />
<br />
public TaskOwner owner() {return owner;}<br />
public String id() {return objectId;}<br />
<br />
public void setOwner(TaskOwner owner) {<br />
this.owner = owner;<br />
}<br />
<br />
public String getName() {<br />
return name;<br />
}<br />
<br />
public void setName(String name) {<br />
this.name = name;<br />
}<br />
<br />
public String getDescription() {<br />
return description;<br />
}<br />
<br />
public void setDescription(String description) {<br />
this.description = description;<br />
}<br />
<br />
@Override<br />
public boolean equals(Object o) {<br />
Task task = (Task) o;<br />
if (objectId != null ? !objectId.equals(task.objectId) : task.objectId != null) return false;<br />
return true;<br />
}<br />
<br />
@Override<br />
public int hashCode() {<br />
return objectId.hashCode();<br />
}<br />
<br />
@Override<br />
public String toString() {<br />
return "Task{" +<br />
"timestamp=" + timestamp +<br />
", objectId='" + objectId + '\'' +<br />
", name='" + name + '\'' +<br />
", description='" + description + '\'' +<br />
", owner=" + owner +<br />
'}';<br />
}<br />
<br />
public long getTimestamp() {<br />
return timestamp;<br />
}<br />
}<br />
<br />
</pre><br />
<br />
<pre><br />
package example;<br />
<br />
import java.util.*;<br />
<br />
public class TaskManager {<br />
<br />
private Set<Task> tasks = new HashSet<Task>();<br />
private transient Map<TaskOwner, Set<Task>> ownerToTaskMap = new HashMap<>();<br />
private transient Map<String, Task> idToTask = new HashMap<>();<br />
<br />
public void addTask(TaskOwner owner, Task task) {<br />
task.setOwner(owner);<br />
tasks.add(task);<br />
<br />
Set<Task> ownerTasks = ownerToTaskMap.get(owner);<br />
if (ownerTasks == null) {<br />
ownerTasks = new HashSet<>();<br />
}<br />
ownerTasks.add(task);<br />
idToTask.put(task.id(), task);<br />
<br />
}<br />
<br />
public void removeTask(Task task) {<br />
tasks.remove(task);<br />
idToTask.remove(task.id());<br />
<br />
Set<Task> ownerTasks = ownerToTaskMap.get(task.owner());<br />
if (ownerTasks == null) {<br />
ownerTasks = new HashSet<>();<br />
}<br />
ownerTasks.remove(task);<br />
<br />
}<br />
<br />
public Set<Task> tasks() {<br />
return tasks;<br />
}<br />
<br />
public Set<Task> listTasksForOwner(TaskOwner doer) {<br />
return ownerToTaskMap.get(doer);<br />
}<br />
<br />
public Task getTaskBy(String id) {<br />
return idToTask.get(id);<br />
}<br />
}<br />
<br />
</pre><br />
<br />
<pre><br />
<html><br />
<br />
<head><br />
<br />
<title>Todo List Client</title><br />
<br />
<link rel="stylesheet" type="text/css" href="css/style.css"<br />
media="screen" /><br />
<br />
<br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script><br />
<br />
<br />
<script type="text/javascript"><br />
var ENTER_KEY = '13';<br />
var messageId = 1;<br />
var calls = new Array();<br />
<br />
var todoService = {<br />
version : "1.0",<br />
webSocketURL : buildWebSocketURL(),<br />
webSocket : null,//WebSocket<br />
userName : null<br />
};<br />
<br />
<br />
function invokeJampMethod(serviceName, methodName, callback, args) {<br />
<br />
var list = new Array();<br />
list.push("query");<br />
list.push({});<br />
list.push("me");<br />
list.push(messageId);<br />
list.push(serviceName);<br />
list.push(methodName);<br />
for (var index=0; index < args.length; index++) {<br />
var obj = args[index];<br />
list.push(obj);<br />
}<br />
<br />
if (todoService.webSocket.readyState == WebSocket.OPEN) {<br />
<br />
todoService.webSocket.send(JSON.stringify(list));<br />
<br />
todoService.status(JSON.stringify(list));<br />
<br />
$("#tasks").prepend("<p style='color:black'>" + JSON.stringify(list) + "</p>");<br />
<br />
<br />
var call = {<br />
queryId: messageId,<br />
"serviceName": serviceName,<br />
"methodName" : methodName,<br />
func: callback,<br />
"args": args};<br />
<br />
calls[messageId]=call;<br />
<br />
} else {<br />
todoService.status("websocket unable to send ");<br />
}<br />
messageId++;<br />
}<br />
<br />
<br />
function buildWebSocketURL() {<br />
var url = document.URL;<br />
var parts = url.split('/');<br />
var scheme = parts[0];<br />
var hostPort = parts[2];<br />
var wssScheme = null;<br />
<br />
<br />
if (scheme=="http:") {<br />
wssScheme="ws:";<br />
} else if (scheme=="https:") {<br />
wssScheme="wss:";<br />
}<br />
<br />
wssUrl = wssScheme + "//" + hostPort + "/tasks/jamp";<br />
<br />
//wssUrl = "ws://localhost:8080/tasks/jamp";<br />
<br />
return wssUrl;<br />
<br />
}<br />
<br />
<br />
<br />
function todo_createTask(taskName) {<br />
var myargs = new Array();<br />
myargs.push(taskName);<br />
invokeJampMethod("/taskService", "addTask", showReturnFromServer, myargs);<br />
}<br />
<br />
function showReturnFromServer(data, call) {<br />
$("#tasks").prepend("<p style='color:blue'>" + data + "</p>");<br />
var taskName = call.args[0];<br />
$("#taskList").append("<p style='color:blue'>" + taskName + "</p>");<br />
<br />
}<br />
<br />
<br />
function todo_openWebSocket() {<br />
todoService.webSocket = new WebSocket(todoService.webSocketURL);<br />
var socket = todoService.webSocket;<br />
<br />
socket.onmessage = function(msg) {<br />
todoService.onMessage(msg);<br />
}<br />
<br />
socket.onerror = function(errorEvent) {<br />
todoService.onError(errorEvent);<br />
}<br />
<br />
socket.onopen = function() {<br />
todoService.onOpen();<br />
}<br />
socket.onclose = function(closeEvent) {<br />
todoService.onClose(closeEvent);<br />
}<br />
<br />
}<br />
<br />
<br />
function todo_onOpen() {<br />
todoService.status("Todo Client (logged in)");<br />
$('#header').text(<br />
"Todo Client (logged in...)");<br />
<br />
$("#inputArea").show(500);<br />
$("#statusBar").show(500);<br />
$("#todoNameInput").focus();<br />
}<br />
<br />
<br />
function todo_Status(message) {<br />
$("#statusBar").show(500);<br />
$('#statusBarPara1').text(message);<br />
<br />
$("#statusBar").show(500);<br />
<br />
}<br />
<br />
function todo_onMessage(msgEvent) {<br />
$('#onMessageBar').text(msgEvent.data);<br />
<br />
<br />
var list = JSON.parse(msgEvent.data);<br />
<br />
if (list[0] == "reply") {<br />
replyRecieved(list[3], list[4], msgEvent.data);<br />
} else {<br />
}<br />
<br />
}<br />
<br />
function replyRecieved (qid, returnValue, data) {<br />
var call = calls[qid];<br />
call.func(data, call);<br />
<br />
}<br />
<br />
<br />
function todo_onError(msg) {<br />
// $('#statusBarPara1').text(" Websocket error :" + JSON.stringfy(msg));<br />
// $("#statusBar").show(500);<br />
}<br />
<br />
<br />
function todo_onClose(closeEvent) {<br />
$('#header').text(<br />
"Todo Client (not connected) " );<br />
<br />
<br />
$('#statusBarPara1').text(" not logged in. " +<br />
":: Reason: " + closeEvent.reason +<br />
" Code: " + closeEvent.code);<br />
<br />
$("#inputArea").hide(500);<br />
$("#statusBar").show(500);<br />
<br />
}<br />
<br />
todoService.open = todo_openWebSocket;<br />
todoService.onMessage = todo_onMessage;<br />
todoService.onOpen = todo_onOpen;<br />
todoService.onClose = todo_onClose;<br />
todoService.onError = todo_onError;<br />
todoService.createTask = todo_createTask;<br />
todoService.status = todo_Status;<br />
<br />
$(document).ready(function() {<br />
<br />
todoService.open();<br />
<br />
<br />
<br />
<br />
$("#inputArea").show();<br />
<br />
<br />
<br />
$("#statusBar").click(function() {<br />
$("#statusBar").hide(300);<br />
});<br />
<br />
$("#todoNameInput").keypress(function(event) {<br />
<br />
var keycode = (event.keyCode ? event.keyCode : event.which);<br />
if (keycode == ENTER_KEY) {<br />
var textMessage = $("#todoNameInput").val();<br />
<br />
if (textMessage=="bye!") {<br />
todoService.leaveChat();<br />
} else {<br />
$("#todoNameInput").val("");<br />
$("#hint").hide(500);<br />
todoService.createTask(textMessage);<br />
}<br />
}<br />
event.stopPropagation();<br />
});<br />
});<br />
</script><br />
<br />
</head><br />
<br />
<body><br />
<br />
<h1 id="header">Todo</h1><br />
<br />
<br />
<div id="statusBar"><br />
<p id="statusBarPara1">Welcome to Todo App, Click to hide</p><br />
</div><br />
<br />
<div id="onMessageBar"><br />
<p id="onMessageBar1"></p><br />
</div><br />
<br />
<br />
<div id="inputArea"><br />
<p id="hint">Enter a new task in here:</p><br />
<input id="todoNameInput" type="text" value="" /><br />
</div><br />
<br />
<div id="tasksDiv"><br />
<p id="tasks"></p><br />
</div><br />
<br />
<div id="taskListDiv"><br />
<p id="taskList"></p><br />
</div><br />
<br />
<br />
</body><br />
<br />
</html><br />
</pre><br />
<br />
<br />
JAMP in a nutshell<br />
<br />
<pre><br />
["reply",{},"me",1,"buy milk--4566919316225680390-1371372542772964000-7"]<br />
<br />
["query",{},"me",1,"/taskService","addTask","buy milk"]<br />
<br />
["query",{},"me",2,"/taskService","addTask","call wife"]<br />
<br />
["reply",{},"me",2,"call wife-7108026654197322644-1371372545793514000-8"]<br />
<br />
</pre></div>
Rick