mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-07 06:44:16 +00:00
Clean up Peer callback API.
Resolves issue 220.
This commit is contained in:
parent
4d58ea5111
commit
0a9f529f72
@ -37,6 +37,13 @@ import java.util.concurrent.*;
|
||||
* <p>{@link Peer#getHandler()} is part of a Netty Pipeline with a Bitcoin serializer downstream of it.
|
||||
*/
|
||||
public class Peer {
|
||||
public interface PeerLifecycleListener {
|
||||
/** Called when the peer is connected */
|
||||
public void onPeerConnected(Peer peer);
|
||||
/** Called when the peer is disconnected */
|
||||
public void onPeerDisconnected(Peer peer);
|
||||
}
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(Peer.class);
|
||||
public static final int CONNECT_TIMEOUT_MSEC = 60000;
|
||||
|
||||
@ -48,6 +55,7 @@ public class Peer {
|
||||
private final List<GetDataFuture<Block>> pendingGetBlockFutures;
|
||||
private PeerAddress address;
|
||||
private List<PeerEventListener> eventListeners;
|
||||
private List<PeerLifecycleListener> lifecycleListeners;
|
||||
// Whether to try and download blocks and transactions from this peer. Set to false by PeerGroup if not the
|
||||
// primary peer. This is to avoid redundant work and concurrency problems with downloading the same chain
|
||||
// in parallel.
|
||||
@ -86,6 +94,7 @@ public class Peer {
|
||||
this.versionMessage = ver;
|
||||
this.pendingGetBlockFutures = new ArrayList<GetDataFuture<Block>>();
|
||||
this.eventListeners = new CopyOnWriteArrayList<PeerEventListener>();
|
||||
this.lifecycleListeners = new CopyOnWriteArrayList<PeerLifecycleListener>();
|
||||
this.fastCatchupTimeSecs = params.genesisBlock.getTimeSeconds();
|
||||
this.isAcked = false;
|
||||
this.handler = new PeerHandler();
|
||||
@ -109,6 +118,14 @@ public class Peer {
|
||||
return eventListeners.remove(listener);
|
||||
}
|
||||
|
||||
public synchronized void addLifecycleListener(PeerLifecycleListener listener) {
|
||||
lifecycleListeners.add(listener);
|
||||
}
|
||||
|
||||
public synchronized boolean removeLifecycleListener(PeerLifecycleListener listener) {
|
||||
return lifecycleListeners.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells the peer to insert received transactions/transaction announcements into the given {@link MemoryPool}.
|
||||
* This is normally done for you by the {@link PeerGroup} so you don't have to think about it. Transactions stored
|
||||
@ -132,9 +149,9 @@ public class Peer {
|
||||
}
|
||||
|
||||
private void notifyDisconnect() {
|
||||
for (PeerEventListener listener : eventListeners) {
|
||||
for (PeerLifecycleListener listener : lifecycleListeners) {
|
||||
synchronized (listener) {
|
||||
listener.onPeerDisconnected(Peer.this, 0);
|
||||
listener.onPeerDisconnected(Peer.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -204,10 +221,11 @@ public class Peer {
|
||||
processAlert((AlertMessage)m);
|
||||
} else if (m instanceof VersionMessage) {
|
||||
peerVersionMessage = (VersionMessage)m;
|
||||
EventListenerInvoker.invoke(eventListeners, new EventListenerInvoker<PeerEventListener>() {
|
||||
EventListenerInvoker.invoke(lifecycleListeners,
|
||||
new EventListenerInvoker<PeerLifecycleListener>() {
|
||||
@Override
|
||||
public void invoke(PeerEventListener listener) {
|
||||
listener.onPeerConnected(Peer.this, 1);
|
||||
public void invoke(PeerLifecycleListener listener) {
|
||||
listener.onPeerConnected(Peer.this);
|
||||
}
|
||||
});
|
||||
} else if (m instanceof VersionAck) {
|
||||
|
@ -95,14 +95,14 @@ public class PeerGroup {
|
||||
|
||||
private ClientBootstrap bootstrap;
|
||||
|
||||
private class PeerStartupListener extends AbstractPeerEventListener {
|
||||
public void onPeerConnected(Peer peer, int peerCount) {
|
||||
private class PeerStartupListener implements Peer.PeerLifecycleListener {
|
||||
public void onPeerConnected(Peer peer) {
|
||||
pendingPeers.remove(peer);
|
||||
peers.add(peer);
|
||||
handleNewPeer(peer);
|
||||
}
|
||||
|
||||
public void onPeerDisconnected(Peer peer, int peerCount) {
|
||||
public void onPeerDisconnected(Peer peer) {
|
||||
pendingPeers.remove(peer);
|
||||
peers.remove(peer);
|
||||
channelFutures.remove(peer);
|
||||
@ -111,7 +111,7 @@ public class PeerGroup {
|
||||
}
|
||||
|
||||
// Visible for testing
|
||||
PeerEventListener startupListener = new PeerStartupListener();
|
||||
Peer.PeerLifecycleListener startupListener = new PeerStartupListener();
|
||||
|
||||
/**
|
||||
* Creates a PeerGroup with the given parameters and a default 5 second connection timeout. If you don't care
|
||||
@ -189,7 +189,7 @@ public class PeerGroup {
|
||||
ChannelPipeline p = Channels.pipeline();
|
||||
|
||||
Peer peer = new Peer(params, chain, ver);
|
||||
peer.addEventListener(startupListener);
|
||||
peer.addLifecycleListener(startupListener);
|
||||
pendingPeers.add(peer);
|
||||
TCPNetworkConnection codec =
|
||||
new TCPNetworkConnection(params,
|
||||
|
@ -71,7 +71,7 @@ public class PeerGroupTest extends TestWithNetworkConnections {
|
||||
ChannelPipeline p = Channels.pipeline();
|
||||
|
||||
Peer peer = new Peer(params, blockChain, ver);
|
||||
peer.addEventListener(peerGroup.startupListener);
|
||||
peer.addLifecycleListener(peerGroup.startupListener);
|
||||
p.addLast("peer", peer.getHandler());
|
||||
return p;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user