2013-11-08 4 views
0

У меня есть просто верблюд сервер MINA с помощью JAVA DSL, и я бегу как пример, документированной здесь:Apache верблюд отправить простое сообщение

Я пытаясь создать образец приложения, размещенного в «mina: tcp: // localhost: 9991» (aka MyApp_B), который отправляет очень простое сообщение серверу, размещенному на «mina: tcp: // localhost: 9990» (aka MyApp_A).

Я хочу отправить простое сообщение, содержащее строку в заголовке (это «Hellow World!») И с адресом в теле.

public class MyApp_B extends Main{ 

    public static final String MINA_HOST = "mina:tcp://localhost:9991"; 

    public static void main(String... args) throws Exception { 
     MyApp_B main = new MyApp_B(); 

     main.enableHangupSupport(); 

     main.addRouteBuilder(
       new RouteBuilder(){ 
        @Override 
        public void configure() throws Exception { 

         from("direct:start") 
         .setHeader("order", constant("Hello World!")) 
         .setBody(constant(MINA_HOST)) 
         .to("mina:tcp://localhost:9990"); 
        } 
       } 
       ); 

     System.out.println("Starting Camel MyApp_B. Use ctrl + c to terminate the JVM.\n"); 
     main.run(); 
    } 
} 

public class MainApp_A { 

    public static void main(String... args) throws Exception { 
     Main main = new Main(); 
     main.enableHangupSupport(); 
     main.addRouteBuilder(new RouteBuilder(){ 

      @Override 
      public void configure() throws Exception { 
       from("mina:tcp://localhost:9990").bean(MyRecipientListBean.class, 
         "updateServers").to("direct:debug"); 

       from("direct:debug").process(new Processor() { 
        public void process(Exchange exchange) throws Exception { 
         System.out.println("Received order: " + 
           exchange.getIn().getBody()); 
        } 
       }); 

      } 

     }); 
     main.run(args); 
    } 

} 

Bean используется MyApp_A:

public class MyRecipientListBean { 

    public final static String REMOVE_SERVER = "remove"; 
    public final static String ADD_SERVER = "add"; 

    private Set<String> servers = new HashSet<String>(); 

    public void updateServers(@Body String serverURI, 
      @Header("order") String order){ 


     System.out.println("===============================================\n"); 
     System.out.println("Received " + order + "request from server " + serverURI + "\n"); 
     System.out.println("===============================================\n"); 

     if(order.equals(ADD_SERVER)) 
      servers.add(serverURI); 
     else if(order.equals(REMOVE_SERVER)) 
      servers.remove(serverURI); 
    } 
} 

Я сделал этот код, тем не менее, кажется, что серверы с другой стороны, чтобы не получить ничего. Поэтому у меня есть 2 вопроса:

  1. Я делаю что-то неправильно?
  2. Есть ли лучший способ отправить сообщение с помощью Camel?
+0

Есть ли верблюд, выводящий любые журналы? Каков адрес вашего сервера MINA? Вы устанавливаете содержимое сообщения с портом '9991', но в' .to' вы указали номер порта '9000'. –

+0

Адрес другого сервера: «mina: tcp: // localhost: 9990». Адрес сервера, на котором выполняется этот конкретный образец, - «mina: tcp: // localhost: 9991». В этом случае я говорю серверу 9990, что я сервер 9991. Сервер 9990 ничего не печатает. Проблема в том, что сервер «mina: tcp: // localhost: 9990» ничего не получает от «mina: tcp: // localhost: 9991» –

+0

Вы не указали достаточно своего кода, чтобы узнать, что происходит. –

ответ

2

MyApp_A НЕ отправляет никаких сообщений. Чтобы начать маршрут, вам необходимо отправить сообщение в прямую конечную точку.

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

Добавлены последний комментарий по запросу:

да и прямой путь также работает. Его просто чтобы отправить сообщение направить, вам нужно сделать это с помощью Camel. direct является внутренним компонентом Camel для отправки сообщений между его конечной точкой (маршруты). Чтобы отправить сообщение на него, вы можете использовать шаблон производителя. См. Главу 7, раздел 7.7 в книге «Верблюд в действии».

+0

Я не понимаю что-то правильно, поэтому, пожалуйста, поправьте меня. MyApp_A, читается из «mina: tcp: // localhost: 9990», затем он вызывает bean-компонент метод, а затем он помещает сообщение в очередь «direct: debug». После этого я прочитал эту очередь и использую процессор для печати сообщений. Что не так с этим? Кроме того, зачем мне нужен таймер? Я имею в виду, что MyApp_A активирует маршрут после правильного получения сообщения от MyAPP_B? –

+1

А это был первый код, предполагая, что это был A, но это было B. –

+0

Нет проблем, это происходит с лучшими: P Я не понимаю, почему маршрут «direct: start» в MyApp_B не используется. Я имею в виду, что все маршруты на верблюде автоматически [автоматически запускаются по умолчанию] (http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html) правильно? –

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