|
|
|
@ -20,15 +20,11 @@ import com.amazonaws.auth.AWSCredentialsProvider; |
|
|
|
import com.amazonaws.auth.AWSStaticCredentialsProvider; |
|
|
|
import com.amazonaws.auth.BasicAWSCredentials; |
|
|
|
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; |
|
|
|
import com.amazonaws.services.sqs.AmazonSQS; |
|
|
|
import com.amazonaws.services.sqs.AmazonSQSClientBuilder; |
|
|
|
import com.amazonaws.handlers.AsyncHandler; |
|
|
|
import com.amazonaws.services.sqs.AmazonSQSAsync; |
|
|
|
import com.amazonaws.services.sqs.AmazonSQSAsyncClientBuilder; |
|
|
|
import com.amazonaws.services.sqs.model.SendMessageRequest; |
|
|
|
import com.amazonaws.services.sqs.model.SendMessageResult; |
|
|
|
import com.google.common.util.concurrent.FutureCallback; |
|
|
|
import com.google.common.util.concurrent.Futures; |
|
|
|
import com.google.common.util.concurrent.ListenableFuture; |
|
|
|
import com.google.common.util.concurrent.ListeningExecutorService; |
|
|
|
import com.google.common.util.concurrent.MoreExecutors; |
|
|
|
import com.google.gson.Gson; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; |
|
|
|
@ -41,19 +37,17 @@ import org.thingsboard.server.queue.common.DefaultTbQueueMsg; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.UUID; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
import java.util.concurrent.Executors; |
|
|
|
|
|
|
|
@Slf4j |
|
|
|
public class TbAwsSqsProducerTemplate<T extends TbQueueMsg> implements TbQueueProducer<T> { |
|
|
|
private final String defaultTopic; |
|
|
|
private final AmazonSQS sqsClient; |
|
|
|
private final AmazonSQSAsync sqsClient; |
|
|
|
private final Gson gson = new Gson(); |
|
|
|
private final Map<String, String> queueUrlMap = new ConcurrentHashMap<>(); |
|
|
|
private final TbQueueAdmin admin; |
|
|
|
private ListeningExecutorService producerExecutor; |
|
|
|
private final TbAwsSqsAdmin admin; |
|
|
|
|
|
|
|
public TbAwsSqsProducerTemplate(TbQueueAdmin admin, TbAwsSqsSettings sqsSettings, String defaultTopic) { |
|
|
|
this.admin = admin; |
|
|
|
this.admin = (TbAwsSqsAdmin) admin; |
|
|
|
this.defaultTopic = defaultTopic; |
|
|
|
|
|
|
|
AWSCredentialsProvider credentialsProvider; |
|
|
|
@ -64,11 +58,11 @@ public class TbAwsSqsProducerTemplate<T extends TbQueueMsg> implements TbQueuePr |
|
|
|
credentialsProvider = new AWSStaticCredentialsProvider(awsCredentials); |
|
|
|
} |
|
|
|
|
|
|
|
sqsClient = AmazonSQSClientBuilder.standard() |
|
|
|
sqsClient = AmazonSQSAsyncClientBuilder.standard() |
|
|
|
.withCredentials(credentialsProvider) |
|
|
|
.withRegion(sqsSettings.getRegion()) |
|
|
|
.withExecutorFactory(this.admin::getProducerExecutor) |
|
|
|
.build(); |
|
|
|
producerExecutor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@ -91,30 +85,24 @@ public class TbAwsSqsProducerTemplate<T extends TbQueueMsg> implements TbQueuePr |
|
|
|
sendMsgRequest.withMessageGroupId(sqsMsgId); |
|
|
|
sendMsgRequest.withMessageDeduplicationId(sqsMsgId); |
|
|
|
|
|
|
|
ListenableFuture<SendMessageResult> future = producerExecutor.submit(() -> sqsClient.sendMessage(sendMsgRequest)); |
|
|
|
|
|
|
|
Futures.addCallback(future, new FutureCallback<SendMessageResult>() { |
|
|
|
@Override |
|
|
|
public void onSuccess(SendMessageResult result) { |
|
|
|
sqsClient.sendMessageAsync(sendMsgRequest, new AsyncHandler<SendMessageRequest, SendMessageResult>() { |
|
|
|
@Override public void onError(Exception e) { |
|
|
|
if (callback != null) { |
|
|
|
callback.onSuccess(new AwsSqsTbQueueMsgMetadata(result.getSdkHttpMetadata())); |
|
|
|
callback.onFailure(e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void onFailure(Throwable t) { |
|
|
|
@Override public void onSuccess(SendMessageRequest request, |
|
|
|
SendMessageResult sendMessageResult) { |
|
|
|
if (callback != null) { |
|
|
|
callback.onFailure(t); |
|
|
|
callback.onSuccess(new AwsSqsTbQueueMsgMetadata(sendMessageResult.getSdkHttpMetadata())); |
|
|
|
} |
|
|
|
} |
|
|
|
}, producerExecutor); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void stop() { |
|
|
|
if (producerExecutor != null) { |
|
|
|
producerExecutor.shutdownNow(); |
|
|
|
} |
|
|
|
if (sqsClient != null) { |
|
|
|
sqsClient.shutdown(); |
|
|
|
} |
|
|
|
|