Ich versuche zu ersetzen XML-Konfiguration zu Java/Annotation-basierte für einen einfachen TCP-Server mit Spring Integration (Version 4.0.6). Ich habe es funktioniert wie folgt mit @MessageEndpoint. Das Problem ist, dass aus irgendeinem Grund Klasse, die mit @MessageEndpoint annotiert ist, statisch sein muss. Ich kann deshalb keine Bohnen hineinspritzen, um etwas Nützliches zu tun. Von dem, was ich verstehe, sollte es möglich sein, @ServiceActivator ohne @MessageEndpoint zu verwenden, aber ich konnte nicht herausfinden, wie.@ServiceActivator ohne @MessageEndpoint im Frühjahr Integration Annotation config
Hier ist, was ich gerade habe. In den Kommentaren können Sie sehen, welchen XML-Teil ich ersetzen wollte.
@Configuration
@EnableIntegration
public class TcpServerContextConfiguration {
// <int-ip:tcp-connection-factory id="crLfServer"
// type="server"
// port="5678"
// single-use="true"
// so-timeout="10000"/>
@Bean
TcpNetServerConnectionFactory crLfServer() {
TcpNetServerConnectionFactory factory = new TcpNetServerConnectionFactory(5678);
factory.setSingleUse(true);
factory.setSoTimeout(10000);
return factory;
}
// <int-ip:tcp-inbound-gateway id="gatewayCrLf"
// connection-factory="crLfServer"
// request-channel="serverBytes2StringChannel"/>
@Bean
public TcpInboundGateway gatewayCrLf() {
TcpInboundGateway gateway = new TcpInboundGateway();
gateway.setConnectionFactory(crLfServer());
gateway.setRequestChannel(serverBytes2StringChannel());
return gateway;
}
@Bean
public MessageChannel serverBytes2StringChannel() {
return new DirectChannel();
}
// <int:channel id="toSA" />
@Bean
public MessageChannel toSA() {
return new DirectChannel();
}
// <int:service-activator input-channel="toSA"
// ref="echoService"
// method="test"/>
//
// <bean id="echoService"
// class="com.posera.www.poseraStats.site.EchoService" />
@MessageEndpoint
public static class Echo {
@ServiceActivator(inputChannel="toSA")
public String echoService(String req) {
return "echo:" + req;
}
}
// <int:object-to-string-transformer id="serverBytes2String"
// input-channel="serverBytes2StringChannel"
// output-channel="toSA"/>
@Bean
@Transformer(inputChannel="serverBytes2StringChannel", outputChannel="toSA")
public org.springframework.integration.transformer.Transformer serverBytes2String() {
return new ObjectToStringTransformer();
}
}
Also versuchte ich den folgenden Code mit @MessageEndpoint, aber es funktioniert nicht:
@ServiceActivator(inputChannel="toSA")
public String echoService(String req) {
return "echo:" + req;
}
ich die Antwort ich denke, so etwas wie diese Online Suche soll:
@Bean
@ServiceActivator(inputChannel="toSA")
public MessageHandler newEchoService() {
}
Aber ich Ich habe keine Ahnung, welche Implementierung der MessageHandler-Schnittstelle ich für den Eingangskanal verwenden muss, der zu diesem Zeitpunkt String ist.
Vielen Dank im Voraus.
Hallo Gary, vielen Dank für die schnelle Antwort. Ich hatte das Gefühl, dass Sie es beantworten werden :) – Yerke
Hinzufügen von '@ MessageEndpoint' zu TcpServerContextConfiguration half. Danke vielmals. Aber für mein Verständnis in der Zukunft: Gibt es eine Möglichkeit, '@ ServiceActivator' ohne' @ MessageEndpoint' zu verwenden, wie ich in der Frage beschrieben habe? – Yerke
Wie gesagt, ab 4.3 wird @ MessageEndpoint nicht mehr benötigt. Zuvor war es für POJO '@ ServiceActivator' erforderlich; Der '@ Bean'-Stil von' @ ServiceActivator' muss vom Typ 'MessageHandler' sein. Um diesen Stil zu verwenden, sollten Sie 'AbstractReplyProducingMessageHandler' ableiten und' handleRequestMessage() 'implementieren. Der Ausgabekanal muss im Handler angegeben werden, nicht im '@ ServiceActivator'. Es gibt zwei Beans, den Consumer-Endpunkt und den Handler. Siehe [die Dokumentation] (http://docs.spring.io/spring-integration/reference/html/configuration.html#annotations_on_beans). –