/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.catalina.tribes.demos;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.catalina.tribes.Channel;
import org.apache.catalina.tribes.ManagedChannel;
import org.apache.catalina.tribes.Member;
import org.apache.catalina.tribes.MembershipListener;
import org.apache.catalina.tribes.util.Arrays;
import org.apache.catalina.tribes.util.UUIDGenerator;
public class MembersWithProperties implements MembershipListener{
static Thread main;
public MembersWithProperties(Channel channel, Properties props) throws IOException {
channel.addMembershipListener(this);
ManagedChannel mchannel = (ManagedChannel)channel;
mchannel.getMembershipService().setPayload(getPayload(props));
}
byte[] getPayload(Properties props) throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
props.store(bout,"");
return bout.toByteArray();
}
Properties getProperties(byte[] payload) throws IOException {
ByteArrayInputStream bin = new ByteArrayInputStream(payload);
Properties props = new Properties();
props.load(bin);
return props;
}
@Override
public void memberAdded(Member member) {
try {
System.out.println("Received member added:"+member);
System.out.println("Payload["+member+"] :");
getProperties(member.getPayload()).store(System.out,"");
}catch ( Exception x ) {
x.printStackTrace();
}
}
@Override
public void memberDisappeared(Member member) {
try {
System.out.println("Received member disappeared:"+member);
System.out.println("Payload["+member+"] :");
getProperties(member.getPayload()).store(System.out,"");
}catch ( Exception x ) {
x.printStackTrace();
}
}
public static void usage() {
System.out.println("Tribes Member Properties demo.");
System.out.println("Usage:\n\t" +
"java MemberWithProperties \n\t" +
"Channel options:" +
ChannelCreator.usage() + "\n\n" +
"Example:\n\t" +
"java MembersWithProperties -port 4004\n\t" +
"java MembersWithProperties -bind 192.168.0.45 -port 4005\n\t" +
"java MembersWithProperties -bind 192.168.0.45 -port 4005 -mbind 192.168.0.45 -count 100 -stats 10\n");
}
@SuppressWarnings("unused")
public static void main(String[] args) throws Exception {
if (args.length==0) usage();
main = Thread.currentThread();
ManagedChannel channel = (ManagedChannel) ChannelCreator.createChannel(args);
Properties props = new Properties();
props.setProperty("mydomainkey","mydomainvalue");
props.setProperty("someotherkey", Arrays.toString(UUIDGenerator.randomUUID(true)));
new MembersWithProperties(channel, props);
channel.start(Channel.DEFAULT);
Runtime.getRuntime().addShutdownHook(new Shutdown(channel));
try {
Thread.sleep(Long.MAX_VALUE);
}catch(InterruptedException ix) {
Thread.sleep(5000);//allow everything to shutdown
}
}
public static class Shutdown extends Thread {
ManagedChannel channel = null;
public Shutdown(ManagedChannel channel) {
this.channel = channel;
}
@Override
public void run() {
System.out.println("Shutting down...");
try {
channel.stop(Channel.DEFAULT);
} catch (Exception x) {
x.printStackTrace();
}
System.out.println("Channel stopped.");
main.interrupt();
}
}
}