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