Skip to content

Instantly share code, notes, and snippets.

@stephenlb
Last active November 30, 2022 02:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stephenlb/caca6c8565576f8cd3869b1932cae904 to your computer and use it in GitHub Desktop.
Save stephenlb/caca6c8565576f8cd3869b1932cae904 to your computer and use it in GitHub Desktop.
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);
}
<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>
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
}
});
}
});
}
});
#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