mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-15 03:35:52 +00:00
Peer: Allow peer listeners to handle exceptions thrown in the peer thread.
This commit is contained in:
parent
aac6a7daf7
commit
d92f944564
@ -45,4 +45,8 @@ public class AbstractPeerEventListener implements PeerEventListener {
|
|||||||
public List<Message> getData(Peer peer, GetDataMessage m) {
|
public List<Message> getData(Peer peer, GetDataMessage m) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onException(Throwable throwable) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -243,6 +243,7 @@ public class Peer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void processMessage(MessageEvent e, Message m) throws IOException, VerificationException, ProtocolException {
|
private void processMessage(MessageEvent e, Message m) throws IOException, VerificationException, ProtocolException {
|
||||||
|
try {
|
||||||
// Allow event listeners to filter the message stream. Listeners are allowed to drop messages by
|
// Allow event listeners to filter the message stream. Listeners are allowed to drop messages by
|
||||||
// returning null.
|
// returning null.
|
||||||
for (PeerEventListener listener : eventListeners) {
|
for (PeerEventListener listener : eventListeners) {
|
||||||
@ -306,6 +307,17 @@ public class Peer {
|
|||||||
} else {
|
} else {
|
||||||
log.warn("Received unhandled message: {}", m);
|
log.warn("Received unhandled message: {}", m);
|
||||||
}
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
log.warn("Caught exception in peer thread: {}", throwable.getMessage());
|
||||||
|
throwable.printStackTrace();
|
||||||
|
for (PeerEventListener listener : eventListeners) {
|
||||||
|
try {
|
||||||
|
listener.onException(throwable);
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startFilteredBlock(FilteredBlock m) throws IOException {
|
private void startFilteredBlock(FilteredBlock m) throws IOException {
|
||||||
|
@ -78,4 +78,11 @@ public interface PeerEventListener {
|
|||||||
* items as possible which appear in the {@link GetDataMessage}, or null if you're not interested in responding.
|
* items as possible which appear in the {@link GetDataMessage}, or null if you're not interested in responding.
|
||||||
*/
|
*/
|
||||||
public List<Message> getData(Peer peer, GetDataMessage m);
|
public List<Message> getData(Peer peer, GetDataMessage m);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called if there is an exception thrown in a Netty worker thread whilst processing an inbound message. You
|
||||||
|
* can use this to report crashes of the peer threads back to your apps website, for instance. After this callback
|
||||||
|
* runs the peer will be disconnected. Any exceptions thrown by this method will be logged and ignored.
|
||||||
|
*/
|
||||||
|
public void onException(Throwable throwable);
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package com.google.bitcoin.core;
|
package com.google.bitcoin.core;
|
||||||
|
|
||||||
import com.google.bitcoin.core.Peer.PeerHandler;
|
import com.google.bitcoin.core.Peer.PeerHandler;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import org.easymock.Capture;
|
import org.easymock.Capture;
|
||||||
import org.easymock.CaptureType;
|
import org.easymock.CaptureType;
|
||||||
@ -766,6 +767,31 @@ public class PeerTest extends TestWithNetworkConnections {
|
|||||||
peer.setMinProtocolVersion(500);
|
peer.setMinProtocolVersion(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void exceptionListener() throws Exception {
|
||||||
|
wallet.addEventListener(new AbstractWalletEventListener() {
|
||||||
|
@Override
|
||||||
|
public void onCoinsReceived(Wallet wallet, Transaction tx, BigInteger prevBalance, BigInteger newBalance) {
|
||||||
|
throw new NullPointerException("boo!");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
final Throwable[] throwables = new Throwable[1];
|
||||||
|
peer.addEventListener(new AbstractPeerEventListener() {
|
||||||
|
@Override
|
||||||
|
public void onException(Throwable throwable) {
|
||||||
|
throwables[0] = throwable;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
control.replay();
|
||||||
|
connect();
|
||||||
|
Transaction t1 = new Transaction(unitTestParams);
|
||||||
|
t1.addInput(new TransactionInput(unitTestParams, t1, new byte[]{}));
|
||||||
|
t1.addOutput(Utils.toNanoCoins(1, 0), wallet.getChangeAddress());
|
||||||
|
inbound(peer, t1);
|
||||||
|
inbound(peer, new NotFoundMessage(unitTestParams, Lists.newArrayList(new InventoryItem(InventoryItem.Type.Transaction, t1.getInput(0).getHash()))));
|
||||||
|
assertTrue(throwables[0] instanceof NullPointerException);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Use generics here to avoid unnecessary casting.
|
// TODO: Use generics here to avoid unnecessary casting.
|
||||||
private Message outbound() {
|
private Message outbound() {
|
||||||
List<DownstreamMessageEvent> messages = event.getValues();
|
List<DownstreamMessageEvent> messages = event.getValues();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user