2016-09-01 1 views
1

У меня есть один сервер и количество клиентов, сервер отправит ответ и ждет подтверждения, дополнительно я хочу сохранить это соединение навсегда для следующего сообщения и подтверждения как мне создать это соединение в Spring Integration. Я читал о интеграции Spring, я не мог найти решение для подключения.Как создать и удержать несколько подключений в Spring Integration

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++;    
     }*/ 

    } 
} 


    @Service 
    public interface GatewayService<T> { 

    public void sendMessage(final T payload); 

    public void receiveMessage(String response); 

} 


@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(true); 
     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 class Message { 

    private String payload; 
    // getter setter 
} 


@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 = message; 
       //Object obj = gatewayContextManger.get(message.getPayload()); 
       synchronized (message) { 
        obj.notify(); 
        System.out.println("Message Received : "+message.getPayload()); 
       } 
      } 
     }).start(); 
    } 

} 
+0

которое соединение вы имеете в виду? базы данных, HTTP, JMS? –

+0

Соединения клиент-сервер – Shailesh

+0

Возможно, вы можете опубликовать часть кода, который у вас есть. – mdewit

ответ

0

У вас есть: clientConnectionFactory.setSingleUse(true); Это означает, что соединение будет закрыто после запроса; оставьте его ложным (по умолчанию), чтобы сохранить соединение открытым.

+0

ОК спасибо за ответ ...! Теперь я подключился к одному серверу, аналогично, я хочу подключить другой сервер или открыть другое соединение для другого, чтобы я мог оставаться подключенным к 2 серверам? как это сделать ? – Shailesh

+0

Вам нужен второй завод по подключению и исходящий шлюз. –

+0

означает, что для каждого соединения мне нужна одна фабрика соединений и один исходящий шлюз? – Shailesh

Смежные вопросы