私は、クライアントサーバーの接続には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();
}
}
これは私がサーバーにリクエストを送信し、応答が時間内に来ていない場合は、サーバーが利用できない場合、その後どのように私は例外またはソケット例外を時間をキャッチする必要があり、私のクライアント側のコードですか?
あなたの質問は不明です - どちら側にタイムアウトがありますか?何を試しましたか?あなたの設定も表示してください。 –
私はこの種のシナリオを持っています[リンク] http://stackoverflow.com/questions/26646963/in-spring-integration-how-do-i-catching-different-exceptions [リンク]違いは私は注釈を使用しています。 – Shailesh