use of org.eclipse.flux.client.MessageHandler 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.MessageHandler in project flux by eclipse.
the class InitializeServiceEnvironment method start.
public void start() {
getProjectsResponseHandler = new CallbackIDAwareMessageHandler("getProjectsResponse", GET_PROJECTS_CALLBACK) {
@Override
public void handle(String messageType, JSONObject message) {
handleGetProjectsResponse(message);
}
};
messagingConnector.addMessageHandler(getProjectsResponseHandler);
projectConnectedHandler = new MessageHandler("projectConnected") {
@Override
public void handle(String messageType, JSONObject message) {
handleProjectConnected(message);
}
};
messagingConnector.addMessageHandler(projectConnectedHandler);
try {
JSONObject message = new JSONObject();
message.put("username", repository.getUsername());
message.put("callback_id", GET_PROJECTS_CALLBACK);
this.messagingConnector.send("getProjectsRequest", message);
} catch (Exception e) {
e.printStackTrace();
}
}
use of org.eclipse.flux.client.MessageHandler in project flux by eclipse.
the class RabbitMQFluxClientTest method testChannelSwitchingMessageReception.
/**
* Test that super user can connect and disconnect channels to
* switch between users.
* <p>
* This basic test only swtiches channels and verifies the 'isConnected'
* state follows suite. It does not verify whether message delivery is
* changed according connected channels.
*/
public void testChannelSwitchingMessageReception() throws Exception {
final String[] users = { "Bob", "Alice" };
/**
* Resolves when the root process is connected to corresponding channel
*/
final List<BasicFuture<Void>> channelSynch = new ArrayList<BasicFuture<Void>>();
for (final String user : users) {
channelSynch.add(new BasicFuture<Void>());
final Process<Void> userProcess = new Process<Void>(user) {
protected Void execute() throws Exception {
for (int i = 0; i < users.length; i++) {
String currentChannel = users[i];
//wait for root to switch to this channel.
channelSynch.get(i).get();
send("bork", new JSONObject().put(USERNAME, user).put("msg", user + " -> " + currentChannel));
}
return null;
}
;
};
userProcess.start();
}
Process<List<String>> root = new Process<List<String>>(SUPER_USER) {
protected List<String> execute() throws Exception {
final List<String> receivedMessages = new ArrayList<String>();
assertTrue(conn.isConnected(SUPER_USER));
conn.disconnectFromChannelSync(SUPER_USER);
assertFalse(conn.isConnected(SUPER_USER));
conn.addMessageHandler(new MessageHandler("bork") {
@Override
public void handle(String type, JSONObject message) {
try {
receivedMessages.add(message.getString("msg"));
} catch (Exception e) {
e.printStackTrace();
}
}
});
for (int i = 0; i < users.length; i++) {
String currentChannel = users[i];
if (i > 0) {
String previousChannel = users[i - 1];
System.out.println("Previous channel = " + previousChannel);
conn.disconnectFromChannelSync(previousChannel);
}
conn.connectToChannelSync(currentChannel);
//Check channel connected state(s)
for (String channel : users) {
boolean isConnected = conn.isConnected(channel);
assertEquals("[" + currentChannel + "] " + channel + " isConnected? " + isConnected, channel.equals(currentChannel), isConnected);
}
channelSynch.get(i).resolve(null);
//Allow some time for user processes to send messages while root is connected to this channel.
Thread.sleep(500);
}
return receivedMessages;
}
};
run(root);
List<String> results = root.result.get();
String[] expectedMessages = new String[users.length];
for (int i = 0; i < expectedMessages.length; i++) {
expectedMessages[i] = users[i] + " -> " + users[i];
}
assertArrayEquals(expectedMessages, results.toArray());
}
Aggregations