我正在尝试将替换xml配置用于基于java / annotation的配置,用于具有Spring Integration(版本4.0.6)的简单tcp服务器。 我使用@MessageEndpoint让它工作如下。问题是由于某种原因,使用@MessageEndpoint注释的类必须是静态的。我不能在其中注入豆子,因为这样可以做一些有用的事情。 根据我的理解,应该可以使用没有@MessageEndpoint的@ServiceActivator,但我无法弄清楚如何。
这就是我现在所拥有的。在评论中,您可以看到我试图替换的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。
提前致谢。
答案 0 :(得分:1)
Bean类必须是静态类或顶级类。
静态类是可以的,但你必须声明一个bean实例来自动装配或将其他bean注入实例......
@Bean Foo foo() {
return new Foo();
}
public static class Foo {
@Autowired
private Bar bar;
...
}
或者,如果您使用TcpServerContextConfiguration
对@MessageEndpoint
进行注释,则可以使用@ServiceActivator
样式而不使用@Bean
。如果升级到4.3.x(目前为4.3.5),则在课程级别不再需要@MessageEndpoint
。