I have tried this with the latest 7.3.1 and also tried to simplify my client (node.js) code I am still getting errors, not every but most runs. However now I am getting a stack trace back in the server protocol info message. This is coming on the event port
I have an event "messenger" defined and then run code
var session1 = new basex.Session("localhost", 1984, "admin", "admin");
var session2 = new basex.Session("localhost", 1984, "admin", "admin");
session2.watch("messenger", watchCallback, this)
// below forced to run after above
session1.execute("XQUERY db:event('messenger', 99)", this);
----------
// called on receipt of event
function watchCallback(name, msg) {
session1.close(this);
session2.close(this);
};
--------- the info message on the event port ---
Improper use? Potential bug? Your feedback is welcome:
Contact: basex-talk@mailman.uni-konstanz.de
Version: BaseX 7.3.1 beta
Java: Sun Microsystems Inc., 1.6.0_26
OS: Linux, i386
Stack Trace:
java.lang.NullPointerException
org.basex.server.ClientListener.notify(ClientListener.java:296)
org.basex.core.Events.notify(Events.java:114)
org.basex.query.func.FNDb.event(FNDb.java:689)
org.basex.query.func.FNDb.item(FNDb.java:100)
org.basex.query.expr.ParseExpr.iter(ParseExpr.java:45)
org.basex.query.func.FNDb.iter(FNDb.java:85)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.QueryContext.iter(QueryContext.java:244)
org.basex.query.QueryProcessor.iter(QueryProcessor.java:76)
org.basex.core.cmd.AQuery.query(AQuery.java:94)
org.basex.core.cmd.XQuery.run(XQuery.java:22)
org.basex.core.Command.run(Command.java:363)
org.basex.core.Command.exec(Command.java:342)
org.basex.core.Command.execute(Command.java:78)
org.basex.server.ClientListener.run(ClientListener.java:150)
-----------------------------------------------------------
Any ideas?
/Andy
I have made some progress on this...
I think the protocol response to the watch is in fact {port}{id}\0
Where {port} is a basex server port to connect in order to receive events and {id} some identifier.
The client should connect to the port and send {id}\0. The response is \0. After this the connection will receive events in the form {name}{msg}
I have implemented this in node.js. One difficulty is the very asynchronous nature of node
I have tried to recreate something based on the c# example in node allowing for this. It runs fine the first time after the server is started, in subsequent runs the event is never received.
The log from the 1st run is21:19:01.858 [127.0.0.1:38155] LOGIN admin OK 21:19:01.861 [127.0.0.1:38156] LOGIN test1 OK 21:19:02.003 [127.0.0.1:38155] CREATE EVENT messenger 21:19:02.005 [127.0.0.1:38155] OK 143.0 ms 21:19:02.027 [127.0.0.1:38156] OK 13.41 ms 21:19:02.247 [127.0.0.1:38156] QUERY(0) for $i in 1 to 1000000 where $i=3 return $i OK 219.51 ms 21:19:02.248 [127.0.0.1:38156] QUERY(0) OK 0.5 ms 21:19:02.252 [127.0.0.1:38155] QUERY(0) db:event('messenger', 'Hello World!') OK 230.45 ms 21:19:02.254 [127.0.0.1:38155] QUERY(0) OK 0.76 ms 21:19:02.584 [127.0.0.1:38155] EXEC(0) OK 329.22 ms 21:19:02.943 [127.0.0.1:38156] EXEC(0) OK 694.17 ms 21:19:02.945 [127.0.0.1:38156] OK 0.34 ms 21:19:03.004 [127.0.0.1:38155] DROP EVENT messenger 21:19:03.005 [127.0.0.1:38155] OK 2.18 ms 21:19:03.006 [127.0.0.1:38155] EXIT 21:19:03.011 [127.0.0.1:38155] OK 6.03 ms 21:19:03.012 [127.0.0.1:38155] LOGOUT admin OK 21:19:03.014 [127.0.0.1:38156] EXIT 21:19:03.019 [127.0.0.1:38156] OK 6.57 ms 21:19:03.020 [127.0.0.1:38156] LOGOUT test1 OKThe problem seems to EXEC(0) Error: null
The next run gives
19:16.106 [127.0.0.1:38158] LOGIN admin OK 21:19:16.112 [127.0.0.1:38158] CREATE EVENT messenger 21:19:16.115 [127.0.0.1:38158] OK 27.79 ms 21:19:16.151 [127.0.0.1:38159] LOGIN test1 OK 21:19:16.192 [127.0.0.1:38158] QUERY(0) db:event('messenger', 'Hello World!') OK 0.98 ms 21:19:16.200 [127.0.0.1:38158] QUERY(0) OK 7.4 ms 21:19:16.207 [127.0.0.1:38159] OK 0.65 ms 21:19:16.220 [127.0.0.1:38159] QUERY(0) for $i in 1 to 1000000 where $i=3 return $i OK 7.77 ms 21:19:16.231 [127.0.0.1:38159] QUERY(0) OK 4.3 ms 21:19:16.253 [127.0.0.1:38158] EXEC(0) Error: null 21:19:16.732 [127.0.0.1:38159] EXEC(0) OK 459.42 ms 21:19:20.036 [127.0.0.1:38158] LOGOUT admin OK 21:19:20.042 [127.0.0.1:38159] LOGOUT test1 OK
Any ideas what the cause might be or how I can debug this further.
/AndyOn Thu, May 17, 2012 at 12:04 PM, Andreas Weiler <andreas.weiler@uni-konstanz.de> wrote:
Hi Andy,yes you are right, the server response is a standard basex info message.1) The documentation at http://docs.basex.org/wiki/Server_Protocol shows nothing in the Server Response column. This seems not to be the case. It looks like a standard BaseX protocol type response is to be expected?2) The example at https://github.com/BaseXdb/basex-examples/blob/master/src/main/java/org/basex/examples/api/EventExample.java shows session2 watching and then executing. Does the server protocol identify "event pushes" in some way. That is when I receive a message how can I tell if is a event or a command response?the event reponse is send over a separate socket connection.-- AndreasAm 17.05.2012 um 12:22 schrieb Andy Bunce:_______________________________________________Hi,
I am looking at adding WATCH and UNWATCH to my Node.js BaseX interface and I have a couple of questions before I start.
1) The documentation at http://docs.basex.org/wiki/Server_Protocol shows nothing in the Server Response column. This seems not to be the case. It looks like a standard BaseX protocol type response is to be expected?
2) The example at https://github.com/BaseXdb/basex-examples/blob/master/src/main/java/org/basex/examples/api/EventExample.java shows session2 watching and then executing. Does the server protocol identify "event pushes" in some way. That is when I receive a message how can I tell if is a event or a command response?
/Andy
BaseX-Talk mailing list
BaseX-Talk@mailman.uni-konstanz.de
https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk