use of org.eclipse.flux.client.RequestResponseHandler in project flux by eclipse.
the class RabbitMQFluxClientTest method testChannelListener.
/**
* Use asynchronous connectToChannel and disconnectFromChannel together with channel listener
* to avoid race condition when sending / receiving messages.
*/
public void testChannelListener() throws Exception {
final String[] channels = { SUPER_USER, "Bob", "Alice" };
final BasicFuture<Void> echoServiceReady = new BasicFuture<>();
//resolves at end of callback spagetti sequence
final BasicFuture<Void> theEnd = new BasicFuture<Void>();
final Process<List<String>> root = new Process<List<String>>(SUPER_USER) {
protected java.util.List<String> execute() throws Exception {
final List<String> receivedMessages = new ArrayList<String>();
echoServiceReady.get();
conn.addMessageHandler(new MessageHandler("echoResponse") {
@Override
public void handle(String type, JSONObject message) {
try {
receivedMessages.add(message.getString("msg"));
} catch (Exception e) {
e.printStackTrace();
}
}
});
conn.addChannelListener(new IChannelListener() {
public void disconnected(String oldChannel) {
String newChannel = nextChannel(oldChannel);
if (newChannel != null) {
conn.connectToChannel(newChannel);
} else {
theEnd.resolve(null);
}
}
@Override
public void connected(final String currentChannel) {
try {
send("echoRequest", new JSONObject().put(USERNAME, currentChannel).put("msg", "Hello on channel " + currentChannel));
//Give some time for response
setTimeout(500, new TimerTask() {
public void run() {
try {
conn.disconnectFromChannel(currentChannel);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private String nextChannel(String oldChannel) {
for (int i = 0; i < channels.length - 1; i++) {
if (channels[i].equals(oldChannel)) {
return channels[i + 1];
}
}
return null;
}
});
conn.disconnectFromChannel(channels[0]);
// must wait until callback spagetti finishes before allowing this process to terminate.
theEnd.get();
return receivedMessages;
}
};
Process<Void> echoService = new Process<Void>(SUPER_USER) {
protected Void execute() throws Exception {
conn.addMessageHandler(new RequestResponseHandler(conn, "echoRequest") {
});
echoServiceReady.resolve(null);
//once main process finished we can finish too
await(root);
return null;
}
;
};
run(echoService, root);
ArrayList<String> expected = new ArrayList<String>();
for (int i = 1; i < channels.length; i++) {
expected.add("Hello on channel " + channels[i]);
}
assertArrayEquals(expected.toArray(), root.result.get().toArray());
}
use of org.eclipse.flux.client.RequestResponseHandler in project flux by eclipse.
the class RabbitMQFluxClientTest method testRequestResponsePattern.
public void testRequestResponsePattern() throws Exception {
final BasicFuture<Void> serviceStarted = new BasicFuture<Void>();
final BasicFuture<Void> quitRequested = new BasicFuture<Void>();
Process<Void> service = new Process<Void>(SUPER_USER) {
protected Void execute() throws Exception {
conn.addMessageHandler(new RequestResponseHandler(conn, "helloRequest") {
@Override
protected JSONObject fillResponse(String type, JSONObject req, JSONObject res) throws Exception {
String cmd = req.getString("cmd");
if ("quit".equals(cmd)) {
quitRequested.resolve(null);
// the message is sent.
return res.put("msg", "Quit request received from " + req.getString(USERNAME));
} else if ("greeting".equals(cmd)) {
return res.put("msg", "Hello " + req.getString(USERNAME));
} else {
throw new IllegalArgumentException("Unkown command: " + cmd);
}
}
});
serviceStarted.resolve(null);
//Wait for quit request
return quitRequested.get();
}
};
Process<Void> bob = new Process<Void>("Bob") {
protected Void execute() throws Exception {
//Bob has to wait for the service to be ready before sending requests to it!
serviceStarted.get();
try {
assertEquals("Hello Bob", sendRequest("helloRequest", new JSONObject().put(USERNAME, "Bob").put("cmd", "greeting"), new ResponseHandler<String>() {
protected String handle(String messageType, JSONObject msg) throws Exception {
return msg.getString("msg");
}
}));
assertError("bogusCommand", asendRequest("helloRequest", new JSONObject().put(USERNAME, "Bob").put("cmd", "bogusCommand"), new ResponseHandler<String>() {
protected String handle(String messageType, JSONObject msg) throws Exception {
return msg.getString("msg");
}
}));
} finally {
conn.send("helloRequest", new JSONObject().put(USERNAME, "Bob").put("cmd", "quit"));
}
return null;
}
};
run(service, bob);
}
Aggregations