Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class OptimizelyXIntegration extends Integration<Void> {
static final Options options = new Options().setIntegration(OPTIMIZELYX_KEY, false);
private Map<String, String> attributes = new HashMap<>();
List<TrackPayload> trackEvents = new ArrayList<>();
private ScheduledExecutorService scheduler;
private final Handler handler = new Handler();

public static Factory factory(OptimizelyManager manager) {
Expand Down Expand Up @@ -88,7 +89,7 @@ public OptimizelyXIntegration(
client.addNotificationListener(listener);
}
} else {
pollOptimizelyClient(manager, analytics);
pollScheduler(manager, analytics);
}
}

Expand All @@ -107,22 +108,49 @@ public void identify(IdentifyPayload identify) {
public void track(TrackPayload track) {
super.track(track);

int queueSize = trackEvents.size();
if (!client.isValid()) {
enqueueTrack(track);
return;
}
trackEvent(track);
}

synchronized (this) {
if (!client.isValid()) {
logger.verbose("Optimizely not initialized. Enqueueing action: %s", track);
if (queueSize >= 100) {
logger.verbose(
"Event queue has exceeded limit. Dropping event at index zero: %s",
trackEvents.get(0));
trackEvents.remove(0);
}
trackEvents.add(track);
return;
}
@Override
public void reset() {
super.reset();

client.removeNotificationListener(listener);
logger.verbose("client.removeNotificationListener(listener)");
}

private void pollScheduler(final OptimizelyManager manager, final Analytics analytics) {
this.scheduler = Executors.newScheduledThreadPool(1);

final Runnable poll =
new Runnable() {
@Override
public void run() {
handler.post(
new Runnable() {
@Override
public void run() {
checkClient(manager, analytics);
}
});
}
};
scheduler.scheduleAtFixedRate(poll, 60, 60, SECONDS);
}

private void checkClient(OptimizelyManager manager, Analytics analytics) {
this.client = manager.getOptimizely();
if (client.isValid()) {
scheduler.shutdown();
setClientAndFlushTracks(analytics);
}
}

private void trackEvent(TrackPayload track) {
// Segment will default sending `track` calls with `anonymousId`s since Optimizely X does not alias known and unknown users
// https://developers.optimizely.com/x/solutions/sdks/reference/index.html?language=objectivec&platform=mobile#user-ids
String userId = track.userId();
Expand All @@ -146,37 +174,16 @@ public void track(TrackPayload track) {
logger.verbose("client.track(%s, %s, %s, %s)", event, id, attributes, properties);
}

@Override
public void reset() {
super.reset();

client.removeNotificationListener(listener);
logger.verbose("client.removeNotificationListener(listener)");
}

private void pollOptimizelyClient(final OptimizelyManager manager, final Analytics analytics) {
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private void enqueueTrack(TrackPayload track) {
int queueSize = trackEvents.size();

final Runnable poll =
new Runnable() {
@Override
public void run() {
synchronized (OptimizelyXIntegration.this) {
OptimizelyXIntegration.this.client = manager.getOptimizely();
}
if (client.isValid()) {
handler.post(
new Runnable() {
@Override
public void run() {
setClientAndFlushTracks(analytics);
}
});
scheduler.shutdown();
}
}
};
scheduler.scheduleAtFixedRate(poll, 60, 60, SECONDS);
if (queueSize >= 100) {
logger.verbose(
"Event queue has exceeded limit. Dropping event at index zero: %s", trackEvents.get(0));
trackEvents.remove(0);
}
trackEvents.add(track);
logger.verbose("Optimizely not initialized. Enqueueing action: %s", track);
}

void setClientAndFlushTracks(Analytics analytics) {
Expand All @@ -185,7 +192,7 @@ void setClientAndFlushTracks(Analytics analytics) {
logger.verbose("Flushing track queue");

for (TrackPayload t : trackEvents) {
track(t);
trackEvent(t);
}

trackEvents = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public class OptimizelyXTest {
verify(client).track("event", "123", attributes, properties.toStringMap());
}

@Test public void pollOptimizelyClient() {
@Test public void flushTrackEventQueue() {
Properties properties = new Properties();
Traits traits = new Traits()
.putValue("anonymousId", "456");
Expand Down