0

在我的 Spring Boot 应用程序中,我必须实现一个导入服务。用户可以提交一堆 JSON 文件,应用程序会尝试从这些文件中导入数据。根据 JSON 文件的数据量,单个导入过程可能需要 1 或 2 小时。

我不想在导入过程中阻止用户,因此我计划接受导入任务并通知用户此数据已安排处理。我会将数据放入队列,另一端的空闲队列消费者将开始导入过程。此外,我需要有可能监视队列中的作业,如果需要,可以终止它们。

现在我正在考虑使用 EmbeddedApache ActiveMQ来引入消息生产者和消费者逻辑,但在此之前我想问一下 - 从架构的角度来看 - 它是描述任务的好选择还是可以用一个更合适的工具..比如普通的Spring@Async等等?

4

1 回答 1

1

可以像这样与 Camel 同时处理文件

from("file://incoming?maxMessagesPerPoll=1&idempotent=true&moveFailed=failed&move=processed&readLock=none").threads(5).process()

看看http://camel.apache.org/file2.html

但我认为使用独立的 ActiveMQ、将文件移动到 ActiveMQ 的独立服务和独立的消费者能够独立地杀死或重新启动每个消费者会更好地满足您的要求。

正如您所说,最好使用 ActiveMQ,您可以轻松地创建一个服务来使用 Camel 将消息移动到队列中,如下所示:

        CamelContext context = new DefaultCamelContext();
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=true");
        context.addComponent("test-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        context.addRoutes(new RouteBuilder() {
            public void configure() {
            // convertBodyTo to use TextMessage or maybe send them as file to the Queue            from("file://testFolderPath").convertBodyTo(String.class).to("test-jms:queue:test.queue");
            }
        });
        context.start();

这里有一些例子

http://www.programcreek.com/java-api-examples/index.php?api=org.apache.camel.component.jms.JmsComponent

https://skills421.wordpress.com/2014/02/08/sending-local-files-to-a-jms-queue/

https://github.com/apache/camel/blob/master/examples/camel-example-jms-file/src/main/java/org/apache/camel/example/jmstofile/CamelJmsToFileExample.java

https://github.com/apache/camel/tree/master/examples

要监控和管理,您可以将 jmx 与 VisualVM 或 Hawtio 一起使用http://hawt.io/getstarted/index.html

http://camel.apache.org/camel-jmx.html

要消费,您可以将 DefaultMessageListenerContainer 与队列上的并发消费者一起使用,为此您需要更改 DefaultMessageListenerContainer 的 ConnectionFactory 上的 prefetchPolicy ,多线程 JMS 客户端 ActiveMQ

于 2017-05-04T20:28:59.800 回答