Я пытаюсь использовать замену xml-конфигурации на java/аннотацию, основанную на одном сервере tcp с интеграцией Spring (версия 4.0.6). Я получил его работу следующим образом, используя @MessageEndpoint. Проблема в том, что по какой-то причине класс, аннотированный с помощью @MessageEndpoint, должен быть статичным. Я не могу вводить в него бобы из-за этого делать что-то полезное. Из того, что я понимаю, должно быть возможно использовать @ServiceActivator без @MessageEndpoint, но я не мог понять, как это сделать.@ServiceActivator без @MessageEndpoint в Spring Конфигурация аннотации интеграции
Вот что я имею прямо сейчас. В комментариях вы можете увидеть, какую часть xml я попытался заменить.
@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();
}
}
Так что я попытался следующий код с @MessageEndpoint, но он не:
@ServiceActivator(inputChannel="toSA")
public String echoService(String req) {
return "echo:" + req;
}
Я думаю, ответ, который я ищу если что-то вроде этого:
@Bean
@ServiceActivator(inputChannel="toSA")
public MessageHandler newEchoService() {
}
Но я не знаю, какую реализацию интерфейса MessageHandler мне нужно использовать для входного канала, который является String в этой точке.
Заранее спасибо.
Привет, Гэри, спасибо за такой быстрый ответ. У меня возникло чувство, что вы ответите на него :) – Yerke
Добавлена поддержка '@ MessageEndpoint' в TcpServerContextConfiguration. Большое спасибо. Но для моего понимания в будущем: есть ли способ использовать '@ ServiceActivator' без @ MessageEndpoint, как я описал в вопросе? – Yerke
Как я уже сказал, @ @ MessageEndpoint больше не требуется с 4.3. До этого это требовалось для POJO '@ ServiceActivator'; стиль '@ Bean'' @ ServiceActivator' должен быть типа 'MessageHandler'. Чтобы использовать этот стиль, вы должны подклассифицировать «AbstractReplyProducingMessageHandler» и реализовать 'handleRequestMessage()'. Выходной канал должен быть указан в обработчике, а не в '@ ServiceActivator'. Есть две компоненты, конечная точка потребителя и обработчик. См. [Документация] (http://docs.spring.io/spring-integration/reference/html/configuration.html#annotations_on_beans). –