in sdk/src/main/java/software/amazon/awssdk/iot/AwsIotMqttConnectionBuilder.java [489:560]
public MqttClientConnection build() {
// Validate
if (bootstrap == null) {
throw new MqttException("client bootstrap must be non-null");
}
// Lazy create
// This does mean that once you call build() once, modifying the tls context options or client bootstrap
// has no affect on subsequently-created connections.
synchronized(this) {
if (tlsOptions != null && (tlsContext == null || resetLazilyCreatedResources)) {
try (ClientTlsContext clientTlsContext = new ClientTlsContext(tlsOptions)) {
swapReferenceTo(tlsContext, clientTlsContext);
tlsContext = clientTlsContext;
}
}
if (client == null || resetLazilyCreatedResources) {
try (MqttClient mqttClient = (tlsContext == null) ? new MqttClient(bootstrap) : new MqttClient(bootstrap, tlsContext)) {
swapReferenceTo(client, mqttClient);
client = mqttClient;
config.setMqttClient(client);
}
}
}
resetLazilyCreatedResources = false;
// Connection create
try (MqttConnectionConfig connectionConfig = config.clone()) {
// Whether or not a username has been added, append our metrics tokens
String usernameOrEmpty = "";
if (connectionConfig.getUsername() != null) {
usernameOrEmpty = connectionConfig.getUsername();
}
connectionConfig.setUsername(String.format("%s?SDK=JavaV2&Version=%s", usernameOrEmpty, new PackageInfo().version.toString()));
if (connectionConfig.getUseWebsockets() && connectionConfig.getWebsocketHandshakeTransform() == null) {
if (websocketCredentialsProvider == null) {
DefaultChainCredentialsProvider.DefaultChainCredentialsProviderBuilder providerBuilder = new DefaultChainCredentialsProvider.DefaultChainCredentialsProviderBuilder();
providerBuilder.withClientBootstrap(bootstrap);
try (CredentialsProvider defaultProvider = providerBuilder.build()) {
withWebsocketCredentialsProvider(defaultProvider);
}
}
try (AwsSigningConfig signingConfig = new AwsSigningConfig()) {
signingConfig.setAlgorithm(AwsSigningConfig.AwsSigningAlgorithm.SIGV4);
signingConfig.setSignatureType(AwsSigningConfig.AwsSignatureType.HTTP_REQUEST_VIA_QUERY_PARAMS);
signingConfig.setRegion(websocketSigningRegion);
signingConfig.setService(IOT_SIGNING_SERVICE);
signingConfig.setCredentialsProvider(websocketCredentialsProvider);
signingConfig.setOmitSessionToken(true);
try (AwsSigv4HandshakeTransformer transformer = new AwsSigv4HandshakeTransformer(signingConfig)) {
connectionConfig.setWebsocketHandshakeTransform(transformer);
/*
* transformer is actually a CrtResource since we track a SigningConfig (which tracks a Credentials Provider
* But the MqttConnectionConfig only knows of the transformer as a Consumer function, so it's not
* able to properly add a forward reference to the transformer. So we do it manually here after setting.
*/
connectionConfig.addReferenceTo(transformer);
}
}
}
return new MqttClientConnection(connectionConfig);
}
}