Bir örnek burada
Maven
Şu satırı dahil ederiz
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-aws</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-aws-messaging</artifactId></dependency>
Gradle
Şu satırı dahil ederiz
implementation 'io.awspring.cloud:spring-cloud-starter-aws-messaging'
SQS Test
Örnek
Localstack yerine şöyle yaparız
version: "3"
services:
sqs:
image: roribio16/alpine-sqs
ports:
- '9334:9324'
- '9335:9325'
volumes:
- my-datavolume:/sqs-data
volumes:
my-datavolume:application.yml dosyasında şöyle yaparız
QueueMessagingTemplate Sınıfıcloud:aws:region:static: us-east-1 # Region where you create the queueauto: falsecredentials:access-key: #access keysecret-key: #acess secret key
Şu satırı dahil ederiz
import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate;
Açıklaması şöyle
With spring-cloud-starter-aws-messaging we get QueueMessagingTemplate. It is an abstraction to easily publish/receive messages to queue. It also provides apis to configure various converters.
constructor - AmazonSQSAsync
Örnek
Şöyle yaparız. Burada profile dev ise yerelde çalışan SQS'e bağlanıyor
@Configuration
public class SqsConfig {
private final int BATCH_SIZE = 10;
private final String queueEndpoint;
public SqsConfig(@Value("${queue.endpoint}") String queueEndpoint) {
this.queueEndpoint = queueEndpoint;
}
@Bean
@Primary
public AmazonSQSAsync amazonSQSAsync(@Value("${spring.profiles.active}")
String profile) {
if(profile.equals("dev")){
return AmazonSQSAsyncClientBuilder
.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
queueEndpoint,
Region.AP_SOUTHEAST_1.id()))
.build();
}
else {
return AmazonSQSAsyncClientBuilder
.standard()
.withRegion(Region.AP_SOUTHEAST_1.id())
.build();
}
}
@Bean
public QueueMessagingTemplate queueMessagingTemplate(AmazonSQSAsync amazonSQSAsync) {
return new QueueMessagingTemplate(amazonSQSAsync);
}
}Örnek
Şöyle yaparız
convertAndSend metoduimport org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate;import com.amazonaws.auth.AWSStaticCredentialsProvider;import com.amazonaws.auth.BasicAWSCredentials;import com.amazonaws.services.sqs.AmazonSQSAsync;import com.amazonaws.services.sqs.AmazonSQSAsyncClientBuilder;@Configurationpublic class SqsConfig {@Value("${cloud.aws.region.static}")private String region; // region name@Value("${cloud.aws.credentials.access-key}")private String awsAccessKey; // aws access key.@Value("${cloud.aws.credentials.secret-key}")private String awsSecretKey; // aws secret key@Beanpublic QueueMessagingTemplate queueMessagingTemplate() {return new QueueMessagingTemplate(amazonSQSAsync());}@Beanpublic AmazonSQSAsync amazonSQSAsync() {return AmazonSQSAsyncClientBuilder.standard().withRegion(region) //region name wich aquired by application.yml file.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKey, awsSecretKey))) // access key and secret key.build();}}
Belirtilen kuyruk ismine Java nesnesini gönderir
Örnek
Şöyle yaparız
Slf4j
@Service
public class QueueServiceImpl implements QueueService {
private final QueueMessagingTemplate queueMessagingTemplate;
private final String taskQueue;
public QueueServiceImpl(QueueMessagingTemplate queueMessagingTemplate,
@Value("${queue.task}") String taskQueue) {
this.queueMessagingTemplate = queueMessagingTemplate;
this.taskQueue = taskQueue;
}
@Override
public void publishTask(Task task) {
task.setId(UUID.randomUUID().toString());
log.info("Publishing task to queue {}", task);
queueMessagingTemplate.convertAndSend(taskQueue, task);
}
}Örnek
Şöyle yaparız. @SqsListener ile sadece String mesaj okuyoruz
import com.aws.sqs.model.Message;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate;import org.springframework.cloud.aws.messaging.listener.SqsMessageDeletionPolicy;import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener;@RestController@RequestMapping(value = "/sqs")public class SqsController {//queue nameprivate static final String QUEUE = "my-queue";@Autowiredprivate QueueMessagingTemplate queueMessagingTemplate;@PostMapping(value = "/send")@ResponseStatus(code = HttpStatus.CREATED)public void sendMessageToSqs(@RequestBody final Message message) {queueMessagingTemplate.convertAndSend(QUEUE, message); //send to queue}// @SqsListener listens to the message from the queue.@SqsListener(value = QUEUE, deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)public void getMessageFromSqs(Message message, @Header("MessageId") String messageId) {logger.info("Received message= {} with messageId= {}", message.toString(), messageId);}}
Örnek
Açıklaması şöyle
... we need to let SQS know how it could convert the receiving strings to object. So we add a bean of QueueMessageHandlerFactory.
Şöyle yaparız. @SqsListener Task tipinden Java nesnesi okuyoruz
@Bean
public QueueMessageHandlerFactory queueMessageHandlerFactory(
ObjectMapper objectMapper,
AmazonSQSAsync amazonSQSAsync) {
MappingJackson2MessageConverter messageConverter
= new MappingJackson2MessageConverter();
messageConverter.setObjectMapper(objectMapper);
messageConverter.setStrictContentTypeMatch(false);
QueueMessageHandlerFactory factory = new QueueMessageHandlerFactory();
factory.setAmazonSqs(amazonSQSAsync);
List<HandlerMethodArgumentResolver> resolvers = List.of(
new PayloadMethodArgumentResolver(messageConverter,null, false));
factory.setArgumentResolvers(resolvers);
return factory;
}
}
@Service
@Slf4j
public class TaskProcessorImpl implements TaskProcessor {
@Override
@SqsListener(value = "dev-task.std",deletionPolicy = SqsMessageDeletionPolicy.ALWAYS)
@MessageMapping
public void process(Task task) {
log.info("Processing task {}", task);
}
}
Hiç yorum yok:
Yorum Gönder