在我的Spring Boot应用程序中,我必须实现导入服务。用户可以提交一堆JSON文件,应用程序将尝试从这些文件中导入数据。根据JSON文件中的数据量,单个导入过程可能需要1或2个小时。
我不想在导入过程中阻止用户,因此我计划接受导入任务并通知用户此数据已安排进行处理。我将数据放入队列,另一端的空闲队列使用者将开始导入过程。此外,我需要有可能监视队列中的作业,并在需要时终止它们。
现在我正在考虑使用嵌入式Apache ActiveMQ
来介绍消息生成器和消费者逻辑,但在此之前我想问一下 - 从架构的角度来看 - 它是一个所描述任务的良好选择,或者可以使用更合适的工具实现..例如普通的Spring @Async
等等?
答案 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();
这里有一些例子
https://skills421.wordpress.com/2014/02/08/sending-local-files-to-a-jms-queue/
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