Spring ermöglicht das Abfangen von Nachrichten für viele ihrer Produkte, wie RestTemplate und SpringMVC. Ist es möglich, Spring Cloud Stream-Nachrichten abzufangen? Für eingehende und ausgehende Nachrichten.Abfangen von Spring Cloud Stream-Nachrichten?
Antwort
Nicht sicher, was Sie hier durch Abfangen meinen - beide Beispiele, die Sie geben, sind nicht nachrichtenbasiert :).
Aber Sie möchten Zugriff auf die vollständige Nachricht erhalten, können Sie das als Argument für eine @StreamListener
oder @ServiceActivator
-annotated-Methode verwenden. Mit Spring Cloud Stream können Sie außerdem eine vollständige Spring Integration-Pipeline einrichten, sodass Sie Ratschläge und alles, was Sie benötigen, hinzufügen können - siehe hier: https://github.com/spring-projects/spring-integration-java-dsl/wiki/Spring-Integration-Java-DSL-Reference.
Ich würde Sie ermutigen, einen Blick auf die Spring Integration Referenz sowie http://docs.spring.io/autorepo/docs/spring-integration/4.2.6.RELEASE/reference/html/ zu werfen. Der Spring Cloud Stream injiziert die Kanäle automatisch und von dort aus haben Sie volle Freiheit bei der Konstruktion Ihrer Pipeline.
hoffte, das hilft, Marius
War in der Lage ein- und ausgehende Frühling Cloud-Stream-Nachrichten, die die GlobalChannelInterceptor
Annotation und ChannelInterceptor
Schnittstelle abzufangen. Siehe Beispiel unten.
import org.springframework.integration.config.GlobalChannelInterceptor;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.stereotype.Component;
@Component
@GlobalChannelInterceptor
public class Interceptor implements ChannelInterceptor {
private final Logger log = LoggerFactory.getLogger(Interceptor.class);
@Override
public Message<?> preSend(Message<?> msg, MessageChannel mc) {
log.info("In preSend");
return msg;
}
@Override
public void postSend(Message<?> msg, MessageChannel mc, boolean bln) {
log.info("In postSend");
}
@Override
public void afterSendCompletion(Message<?> msg, MessageChannel mc, boolean bln, Exception excptn) {
log.info("In afterSendCompletion");
}
@Override
public boolean preReceive(MessageChannel mc) {
log.info("In preReceive");
return true;
}
@Override
public Message<?> postReceive(Message<?> msg, MessageChannel mc) {
log.info("In postReceive");
return msg;
}
@Override
public void afterReceiveCompletion(Message<?> msg, MessageChannel mc, Exception excptn) {
log.info("In afterReceiveCompletion");
}
}
Ja, ich habe vor ein paar Stunden angefangen, die Spring Integration zu lesen, und ich denke, die Antwort ist GlobalChannelInterceptor. Interceptor ist ein übliches Entwurfsmuster. es ist im Grunde, wenn Sie eine Anfrage oder Nachricht vor oder nach der Verarbeitung erhalten. –
Ja, in diesem Fall sollte ein '@ GlobalChannelInterceptor' hilfreich sein. –