2016-11-23 3 views
0

Я пытаюсь использовать замену 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 в этой точке.

Заранее спасибо.

ответ

1

Классы бобов должны быть статическими или классами верхнего уровня.

Статические классы в порядке, но вы должны объявить экземпляр боб для autowire или впрыснуть другие бобы в экземпляр ...

@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 больше не требуется на уровне класса.

+0

Привет, Гэри, спасибо за такой быстрый ответ. У меня возникло чувство, что вы ответите на него :) – Yerke

+0

Добавлена ​​поддержка '@ MessageEndpoint' в TcpServerContextConfiguration. Большое спасибо. Но для моего понимания в будущем: есть ли способ использовать '@ ServiceActivator' без @ MessageEndpoint, как я описал в вопросе? – Yerke

+1

Как я уже сказал, @ @ MessageEndpoint больше не требуется с 4.3. До этого это требовалось для POJO '@ ServiceActivator'; стиль '@ Bean'' @ ServiceActivator' должен быть типа 'MessageHandler'. Чтобы использовать этот стиль, вы должны подклассифицировать «AbstractReplyProducingMessageHandler» и реализовать 'handleRequestMessage()'. Выходной канал должен быть указан в обработчике, а не в '@ ServiceActivator'. Есть две компоненты, конечная точка потребителя и обработчик. См. [Документация] (http://docs.spring.io/spring-integration/reference/html/configuration.html#annotations_on_beans). –