Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizzo dei client analizzati nei thread worker
Scorekeep utilizza un thread worker per pubblicare una notifica su Amazon SNS quando un utente vince una partita. La pubblicazione della notifica richiede più tempo del resto delle operazioni di richiesta sommate e non ha effetto sul client o sull'utente. Pertanto, eseguire l'attività in modo asincrono è un buon modo per migliorare i tempi di risposta.
Tuttavia, l'SDK X-Ray per Java non sa quale segmento era attivo quando il thread è stato creato. Di conseguenza, quando utilizzi il client AWS SDK for Java analizzato all'interno del thread, questo genera un' eccezione SegmentNotFoundException
arrestando in modo anomalo il thread.
Esempio Web-1.error.log
Exception in thread "Thread-2" com.amazonaws.xray.exceptions.SegmentNotFoundException: Failed to begin subsegment named 'AmazonSNS': segment cannot be found.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
...
Per risolvere questo problema, l'applicazione utilizzaGetTraceEntity
per ottenere un riferimento al segmento nel thread principale eEntity.run()
per eseguire in modo sicuro il codice del thread di lavoro con accesso al contesto del segmento.
Esempio src/main/java/scorekeep/MoveFactory.java
— Passaggio del contesto di tracciamento a un thread worker
import com.amazonaws.xray.AWSXRay;
import com.amazonaws.xray.AWSXRayRecorder;
import com.amazonaws.xray.entities.Entity;
import com.amazonaws.xray.entities.Segment;
import com.amazonaws.xray.entities.Subsegment;
...
Entity segment = recorder.getTraceEntity();
Thread comm = new Thread() {
public void run() {
segment.run(() -> {
Subsegment subsegment = AWSXRay.beginSubsegment("## Send notification");
Sns.sendNotification("Scorekeep game completed", "Winner: " + userId);
AWSXRay.endSubsegment();
}
}
Poiché la richiesta è ora risolta prima della chiamata ad Amazon SNS, l'applicazione crea un sottosegmento distinto per il thread. In questo modo si impedisce che l'SDK X-Ray chiuda il segmento prima che venga memorizzata la risposta da Amazon SNS. Se non è aperto nessun sottosegmento quando Scorekeep conclude la richiesta, la risposta da Amazon SNS potrebbe andare persa.
Per ulteriori informazioni sul multithreading, consulta Passaggio del contesto del segmento tra thread in un'applicazione multithread.