Last active
November 30, 2022 02:12
-
-
Save stephenlb/caca6c8565576f8cd3869b1932cae904 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PNConfiguration configPrimary = new PNConfiguration(new UserId("myUserId")); | |
configPrimary.setSubscribeKey("mySubscribeKey"); | |
configPrimary.setPublishKey("myPublishKey"); | |
configPrimary.setOrigin("primary.pubnubapi.com"); | |
PNConfiguration configBackupOne = new PNConfiguration(new UserId("myUserId")); | |
configBackupOne.setSubscribeKey("mySubscribeKey"); | |
configBackupOne.setPublishKey("myPublishKey"); | |
configBackupOne.setOrigin("backup-1.pubnubapi.com"); | |
PNConfiguration configBackupTwo = new PNConfiguration(new UserId("myUserId")); | |
configBackupTwo.setSubscribeKey("mySubscribeKey"); | |
configBackupTwo.setPublishKey("myPublishKey"); | |
configBackupTwo.setOrigin("backup-2.pubnubapi.com"); | |
int currentConfig = 0; | |
Timer restoreTimer; | |
PubNub pubnubPrimary = new PubNub(configPrimary); | |
PubNub pubnubBackupOne = new PubNub(configBackupOne); | |
PubNub pubnubBackupTwo = new PubNub(configBackupTwo); | |
SubscribeCallback subscribeCallback = new SubscribeCallback() { | |
@Override | |
public void status(PubNub pubnub, PNStatus status) { | |
switch (status.getOperation()) { | |
// combine unsubscribe and subscribe handling for ease of use | |
case PNSubscribeOperation: | |
case PNUnsubscribeOperation: | |
// Note: subscribe statuses never have traditional errors, | |
// just categories to represent different issues or successes | |
// that occur as part of subscribe | |
switch (status.getCategory()) { | |
case PNUnexpectedDisconnectCategory: | |
restorePrimaryTimer(); | |
pubnubPrimary.unsubscribeAll(); | |
if (currentBackupConfig == 1) { | |
pubnubBackupOne.unsubscribeAll(); | |
pubnubBackupTwo.subscribe().channels(Arrays.asList("my_channel")).execute(); | |
currentBackupConfig = 2; | |
} | |
else { | |
pubnubBackupTwo.unsubscribeAll(); | |
pubnubBackupOne.subscribe().channels(Arrays.asList("my_channel")).execute(); | |
currentBackupConfig = 1; | |
} | |
} | |
} | |
} | |
}; | |
pubnubPrimary.addListener(subscribeCallback); | |
pubnubBackupOne.addListener(subscribeCallback); | |
pubnubBackupTwo.addListener(subscribeCallback); | |
public void restorePrimaryTimer() { | |
if (restoreTimer) restoreTimer.cancel(); | |
restoreTimer = new Timer().scheduleAtFixedRate(new TimerTask(){ | |
@Override | |
public void run(){ | |
pubnubPrimary.subscribe().channels(Arrays.asList("my_channel")).execute(); | |
pubnubBackupOne.unsubscribeAll(); | |
pubnubBackupTwo.unsubscribeAll(); | |
} | |
}, 0, 60 * 1000); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script src="https://cdn.pubnub.com/sdk/javascript/pubnub.7.2.1.js"></script> | |
<script> | |
let currentConfig = "primary"; | |
let configs = { | |
primary : { publishKey : "myPublishKey", subscribeKey : "mySubscribeKey", userId: "myUniqueUserId", origin: "primary.pubnubapi.com" }, | |
backup1 : { publishKey : "myPublishKey", subscribeKey : "mySubscribeKey", userId: "myUniqueUserId", origin: "backup-1.pubnubapi.com" }, | |
backup2 : { publishKey : "myPublishKey", subscribeKey : "mySubscribeKey", userId: "myUniqueUserId", origin: "backup-2.pubnubapi.com" }, | |
}; | |
let pubnub = new initPubNubSDK(configs[currentConfig]); | |
const listener = { | |
status: (statusEvent) => { | |
if (statusEvent.category === "PNUnexpectedDisconnectCategory") { | |
if (currentConfig === "backup1") { | |
currentConfig = "backup2"; | |
} | |
else { | |
currentConfig = "backup1"; | |
} | |
clearTimeout(pubnub.restorePrimaryTimer); | |
pubnub = initPubNubSDK(configs[currentConfig]); | |
pubnub.restorePrimaryTimer = setTimeout( () => { | |
fetch(`https://${configs["primary"].origin}/time/0`) | |
.then((response) => { | |
currentConfig = "primary"; | |
pubnub = initPubNubSDK(configs[currentConfig]); | |
}); | |
}, 60 * 1000 ); | |
} | |
}, | |
message: (messageEvent) => { | |
// handle messages | |
}, | |
presence: (presenceEvent) => { | |
// handle presence | |
} | |
}; | |
function initPubNubSDK(config) { | |
let pubnub = new PubNub(config); | |
pubnub.subscribe({ channels: ["hello_world"] }); | |
pubnub.addListener(listener); | |
return pubnub; | |
} | |
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PNConfiguration configPrimary = new PNConfiguration(new UserId("myUserId")); | |
configPrimary.setSubscribeKey("mySubscribeKey"); | |
configPrimary.setPublishKey("myPublishKey"); | |
configPrimary.setOrigin("primary.pubnubapi.com"); | |
PNConfiguration configBackupOne = new PNConfiguration(new UserId("myUserId")); | |
configBackupOne.setSubscribeKey("mySubscribeKey"); | |
configBackupOne.setPublishKey("myPublishKey"); | |
configBackupOne.setOrigin("backup-1.pubnubapi.com"); | |
PNConfiguration configBackupTwo = new PNConfiguration(new UserId("myUserId")); | |
configBackupTwo.setSubscribeKey("mySubscribeKey"); | |
configBackupTwo.setPublishKey("myPublishKey"); | |
configBackupTwo.setOrigin("backup-2.pubnubapi.com"); | |
PubNub pubnubPrimary = new PubNub(configPrimary); | |
PubNub pubnubBackupOne = new PubNub(configBackupOne); | |
PubNub pubnubBackupTwo = new PubNub(configBackupTwo); | |
pubnubPrimary.publish().channel(channelName).message(messageJsonObject).async((result, publishStatus) -> { | |
if (publishStatus.isError()) { | |
// Retry next endpoint | |
pubnubBackupOne.publish().channel(channelName).message(messageJsonObject).async((result, publishStatus) -> { | |
if (publishStatus.isError()) { | |
// Retry next endpoint | |
pubnubBackupTwo.publish().channel(channelName).message(messageJsonObject).async((result, publishStatus) -> { | |
if (publishStatus.isError()) { | |
// Retry next endpoint | |
} | |
}); | |
} | |
}); | |
} | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <PubNub/PubNub.h> | |
PNConfiguration *configPrimary = [PNConfiguration configurationWithPublishKey: @"myPublishKey" subscribeKey:@"mySubscribeKey"]; | |
PNConfiguration *configBackupOne = [PNConfiguration configurationWithPublishKey: @"myPublishKey" subscribeKey:@"mySubscribeKey"]; | |
PNConfiguration *configBackupTwo = [PNConfiguration configurationWithPublishKey: @"myPublishKey" subscribeKey:@"mySubscribeKey"]; | |
configPrimary.origin = @"primary.pubnubapi.com"; | |
configPrimary.uuid = @"myUniqueUUID"; | |
configBackupOne.origin = @"backup-1.pubnubapi.com"; | |
configBackupOne.uuid = @"myUniqueUUID"; | |
configBackupTwo.origin = @"backup-2.pubnubapi.com"; | |
configBackupTwo.uuid = @"myUniqueUUID"; | |
self.client = [PubNub clientWithConfiguration:configPrimary]; | |
[pubnub addListener:self]; | |
- (void)client:(PubNub *)pubnub didReceiveStatus:(PNStatus *)status { | |
PNStatusCategory category = status.category; // One of PNStatusCategory fields to identify status of operation processing | |
PNOperationType operation = status.operation; // One of PNOperationType fields to identify for which operation status received | |
BOOL isError = status.isError; // Whether any kind of error happened. | |
NSInteger statusCode = status.statusCode; // Related request processing status code | |
BOOL isTLSEnabled = status.isTLSEnabled; // Whether secured connection enabled | |
NSString *uuid = status.uuid; // UUID which configured for passed client | |
NSString *authKey = status.authKey; // Auth key configured for passed client | |
NSString *origin = status.origin; // Origin against which request has been sent | |
NSURLRequest *clientRequest = status.clientRequest; // Request which has been used to send last request (may be nil) | |
BOOL willAutomaticallyRetry = status.willAutomaticallyRetry; // Whether client will try to perform automatic retry | |
if (isError && category == PNUnexpectedDisconnectCategory) { | |
// Check if we are on first backup, then use secondary backup | |
if (self.client.configuration.origin == backupOne.origin) | |
PNConfiguration *backup = backupTwo; | |
} | |
else { | |
PNConfiguration *backup = backupOne; | |
} | |
// Re-initialize with backup config | |
self.client = [PubNub clientWithConfiguration:backup]; | |
// Re-subscribe to channels | |
[self.client subscribeToChannels: @[@"hello-world-channel"]]; | |
// Start restore primary timer | |
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(restorePrimaryConfiguration) userInfo:nil repeats:NO]; | |
} | |
} | |
-(void)restorePrimaryConfiguration | |
{ | |
// Test primary origin | |
url = [NSString stringWithFormat:@"https://%@/time/0", configPrimary.origin]; | |
if ([getDataFrom url] == nil) { | |
// Start retry timer again | |
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(restorePrimaryConfiguration) userInfo:nil repeats:NO]; | |
return; | |
} | |
// Re-initialize with backup config | |
self.client = [PubNub clientWithConfiguration:configPrimary]; | |
// Re-subscribe to channels | |
[self.client subscribeToChannels: @[@"hello-world-channel"]]; | |
} | |
- (NSString *) getDataFrom:(NSString *)url{ | |
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; | |
[request setHTTPMethod:@"GET"]; | |
[request setURL:[NSURL URLWithString:url]]; | |
NSError *error = nil; | |
NSHTTPURLResponse *responseCode = nil; | |
NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]; | |
if([responseCode statusCode] != 200){ | |
NSLog(@"Error getting %@, HTTP status code %i", url, [responseCode statusCode]); | |
return nil; | |
} | |
return [[NSString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment