2011-11-14 38 views
12

Tôi muốn phát triển một tuyến đường thăm dò một thư mục chứa các tệp CSV và cho mỗi tệp không thống nhất mỗi hàng bằng Bindy và xếp hàng trong activemq.Chiến lược tốt nhất để xử lý các tệp CSV lớn trong Apache Camel

Vấn đề là các tệp có thể khá lớn (một triệu hàng) vì vậy tôi muốn xếp hàng một hàng tại một thời điểm, nhưng những gì tôi nhận được là tất cả các hàng trong java.util.ArrayList ở cuối của Bindy gây ra vấn đề về bộ nhớ.

Cho đến nay tôi có một thử nghiệm nhỏ và unmarshaling đang làm việc để cấu hình Bindy bằng cách sử dụng chú thích là ok.

Dưới đây là các tuyến đường:

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal() 
    .bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 

Môi trường là: Eclipse Indigo, Maven 3.0.3, Camel 2.8.0

Cảm ơn bạn

Trả lời

26

Nếu bạn sử dụng Splitter EIP sau đó bạn có thể sử dụng chế độ phát trực tuyến có nghĩa là Camel sẽ xử lý tệp theo từng hàng.

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .split(body().tokenize("\n")).streaming() 
    .unmarshal().bindy(BindyType.Csv, "com.ess.myapp.core")   
    .to("jms:rawTraffic"); 
+0

Cảm ơn Claus cho bạn câu trả lời. Bây giờ tôi đang đối mặt với một vấn đề khác. Sau bài tập nhỏ của tôi, tôi đang cố gắng trích xuất từ ​​hàng đợi và ghi vào một tập tin với '.convertBodyTo (String.class) .to (" file: data/outbox? FileExist = Append ")' nhưng chỉ có hàng đầu tiên nhận được bằng văn bản. Tất cả như nhau, nếu tôi sử dụng tùy chọn tập tin Ghi đè tôi chỉ nhận được hàng cuối cùng. Có cách nào để có tất cả các hàng từ tệp CSV được ghi vào tệp không ?. Cảm ơn bạn – Taka

+0

Bạn cần chỉ định tên tệp, .to ("tệp: dữ liệu/hộp thư đi? FileName = data.csv & fileExist = Append") –

+0

Thêm '.thread()' sau '.streaming()' có thể hiệu quả hơn không ? – Pith

2

Đối với hồ sơ và cho những người dùng khác mà có thể đã tìm kiếm này càng nhiều càng tốt cho tôi, trong khi đó có vẻ là một phương pháp dễ dàng hơn mà cũng hoạt động tốt với useMaps:

CsvDataFormat csv = new CsvDataFormat() 
    .setLazyLoad(true) 
    .setUseMaps(true); 

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000") 
    .unmarshal(csv) 
    .split(body()).streaming() 
    .to("log:mappedRow?multiline=true"); 
Các vấn đề liên quan