⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 advertisementcompactor.java

📁 jxme的一些相关程序,主要是手机上程序开发以及手机和计算机通信的一些程序资料,程序编译需要Ant支持
💻 JAVA
字号:
/*
 * Copyright (c) 2001 Sun Microsystems, Inc.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *       Sun Microsystems, Inc. for Project JXTA."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact Project JXTA at http://www.jxta.org.
 *
 * 5. Products derived from this software may not be called "JXTA",
 *    nor may "JXTA" appear in their name, without prior written
 *    permission of Sun.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL SUN MICROSYSTEMS OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of Project JXTA.  For more
 * information on Project JXTA, please see
 * <http://www.jxta.org/>.
 *
 * This license is based on the BSD license adopted by the Apache Foundation.
 *
 * $Id: AdvertisementCompactor.java,v 1.2 2002/03/04 21:42:56 echtcherbina Exp $
 */


package net.jxta.impl.discovery;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import java.io.IOException;
import org.apache.log4j.Category; import org.apache.log4j.Priority;

import net.jxta.document.TextElement;
import net.jxta.resolver.ResolverService;
import net.jxta.service.Service;
import net.jxta.protocol.*;
import net.jxta.discovery.DiscoveryService;
import net.jxta.peergroup.PeerGroup;
import net.jxta.exception.ServiceNotFoundException;
import net.jxta.impl.peergroup.*;
import net.jxta.impl.protocol.*;

public class AdvertisementCompactor  implements Runnable {
    private static final Category LOG = Category.getInstance(AdvertisementCompactor.class.getName());
    
    /**
     *  The task of this thread is to Compact Peer Advertisements.
     *  The problem arises when  peers take on new identities
     *  could occur when the configuration is removed, or the
     *  the software is started/installed in a different directory.
     *  the mechanism it utilizes is a simple one it looks for
     *  duplicate endpoint for different peers. and ejects one.
     *
     *  One of the ways to enhance this is by using a service or service
     *  like pip to verify which PeerId is associated with the transport
     *
     */
    //XXX enhance hamada@jxta.org
    private PeerGroup myGroup;

    // lets start with every 10 minutes
    // once we have pip we will utilize it to verify a peer
    // and we'll switch to a longer nap
    // this should also be a configurable in the jxtaConfig
    // volunteers who want to take on this task, are welcome
    private int nap = 1000*60*10;
    private DiscoveryService discovery = null;
    private Hashtable table ;

    private Thread myThread = null;
    private boolean stopping = false;
    
    public AdvertisementCompactor(PeerGroup pg) {
        myGroup = pg;
    }
    
    /**
     *  to be called during group initialization
     *  different groups can each have a compactor
     */
    public void init() {
        
        if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("Start AdvertisementCompactor");
        myThread  = new Thread(new AdvertisementCompactor(myGroup),
        "DiscoveryServiceImpl:AdvertisementCompactor" );
        myThread.start();
    }
    
    /**
     * To be called by this service's stopApp() method. Likely because the
     * group is shutting down.
     */
    public void shutdown() {
        stopping = true;
        myThread.interrupt();
        myThread = null;
        // let it die asynchronously; no big deal.
    }

    /**
     *  the simple mechanism, this could use improvements
     *  XXXX improve  hamada@jxta.org
     */
    public void run() {
        try {
            Enumeration peers;

            // In case we weren't actually started by discovery.
            // XXX: jice@jxta.org 20011013 - If this is ALWAYS started
            // by discovery, then the below code is useless: changes
            // in the DiscoveryService startup sequence garantees that discovery
            // is registered with the group at this point.
            while (true) {

                if (stopping) {
                    if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("Compactor thread returns.");
                    return;
                }

                discovery = myGroup.getDiscoveryService();
                if (discovery != null) break;
                doze(nap);
            };


            while (true) {

                if (stopping) {
                    if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("Compactor thread returns.");
                    return;
                }

                table = new Hashtable(128);
                try {
                    peers = discovery.getLocalAdvertisements(discovery.PEER,null,null);
                    while ( (null != peers) && peers.hasMoreElements())  {
                        
                        PeerAdvertisement padv =
                            (PeerAdvertisement) peers.nextElement();
                        if (! padv.getPeerID().equals(myGroup.getPeerID()) ){
                            TextElement e = (TextElement)
                                padv.getServiceParam(PeerGroup.endpointClassID);
                            Enumeration addresses;
                            if (e != null) {
                                addresses = e.getChildren("Addr");
                            } else {
                                addresses = (new Vector()).elements();
                            }
                            if (! addresses.hasMoreElements()) {
                                // let's zap it
                                discovery.flushAdvertisements(
                                    padv.getPeerID().toString(),discovery.PEER);
                                continue;
                            }
                            String addr =
                                ((TextElement)
                                 addresses.nextElement()).getTextValue();

                            if ((table.get(addr)) == null) {
                                if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("adding :" + addr);
                                table.put(addr, padv.getPeerID());
                            } else {
                                if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("duplicate found :" + addr);
                                discovery.flushAdvertisements(
                                    padv.getPeerID().toString(), discovery.PEER);
                                if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("ejecting :" + padv.getPeerID());
                            }
                        }
                    }
                } catch (IOException e ) {
                    if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug(e);
                }
                if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("AdvertisementCompactor Done");
                doze(nap);
            }
        } catch ( Throwable all ) {
            if (LOG.isEnabledFor(Priority.FATAL)) LOG.fatal(  "Uncaught Throwable in thread :"
                      + Thread.currentThread().getName(), all );
        }
    }
    
    
    private void doze(int period){
        try {
            if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug("AdvertisementCompactor hibernating for:"
                      + period/1000/60+" min");
            Thread.sleep(period);
        } catch (Exception e) { }
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -