2016-09-28 3 views
0

私は、クライアントサーバーの接続にはAbstractClientConnectionFactoryを使用しています。コンテキストのためのCorrelationStrategyをそれぞれ送受信するためのTcpReceivingChannelAdapter、TcpSendingMessageHandlerを使用しています。この場合、どのようにtimeoutExceptionを処理できますか?注釈を使用しているバネ統合でタイムアウト例外を処理するにはどうすればよいですか?

  public class ClientCall { 
    public static void main(String[] args) { 
     @SuppressWarnings("resource") 
     ApplicationContext ctx = new AnnotationConfigApplicationContext(GatewayConfig.class); 
     GatewayService gatewayService = ctx.getBean(GatewayService.class); 
     //int i=0; 
     Message message = new Message();   
     /*while(i<4) 
     {*/ 
      message.setPayload("It's working"); 
      gatewayService.sendMessage(message); 
     /* i++;    
     }*/ 

    } 
} 

public class Message { 

    private String payload; 
    // getter setter 
} 

@EnableIntegration 
@IntegrationComponentScan 
@Configuration 
@ComponentScan(basePackages = "com.gateway.service") 
public class GatewayConfig { 

    // @Value("${listen.port:6788}") 
    private int port = 6785; 

    @Autowired 
    private GatewayService<Message> gatewayService; 

    @MessagingGateway(defaultRequestChannel = "sendMessageChannel") 
    public interface Gateway { 
     void viaTcp(String payload); 
    } 

    @Bean 
    public AbstractClientConnectionFactory clientCF() { 
     TcpNetClientConnectionFactory clientConnectionFactory = new TcpNetClientConnectionFactory("localhost", 
       this.port); 
     clientConnectionFactory.setSingleUse(false); 
     return clientConnectionFactory; 
    } 

    @Bean 
    @ServiceActivator(inputChannel = "sendMessageChannel") 
    public MessageHandler tcpOutGateway(AbstractClientConnectionFactory connectionFactory) { 
     TcpOutboundGateway outGateway = new TcpOutboundGateway(); 
     outGateway.setConnectionFactory(connectionFactory); 
     // outGateway.setAsync(true); 
     outGateway.setOutputChannel(receiveMessageChannel()); 
     outGateway.setRequiresReply(true); 
     outGateway.setReplyChannel(receiveMessageChannel()); 
     return outGateway; 
    } 

    @Bean 
    public MessageChannel sendMessageChannel() { 
     DirectChannel channel = new DirectChannel(); 
     return channel; 
    } 


    @Bean 
    public MessageChannel receiveMessageChannel() { 
     DirectChannel channel = new DirectChannel(); 
     return channel; 
    } 

    @Transformer(inputChannel = "receiveMessageChannel", outputChannel = "processMessageChannel") 
    public String convert(byte[] bytes) { 
     return new String(bytes); 
    } 

    @ServiceActivator(inputChannel = "processMessageChannel") 
    public void upCase(String response) { 
     gatewayService.receiveMessage(response); 
    } 

    @Transformer(inputChannel = "errorChannel", outputChannel = "processMessageChannel") 
    public void convertError(byte[] bytes) { 
     String str = new String(bytes); 
     System.out.println("Error: " + str); 
    } 

} 


public interface GatewayService<T> { 

    public void sendMessage(final T payload); 

    public void receiveMessage(String response); 

} 


@Service 
public class GatewayServiceImpl implements GatewayService<Message> { 

    @Autowired 
    private Gateway gateway; 

    @Autowired 
    private GatewayContextManger<String, Object> gatewayContextManger; 

    @Override 
    public void sendMessage(final Message message) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       gateway.viaTcp(message.getPayload()); 
      } 
     }).start(); 
    } 

    @Override 
    public void receiveMessage(final String response) { 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       Message message = new Message(); 
       message.setPayload(response); 
       Object obj = gatewayContextManger.get(message.getPayload()); 
       synchronized (obj) { 
        obj.notify(); 
       } 
      } 
     }).start(); 
    } 

} 

これは私がサーバーにリクエストを送信し、応答が時間内に来ていない場合は、サーバーが利用できない場合、その後どのように私は例外またはソケット例外を時間をキャッチする必要があり、私のクライアント側のコードですか?

+0

あなたの質問は不明です - どちら側にタイムアウトがありますか?何を試しましたか?あなたの設定も表示してください。 –

+0

私はこの種のシナリオを持っています[リンク] http://stackoverflow.com/questions/26646963/in-spring-integration-how-do-i-catching-different-exceptions [リンク]違いは私は注釈を使用しています。 – Shailesh

答えて

0

メッセージングゲートウェイにエラーチャネルを追加します。 ErrorMessageを受信します。ペイロードはとfailedMessageの2つのプロパティを持つMessagingExceptionです。

+0

@Bean \t公共MessageChannel printError() \t {\t \t DirectChannelチャネルは=新しいDirectChannel()。 \t \t \t \tリターンチャネル; \t}正しいですか? – Shailesh

+0

答えを得ました...! – Shailesh

関連する問題