Spring 集成注释配置中没有@MessageEndpoint 的@ServiceActivator
@ServiceActivator without @MessageEndpoint in Spring Integration annotation config
我正在尝试将 xml 配置替换为基于 java/annotation 的配置,用于具有 Spring 集成(版本 4.0.6)的简单 tcp 服务器。
我使用@MessageEndpoint 使其工作如下。问题是由于某种原因,用@MessageEndpoint 注释的 class 必须是静态的。我不能在其中注入 bean 来做一些有用的事情。
据我了解,应该可以在没有@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。
提前致谢。
Bean classes 必须是静态的或顶级的 classes。
静态 classes 是可以的,但是你必须声明一个 bean 实例来自动装配或将其他 bean 注入到实例中...
@Bean Foo foo() {
return new Foo();
}
public static class Foo {
@Autowired
private Bar bar;
...
}
或者,如果您使用 @MessageEndpoint
注释 TcpServerContextConfiguration
,则可以只使用 @ServiceActivator
样式而不使用 @Bean
。如果升级到 4.3.x(当前为 4.3.5),class 级别不再需要 @MessageEndpoint
。
我正在尝试将 xml 配置替换为基于 java/annotation 的配置,用于具有 Spring 集成(版本 4.0.6)的简单 tcp 服务器。 我使用@MessageEndpoint 使其工作如下。问题是由于某种原因,用@MessageEndpoint 注释的 class 必须是静态的。我不能在其中注入 bean 来做一些有用的事情。 据我了解,应该可以在没有@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。
提前致谢。
Bean classes 必须是静态的或顶级的 classes。
静态 classes 是可以的,但是你必须声明一个 bean 实例来自动装配或将其他 bean 注入到实例中...
@Bean Foo foo() {
return new Foo();
}
public static class Foo {
@Autowired
private Bar bar;
...
}
或者,如果您使用 @MessageEndpoint
注释 TcpServerContextConfiguration
,则可以只使用 @ServiceActivator
样式而不使用 @Bean
。如果升级到 4.3.x(当前为 4.3.5),class 级别不再需要 @MessageEndpoint
。