2016-11-23 3 views
0

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.

Antwort

1

Bean-Klassen müssen statische oder Top-Level-Klassen sein.

Statische Klassen sind in Ordnung, aber Sie haben eine Bean-Instanz zu erklären, autowire oder zu injizieren andere Bohnen in die Instanz ...

@Bean Foo foo() { 
    return new Foo(); 
} 

public static class Foo { 

    @Autowired 
    private Bar bar; 

    ... 
} 

Oder wenn Sie Ihre TcpServerContextConfiguration mit @MessageEndpoint mit Anmerkungen versehen, können Sie einfach die Verwendung @ServiceActivator Stil ohne die @Bean. Wenn Sie auf 4.3.x (derzeit 4.3.5) aktualisieren, wird @MessageEndpoint nicht mehr auf Klassenebene benötigt.

+0

Hallo Gary, vielen Dank für die schnelle Antwort. Ich hatte das Gefühl, dass Sie es beantworten werden :) – Yerke

+0

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

+1

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). –

Verwandte Themen