This can be act as a dynamic proxy. 놀새~ will be using this class to implement Red Hat internal project.


import org.jboss.beans.metadata.api.annotations.Inject;
import org.jboss.logging.Logger;
import org.jboss.naming.NamingService;
import org.jgroups.Address;
import org.jgroups.ChannelException;
import org.jgroups.ChannelNotConnectedException;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;
import org.jgroups.stack.IpAddress;


public class NodeManager {
    
    private int servicePort;
    private String serviceAddress;
        
    
    private static final Logger log = Logger.getLogger(NodeManager.class);
    
    private JChannel channel;
    
    @Inject(bean = "jboss:service=Naming",  dependentState="Start")
    public void setNaming(NamingService naming) {
        this.servicePort = naming.getPort();
    }
    
    
    public String getMasterAddress() {
        return null;
    }
    
    /**
    * udp.xml is using in jgroups sample
    */
    public void create() {
        try {
            channel = new JChannel(NodeManager.class.getResource("/META-INF/udp.xml"));
            channel.setReceiver(new NodeReceiverAdapter());
            
        } catch (ChannelException e) {
            e.printStackTrace();
        }
        
    }
    
    public void start() {
        try {
            channel.connect("demo-cluster");
            
                        
            log.info(channel.getProperties());
            IpAddress ip = (IpAddress) channel.getLocalAddress();
    
            this.serviceAddress = ip.getIpAddress().getHostAddress();
            log.info("Current Node's binding URL : [" + serviceAddress + ":" + servicePort + "]");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    public void stop() {
        channel.disconnect();
        channel.close();
        log.info("Stopping Node Manager");
        
    }
    public void destroy() {
        log.info("Destroy");
    }
    
        
    class NodeReceiverAdapter extends ReceiverAdapter {
        Address dest = null;
        Address local = channel.getLocalAddress();
        public void receive(Message msg) {
            dest = msg.getSrc();
            log.info("received msg from " + msg.getSrc() + ": "    + msg.getObject());
            Message returnMsg = new Message(dest, local, serviceAddress + ":" + servicePort);
            log.info("return current context url is [" + serviceAddress + ":" + servicePort + "]");
                
            try {
                channel.send(returnMsg);
            } catch (ChannelNotConnectedException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        
        public void viewAccepted(View view) {
            log.info("View Accepted - [" + view.getMembers() + "]");
        }
    }
}

크리에이티브 커먼즈 라이센스
Creative Commons License
2009/04/10 08:37 2009/04/10 08:37
http://www.javapattern.info/trackback/241