2017-05-16 3 views
-2

Ich verwende spring 4 Annotation-basierte Konfiguration, und möchte einen einfachen Telnet/Socket-Client einrichten.Wie wird ein Socket-Client mit Federintegration eingerichtet?

Dies ist, was ich bisher:

@MessageEndpoint 
public class MySocket { 
    @Bean 
    public TcpConnectionFactoryFactoryBean clientFactory() { 
     TcpConnectionFactoryFactoryBean fact = new TcpConnectionFactoryFactoryBean(); 
     fact.setType("client"); 
     fact.setHost(host); 
     fact.setPort(port); 
     fact.setUsingNio(true); 
     fact.setSingleUse(true); 
     fact.setSoTimeout(timeout); 
     return fact; 
    } 

    @Bean 
    public MessageChannel clientChannel() { 
     return new DirectChannel(); 
    } 

    @Bean 
    @ServiceActivator(inputChannel = "clientChannel") 
    public TcpOutboundGateway outGateway(TcpNioClientConnectionFactory factory, 
      @Qualifier("clientChannel") MessageChannel clientChannel) throws Exception { 
     TcpOutboundGateway gate = new TcpOutboundGateway(); 
     gate.setConnectionFactory(factory); 
     gate.setReplyChannel(clientChannel); 
     return gate; 
    } 
} 

@Component 
public class MyMessageService { 
    @Autowired 
    @Qualifier("clientChannel") 
    private MessageChannel clientChannel; 

    public void run() { 
    Message<String> msg = MessageBuilder.withPayload("test").build(); 
    Message<?> rsp = new MessagingTemplate(clientChannel).sendAndReceive(msg); 
    } 
} 

Ergebnis: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers

Was soll ich hier fehlt die Nachricht über die Buchse zu senden und die Antwort erhalten?

Antwort

1

Sie die @MessageEndpoint Annotation nicht benötigen, aber man braucht einen Verbraucher auf dem Kanal ...

@ServiceActivator(inputChannel = "clientChannel") 
@Bean 
public TcpOutboundGateway outGateway(AbstractClientConnectionFactory scf) { 
    ... 
} 

Das Gateway benötigt einen Verweis auf die Verbindungsfactory. Da Sie eine Factory-Bean verwenden, ist es am einfachsten, sie der Factory-Methode der Bean als Parameter hinzuzufügen.

+0

Sie meinen wahrscheinlich eine 'AbstractClientConnectionFactory' als scf Parameter? Ich habe den 'TcpOutboundGateway' zu meinem obigen Beitrag hinzugefügt. Aber jetzt kommt der Fehler: 'Parameter 0 der Methode outGateway in MySocket benötigt eine Bean vom Typ 'org.springframework.integration.ip.tcp.connection. AbstractClientConnectionFactory 'konnte nicht gefunden werden. Ist der '@ ServiceActivator' auf dem Gateway korrekt? – membersound

+0

Entschuldigung; Ja, ich meinte Klient. Ja, '@ ServiceActivator' umschließt das Gateway in einer Consumer-Bean. Ich schlage vor, Sie ändern die 'clientFactory' Bean, um eine' TcpNioClientConnectionFactory' direkt zu erstellen, anstatt den FB zu verwenden. –

+0

Wenn ich dies tue, erhalte ich immer noch einen Fehler. Etwas muss noch fehlen. Der Anwendungs-Startfehler msg ist (kurz): 'Die Abhängigkeiten einiger Beans im Anwendungskontext bilden einen Zyklus: MyMessageService> MySocket> outGateway> clientChannel'. – membersound

Verwandte Themen