2017-06-26 12 views
0

私はspring-integration-ipで、クライアントとしてのソケット接続を使用しています:Springでアクティブなソケット接続を正しく終了するにはどうすればいいですか?

@Bean 
public AbstractClientConnectionFactory clientFactory() throws Exception { 
    TcpConnectionFactoryFactoryBean f = new TcpConnectionFactoryFactoryBean(); 
    f.setType("client"); 
    f.setHost(host); 
    f.setPort(port); 
    ... 
} 

@Bean 
@ServiceActivator(inputChannel = "clientChannel") 
public TcpOutboundGateway outboundGatewasy(AbstractClientConnectionFactory factory) throws Exception { 
    TcpOutboundGateway g = new TcpOutboundGateway(); 
    g.setConnectionFactory(factory); 
    g.setRequiresReply(true); 
    return gate; 
} 

今私は@Autowired TcpOutboundGateway gateを注入できます。しかし、.beforeShutdown()getActiveConnections()のような方法はありません。

したがって、アプリケーションがシャットダウンされたときにアクティブなソケット接続を取得するにはどうすればよいですか?

+0

アプリがシャットダウンする前に、接続を閉じますか? –

+0

アクティブな接続の場合は、特定の時間だけシャットダウンを延期します。その後、アプリケーションがシャットダウンする前に接続を閉じます。 – membersound

答えて

1

接続は、ゲートウェイではなく接続ファクトリによって管理されます。

代わりに接続ファクトリを自動配線し、getOpenConnectionIds()を使用してください。

closeConnection(String connectionId)を使用して接続を閉じます。

EDIT

@SpringBootApplication 
public class So44760185Application { 

    public static void main(String[] args) { 
     ConfigurableApplicationContext context = SpringApplication.run(So44760185Application.class, args); 
     MessageChannel channel = context.getBean("clientChannel", MessageChannel.class); 
     try { 
      channel.send(new GenericMessage<>("foo")); 
      System.err.println("Expected ConnectException"); 
     } 
     catch (MessagingException e) { 
      if (!(e.getCause().getCause() instanceof ConnectException)) { 
       throw e; 
      } 
      System.out.println("good1"); 
     } 

     context.getBean(ShuttingDownAdvice.class).shuttingDown = true; 

     try { 
      channel.send(new GenericMessage<>("foo")); 
      System.err.println("Expected shutting down exception"); 
     } 
     catch (MessagingException e) { 
      if (!(e.getCause().getMessage().equals("No new connections allowed"))) { 
       throw e; 
      } 
      System.out.println("good2"); 
     } 
     context.close(); 
    } 

    @Bean 
    public static TcpConnectionFactoryFactoryBean connectionFactoryBean() { 
     TcpConnectionFactoryFactoryBean f = new TcpConnectionFactoryFactoryBean(); 
     f.setType("client"); 
     f.setHost("localhost"); 
     f.setPort(1234); 
     return f; 
    } 

    @Bean 
    @ServiceActivator(inputChannel = "clientChannel") 
    public TcpOutboundGateway outboundGateway(AbstractClientConnectionFactory factory) throws Exception { 
     TcpOutboundGateway g = new TcpOutboundGateway(); 
     g.setConnectionFactory(factory); 
     g.setRequiresReply(true); 
     g.setAdviceChain(Collections.singletonList(advice())); 
     return g; 
    } 

    @Bean 
    public ShuttingDownAdvice advice() { 
     return new ShuttingDownAdvice(); 
    } 

    public static class ShuttingDownAdvice extends AbstractRequestHandlerAdvice { 

     private volatile boolean shuttingDown; 

     @Override 
     protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception { 
      if (this.shuttingDown) { 
       throw new RuntimeException("No new connections allowed"); 
      } 
      return callback.execute(); 
     } 

    } 

} 
+0

'AbstractClientConnectionFactory'に、現在保留中の接続をシャットダウンするまで特定の時間待っている間に、「オープンソケット」要求を拒否するように指示することはできますか? – membersound

+0

いいえ、ただし、[アウトバウンドゲートウェイにカスタムアドバイス](http://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#custom-advice)を追加すると。アドバイスチェーンは '@ServiceActivator'アノテーションによって作成された' ConsumerEndpoint'を実行するので、Javaの設定でやるのはやや難しいことです。代わりに 'ConsumerEndpointFactoryBean'' @ Bean'を使うことができます。 –

+0

この目的のために 'ConsumerEndpointFactoryBean'の例を挙げることはできませんでしたか?それは本当に理解することが難しいです... – membersound

関連する問題