2016-09-03 14 views
0

は私の前の質問には、より読みやすくへの変換、次は、単一のサーバー、単一のクライアント接続のために正常に動作します私のコードですが、私は私のクライアントは、動的に2台の以上のサーバを接続したい、は、複数のクライアントサーバー接続

 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(); 
    } 

} 

下のコードは似ていますが、異なるポートとIPを持つ別のサーバーがあり、これらのサーバーへの接続方法は?

class TCPServer 
{ 
    public static void main(String argv[]) throws Exception 
     { 
     String clientSentence; 
     String capitalizedSentence; 
     ServerSocket welcomeSocket = new ServerSocket(6785); 

     while(true) 
     { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = 
       new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      System.out.println("Received: " + clientSentence); 
      capitalizedSentence = clientSentence + "\r\n"; 
      outToClient.writeBytes(capitalizedSentence); 
     } 
     } 
} 

答えて

0

いくつかのコメント。

  1. の代わりにメッセージを送信するためのスレッドを開始、単にThreadPoolTaskExecutorを使用して、sendMessageChannelExecutorChannelを作る - それは、より効率的であることと、スレッドを管理する事業のうち、あなたを取得します。
  2. ダイナミックスキームを使用するのではなく、接続するサーバーが2つのみの場合は、2つのTCPアダプターを定義し、sendMessageChannelの後に@Routerを追加するだけです。
  3. ヘッダーを設定することによって、どのサーバーに送信するかをルーターに伝えることができます。

    @MessagingGateway(defaultRequestChannel = "sendMessageChannel") パブリックインターフェイスゲートウェイ{ ボイドviaTcp(文字列ペイロード@Header( "")は、文字列ターゲット)

    }

ヘッダwhich上の経路にHeaderValueRouterを使用します。

リファレンスマニュアルのMessage Routingを参照してください。

関連する問題