1

Hallo Ich versuche, den folgenden Ablauf mit Spring Integration zu implementieren. Setzen Sie den REST-Service frei, manipulieren Sie die Payload, schreiben Sie die geänderte Payload in JMS und antworten Sie auf den REST-Service.Spring Integration: REST zu JMS-Integration geben Timeout-Fehler

@Bean 
public IntegrationFlow httpInputFlow() { 
    return IntegrationFlows 
      .from(Http.inboundGateway(“/company”) 
        .requestMapping(r -> r 
          .methods(HttpMethod.POST)) 
        .requestPayloadType(com.poc.model.Company.class)) 
      .transform(jsonToObjectTransformer()) 
      .channel(requestChannel()) 
      .get(); 
} 

@Bean 
@Transformer(inputChannel=“requestChannel”, outputChannel=“responseChannel”) 
ObjectToJsonTransformer jsonToObjectTransformer() { 
    return new ObjectToJsonTransformer(); 
} 
@Bean 
public DirectChannel requestChannel() { 
    return MessageChannels.direct().get(); 
} 
@Bean 
public DirectChannel responseChannel() { 
    return MessageChannels.direct().get(); 
} 
@Bean 
IntegrationFlow outboundFlow() throws Exception { 
    return IntegrationFlows.from(responseChannel()) .handle(Jms.outboundAdapter(connectionFactory()).destination(“samplequeue”)) 
      .get(); 
} 

Die Nutzdaten der Anforderung erreichen die Warteschlange. Der REST-Service-Timeout ohne Antwort. Ich brauche die umgewandelte Nutzlast, die in die Warteschlange gestellt und auch an die Antwort für den Restdienst gesendet werden soll. Ich konnte keine verfügbaren Beispiele finden.

Jede Hilfe wird geschätzt.

Antwort

1

Die responseChannel muss publishSubscribe sein, und Sie sollten eine weitere bridge subscrbiber haben, um die Antwort an das eingehende HTTP-Gateway zurücksenden zu lassen. Die Jms.outboundAdapter() in One-Way-Komponente und produziert keine Antworten. Auf diese Weise stoppt Ihr Flow und antwortet nicht mehr auf den Einstiegspunkt.

@Bean 
public IntegrationFlow httpInputFlow() { 
    return IntegrationFlows 
      .from(Http.inboundGateway("/company") 
        .requestMapping(r -> r 
          .methods(HttpMethod.POST)) 
        .reqestPayloadType(com.poc.model.Company.class)) 
      .transform(jsonToObjectTransformer()) 
      .publishSubscribeChannel(subscribers -> 
        subscribers.subscribe(f -> f 
         .handle(Jms.outboundAdapter(connectionFactory()).destination("samplequeue")))) 
      .bridge(null) 
      .get(); 
} 

Die publishSubscribeChannel() bietet gewünschten Kanal:

Ihren Anwendungsfall kann wie geschrieben werden. subscribers.subscribe() hinzufügen, dass Jms.outboundAdapter() als erster Teilnehmer. Die .bridge() wird als letzter (zweiter in unserem Fall) Teilnehmer zu diesem publishSubscribeChannel() hinzugefügt.

Die Idee hinter BridgeHandler, ihre Antwort an die replyChannel Header zu senden, die von der Http.inboundGateway() aufgefüllt wird.

+0

danke Artem, werde dies versuchen. – jack

+0

können Sie beraten, wie Sie den Bridge-Handler in .bridge() übergeben? Die Bridge-Methode erwartet Consumer > als Argument. Und die Beispiele sind in XML, nicht in Java dsl. – jack

+0

Muss '.brdige (null)' sein. Wir haben '.bridge()' ohne Argumente hinzugefügt, nachdem wir Java DSL nach Spring Integration Core in 5.0 verschoben haben. –