Are there any interceptor for AWS SQS DLQ (Java, Spring)? - spring-boot

I have AWS SQS queue and dlq.
I want to modify message before sending it to dlq, and I found #GlobalChannelInterceptor annotation in Spring integration and ChannelInterceptorAdapter class, which could be extended, but looks like it works for Kafka and RabbitMQ.
Are there something similar for AWS SQS ?
I m expecting class or annotation, where I can override beforeSend() method for specific dlq

Related

Spring Integration with consumer and Nifi as dispatcher

we are developing a service that listens or consume message from RabbitMQ queue. The message is dispatch from Apache Nifi to the message queue (e.g. queue name is "workitems").
Now, I would like to see a code snippet using Spring Integration to listen and process this message dispatched in the queue (RabbitMQ) from Apache Nifi.
Thanks!
It sounds like you need AMQP Channel Adapter from Spring Integration: https://docs.spring.io/spring-integration/docs/5.3.0.M4/reference/html/amqp.html#amqp-inbound-channel-adapter
And here is a sample on the matter: https://github.com/spring-projects/spring-integration-samples/tree/master/basic/amqp

spring-boot-starter-amqp will works between micro services?

I am new to Spring amqp.
I have tried to send the messages by following: https://spring.io/guides/gs/messaging-rabbitmq/
I am able to send the messages within the micro services.
But unable to send the messages to another micro services ? Is it expected ?
If I want to send the messages between the micro services which dependency I should follow ?
Please help me here.
What you want is something like this (figure taken from a recent blog post of mine, which also shows more detailed code examples):
Here, as an example, CRUD-Events like "customer.created" or "order.deleted" are considered
Any microservice can act as an Event Producer and send events to an event exchange via RabbitTemplate, which is provided by Spring AMQP and can just be injected into any Spring Bean.
A cluster of instances of the same microservice share a queue.
The consuming microservices declare their queue and the binding between queue and event exchange by declaring #Beans of type Queue and Binding with the same attributes.
The binding defines which events will be received by each microservice cluster
All microservices must share the same event exchange by declaring a #Bean of type Exchange with the same exchange name.
In one service you would send the message and in an other receive it. In the example you now have both in 1 project. In the sending service you have the RabbitTemplate and in the other service the Receiver with the SimpleMessageListenerContainer and MessageListenerAdapter beans. Make sure that the binding, queue and exchange configuration are the same and the services are both connected to the same RabbitMQ server.

Pollable StreamListener or MessageSource for RabbitMQ Queue

I have Spring Cloud Stream Rabbit project that sends messages to an rabbit exchange errorEx in case of errors in the flow.
I want to periodically(once in 5 mins) listen from the queue and process it.
Is there any way I can have a Pollable #StreamListener?
OR Can I configure a rabbitMQ org.springframework.integration.core.MessageSource so I can build a IntegrationFlow with a Poller?
Spring Integration AMQP doesn't provide a pollable adapter. #StreamListener only supports Subscribable channels.
You could use a custom MessageSource that uses a RabbitTemplate receive() operation to fetch messages.
Or, you could use the message-driven adapter and stop()/start() it as needed.

How to get properly all queue messages from RabbitMQ in Spring?

I am using Spring, Spring-Websocket, STOMP for my application, and RabbitMQ as broker. I need to log all messages going through RabbitMQ to Postgresql tables.
I know that I can write #MessageMapping in Spring and log there, but my problem is that some clients talk to RabbitMQ directly through MQTT protocol, and Spring does not support it yet (https://jira.spring.io/browse/SPR-12581). Moreover browser clients talk through Spring to RabbitMQ using STOMP protocol.
RabbitMQ allows to track all messages using Firehose tracer. How to properly listen to amq.rabbitmq.trace topic from Spring? Or do I need to write separate Java app as consumer?
The Spring AMQP is for you!
You bind some custom queue to to that amq.rabbitmq.trace with appropriate pattern (e.g. publish.#) and configure SimpleMessageListenerContainer to receive messages from that queue.
It can be done even with pretty simple config: #EnableRabbit and #RabbitListener on some POJO method. Anyway the Binding #Bean must be there to attache your queue to that exchange.

Consuming Messages from Amazon SQS using Spring

i am using the Amazon SQS as Message Queue. I am investigating how it is possible to set up a Spring consumer within Tomcat that would consume messages. However i looked around and it seems to say that to deploy a Spring Message Driven Bean to consume messages from Queue in Tomcat, i would need TomcatEE / Tomcat + ActiveMQ.
At the same time i have also reviewed the following SQS-Spring driver and wonder if it is of much use. http://nevado.skyscreamer.org/quickstart.html
Could someone advise what is required to accomplish the above?
SimpleMessageListenerContainer can be used to start/stop listeners programatically.
simpleMessageListenerContainer.start("logical queue name")
Other than that you have two options. Using spring's QueueMessagingTemplate
Message<?> msg = ((QueueMessagingTemplate) template).receive("logical queue name");
this will requiere that no listeners are defined in the application for this queue.
Or use the spring cloud messaging annotation SQSListener
#SqsListener(value = "logical queue name")

Resources