Spring Boot和长期运行的任务

时间:2017-05-04 18:46:47

标签: spring-boot architecture activemq spring-async

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

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

现在我正在考虑使用嵌入式Apache ActiveMQ来介绍消息生成器和消费者逻辑,但在此之前我想问一下 - 从架构的角度来看 - 它是一个所描述任务的良好选择,或者可以使用更合适的工具实现..例如普通的Spring @Async等等?

1 个答案:

答案 0 :(得分:1)

可以像Camet一样同时处理文件

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,Multithreaded JMS client ActiveMQ