Как сохранить живой контекст apache в ветке main - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать простое приложение, которое будет прослушивать одну очередь от Артемиды, а затем обрабатывать сообщения и после этого создавать новое сообщение во второй очереди.

Я создал в методе Main Camel context и добавил маршрутизацию (он пересылает сообщения в бин).И чтобы проверить эту маршрутизацию и то, что этот компонент работает правильно, я отправляю несколько сообщений в эту очередь - сразу после запуска контекста в главном потоке

public static void main(String args[]) throws Exception {
    CamelContext context = new DefaultCamelContext();
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616", "admin", "admin");
    context.addComponent("cmp/q2", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));

    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("cmp/q2:cmp/q2").bean(DataRequestor.class, "doSmth(${body}, ${headers})");
        }
    });

    ProducerTemplate template = context.createProducerTemplate();
    context.start();

    for (int i = 0; i < 2; i++) {
        HashMap<String, Object> headers = new HashMap<String, Object>();
        headers.put("header1", "some header info");
        template.sendBodyAndHeaders("cmp/q2:cmp/q2", "Test Message: " + i, headers);
    }
    context.stop();
}

И в этом случае приложение работает нормально, но останавливается, когда методОсновное завершено - оно обрабатывает только те сообщения, которые были созданы им самостоятельно.Теперь, после того, как у меня есть тестовый компонент, который используется в маршрутизации, я хочу изменить приложение таким образом, чтобы оно запускалось и оставалось активным (поддерживая контекст camle и подпрограмму активными) - чтобы я мог создавать массажи вручную в веб-интерфейсе (активная консоль управления mq).).

Но я действительно не знаю как.Я пробовал бесконечный цикл с Thread.sleep (5000);Я попытался запустить еще один поток (также с бесконечным циклом) в основном методе.Но это не сработало. (Самым подозрительным для меня в случае с бесконечным циклом является то, что приложение работает, но когда я создаю сообщение в веб-интерфейсе, оно просто исчезает - и в системе не остается никаких следов того, что он был обработан моим компонентомв маршрутизации предположим, что он должен обрабатываться моим компонентом или просто оставаться в очереди без изменений, но он просто исчезает).

Я теперь, когда мой вопрос является пустым, но я уже потратил 3 дня, чтобы найтирешение, поэтому любые советы или ссылки на учебники или некоторую ценную информацию приветствуются.

PS: У меня есть одно болезненное ограничение - Spring Framework не допускается.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Я думаю, что самое простое решение для запуска автономного верблюда - запустить его с верблюдом Main .В онлайн-документации Camel также есть пример использования http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html. Я скопирую и вставлю здесь пример кода на всякий случай:

public class MainExample {

    private Main main;

    public static void main(String[] args) throws Exception {
        MainExample example = new MainExample();
        example.boot();
    }

    public void boot() throws Exception {
        // create a Main instance
        main = new Main();
        // bind MyBean into the registry
        main.bind("foo", new MyBean());
        // add routes
        main.addRouteBuilder(new MyRouteBuilder());
        // add event listener
        main.addMainListener(new Events());
        // set the properties from a file
        main.setPropertyPlaceholderLocations("example.properties");
        // run until you terminate the JVM
        System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n");
        main.run();
    }

    private static class MyRouteBuilder extends RouteBuilder {
        @Override
        public void configure() throws Exception {
            from("timer:foo?delay={{millisecs}}")
                .process(new Processor() {
                    public void process(Exchange exchange) throws Exception {
                        System.out.println("Invoked timer at " + new Date());
                    }
                })
                .bean("foo");
        }
    }

    public static class MyBean {
        public void callMe() {
            System.out.println("MyBean.callMe method has been called");
        }
    }

    public static class Events extends MainListenerSupport {

        @Override
        public void afterStart(MainSupport main) {
            System.out.println("MainExample with Camel is now started!");
        }

        @Override
        public void beforeStop(MainSupport main) {
            System.out.println("MainExample with Camel is now being stopped!");
        }
    }
}

Маршрут будет выполняться до тех пор, пока вы не нажмете Ctlr + c или не остановите его.каким-то другим способом ... Если вы проверите это, обратите внимание, что вам нужен файл example.properties в вашем classpath со свойством millisecs.

0 голосов
/ 20 октября 2018

Как минимум, вам нужен основной поток, чтобы запустить поток, чтобы запустить верблюжий маршрут, а затем проверить, когда этот поток закончится.Простой подход Java-потоков, использующий основной цикл для проверки .wait () и конец потока верблюжьего маршрута, чтобы сигнализировать .notify (), когда он завершает (или завершает работу), завершит работу.

ОттудаВы можете посмотреть в службу исполнителя или использовать микроконтейнер типа Apache Karaf

PS.Реквизит для отпуска без весны!

...