Верблюд Apache отправляет простое сообщение

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

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

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

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

}

Бин, используемый 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?

person Flame_Phoenix    schedule 08.11.2013    source источник
comment
Выводит ли Camel какие-либо журналы? Какой адрес вашего сервера MINA? Вы установили содержимое сообщения с портом 9991, но в .to указали номер порта 9000.   -  person Przemyslaw Kruglej    schedule 08.11.2013
comment
Адрес другого сервера: mina:tcp://localhost:9990. Адрес сервера, на котором работает этот конкретный образец, — mina:tcp://localhost:9991. В этом случае я говорю серверу 9990, что я сервер 9991. Сервер 9990 ничего не печатает. Проблема в том, что сервер mina:tcp://localhost:9990 ничего не получает от mina:tcp://localhost:9991.   -  person Flame_Phoenix    schedule 08.11.2013
comment
Вы не предоставили достаточно кода, чтобы увидеть, что происходит.   -  person Robin Green    schedule 09.11.2013
comment
Исправил, добавил весь код. Надеюсь теперь достаточно =(   -  person Flame_Phoenix    schedule 09.11.2013


Ответы (1)


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

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

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

да и прямой маршрут тоже ходит. Просто чтобы отправить сообщение в директ, вам нужно сделать это с помощью Camel. direct — это внутренний компонент Camel для отправки сообщений между его конечной точкой (маршрутами). Чтобы отправить ему сообщение, вы можете использовать шаблон производителя. См. главу 7, раздел 7.7 в книге Camel in Action.

person Claus Ibsen    schedule 09.11.2013
comment
Я что-то не так понимаю, так что, пожалуйста, поправьте меня. MyApp_A читает из mina:tcp://localhost:9990, затем вызывает метод bean-компонента, а затем помещает сообщение в очередь direct:debug. После этого я читаю эту очередь и использую процессор для печати сообщений. Что с этим не так? Кроме того, зачем мне нужен таймер? Я имею в виду, что MyApp_A активирует маршрут, как только получит сообщение от MyAPP_B, правильно? - person Flame_Phoenix; 09.11.2013
comment
Нет проблем, это случается с лучшими: P Я не понимаю, почему маршрут (direct: start) в MyApp_B не используется. Я имею в виду, что все маршруты в верблюде автоматически автоматически запускаются по умолчанию< /а> верно? - person Flame_Phoenix; 09.11.2013
comment
да и прямой маршрут тоже ходит. Просто чтобы отправить сообщение в директ, вам нужно сделать это с помощью Camel. direct — это внутренний компонент Camel для отправки сообщений между его конечной точкой (маршрутами). Чтобы отправить ему сообщение, вы можете использовать шаблон производителя. См. главу 7, раздел 7.7 в книге Camel in Action. - person Claus Ibsen; 10.11.2013
comment
Действительно, шаблоны спасают жизнь. Спасибо ! Также было бы здорово, если бы вы включили свой последний комментарий в свой основной ответ, чтобы я мог его отметить: D - person Flame_Phoenix; 10.11.2013