/*
* Galaxy
* Copyright (C) 2012 Parallel Universe Software Co.
*
* This file is part of Galaxy.
*
* Galaxy is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* Galaxy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Galaxy. If not, see <http://www.gnu.org/licenses/>.
*/
package co.paralleluniverse.galaxy.jgroups;
import co.paralleluniverse.galaxy.jgroups.ControlChannel;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import co.paralleluniverse.galaxy.Cluster;
import org.jgroups.Address;
import org.jgroups.Global;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.Receiver;
import org.jgroups.ReceiverAdapter;
import static org.hamcrest.CoreMatchers.*;
import org.jgroups.View;
import static org.mockito.Mockito.*;
import static org.mockito.Matchers.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author pron
*/
public class JGroupsTKB {
final static int PORT = 9988;
final static SocketAddress ADDRESS = new InetSocketAddress("127.0.0.1", PORT);
private static volatile boolean clustered = false;
private static final Object lock = new Object();
public static void main(String[] args) throws Exception {
java.util.logging.Logger.getLogger("").setLevel(java.util.logging.Level.FINER);
System.setProperty(Global.CUSTOM_LOG_FACTORY, "mesi.jgroups.SLF4JLogFactory");
//System.setProperty(org.jgroups.Global.USE_JDK_LOGGER, "true");
final Logger log = LoggerFactory.getLogger(JGroupsTKB.class);
Cluster cluster = mock(Cluster.class);
//when(cluster.getNodeId(ADDRESS)).thenReturn((short) 1);
//when(cluster.getSocketAddress((short) 1)).thenReturn(ADDRESS);
JChannel jchannel = new JChannel();
jchannel.setDiscardOwnMessages(true);
ControlChannel control = new ControlChannel(jchannel);
control.setDiscardOwnMessages(true);
jchannel.setReceiver(new ReceiverAdapter() {
@Override
public void receive(Message msg) {
log.info("received: {} headers: {} content: {}", new Object[]{msg, msg.getHeaders(), msg.getObject()});
}
});
control.setReceiver(new ReceiverAdapter() {
@Override
public void receive(Message msg) {
log.info("CONTROL received: {} headers: {} content: {}", new Object[]{msg, msg.getHeaders(), msg.getObject()});
}
@Override
public void viewAccepted(View newView) {
log.info("CONTROL: view: {}", newView);
synchronized (lock) {
clustered = newView.size() > 1;
lock.notifyAll();
}
}
@Override
public void getState(OutputStream output) throws Exception {
log.info("CONTROL: getState()");
}
@Override
public void setState(InputStream input) throws Exception {
log.info("CONTROL: setState()");
}
});
log.info("connecting...");
jchannel.connect("test_cluster");
log.info("connecetd");
synchronized (lock) {
while (!clustered)
lock.wait();
}
log.info("sending data message1");
jchannel.send(message("message1"));
log.info("sending control cmessage1");
control.send(message("cmessage1"));
log.info("sending data message2");
jchannel.send(message("message2"));
log.info("sending control cmessage2");
control.send(message("cmessage2"));
// Thread.sleep(10000);
// jchannel.close();
}
private static Message message(Object payload) {
Message msg = new Message(null, payload);
msg.setFlag(Message.DONT_BUNDLE);
return msg;
}
}