2013-03-14 31 views
19

Tôi muốn chạy một số tác vụ thông thường độc lập của khách hàng trong nền của một ứng dụng Meteor (như cạo một số trang). Vì vậy, họ không nên được bên trong bất kỳ chủ đề khách hàng, nhưng một khi họ hoàn thành, tôi muốn cập nhật tất cả các khách hàng với thông tin. cách tốt nhất để đạt được điều này là gì?Tác vụ nền không được kết nối với bất kỳ ứng dụng khách nào trong Meteor

+0

Xin lưu ý rằng không có những điều như một "chủ đề của khách hàng" trong Meteor, trái với các giải pháp truyền thống hơn. Yêu cầu của khách hàng được xử lý không đồng bộ, không phải đa luồng. –

+0

Bạn nói đúng. Họ là sợi, một hợp tác đa tác vụ. – Mitar

Trả lời

5

Để làm điều này theo cách cho phép các quy trình bên ngoài tùy ý cập nhật các máy khách Meteor, hãy sử dụng giao thức DDP được liên kết với Meteor. Quy trình máy chủ của bạn có thể ghi vào kênh DDP và khi nào khách hàng của bạn sẽ cập nhật. Có một cái nhìn vào bài đăng này cho một ví dụ và một trường hợp sử dụng, mà có thể tương tự như của bạn:

Using node ddp-client to insert into a meteor collection from Node

Giao thức là khá thẳng về phía trước, và bài cho thấy một ví dụ về quá trình viết Node.js vào bộ sưu tập Mongo cập nhật ứng dụng khách trong thời gian thực.

+0

Ehm, bạn đã liên kết lại câu hỏi này? – Mitar

+0

Gah - xin lỗi về điều đó. Chỉ cần cố định. – mcauth

+0

Cách tiếp cận thú vị. – Mitar

6

Chạy chúng trên mã phía máy chủ của bạn. Nếu thông thường, bạn có nghĩa là các công việc được hẹn giờ mỗi ngày hoặc một cái gì đó:

Bạn có thể sử dụng công việc cron với gói cron của Tom Coleman: https://github.com/tmeasday/meteor-cron.

Bạn sẽ cần phải cài đặt meteorite package manager first: npm install meteorite -g và sau đó cài đặt gói cron trong dự án của bạn dir mrt add cron-tick

máy chủ js

var MyCron = new Cron(); 

// this job will happen every day (60 seconds * 60 * 24) 
MyCron.addJob(60*60*24, function() { 
    //Scrape your stuff 

    //Update your collections 
}); 

Ngay sau khi bạn chạy cập nhật của bạn/chèn/chỉnh sửa chúng sẽ được đẩy tới tất cả khách hàng.

+0

Có cách nào để đẩy thứ gì đó cho khách hàng không dựa trên bộ sưu tập (vì vậy không dựa trên thứ gì đó trong cơ sở dữ liệu)? Cũng giống như thông tin mà một cái gì đó đã được thực hiện? Một thông báo? – Mitar

+1

Trong đó công việc cron này chạy trong chuỗi nào? – Mitar

+1

Một mẹo nhỏ hơn một chút, javascript trong nút sẽ nằm trong một chuỗi duy nhất, vì vậy đây là nơi mà Fibers xuất hiện. Nếu bạn sử dụng một Meteor.call trong cron đến một thiên thạch.phương pháp với nhiệm vụ của bạn có chứa 'this.unblock' nội dung trong phương thức từ' this.unblock' sẽ chạy trong một sợi mới để không chặn các máy khách khác. Về những thứ khác mà thiên thạch có thể gửi, tôi khuyên bạn nên tính số lượng phòng bằng cách thu thập: http://stackoverflow.com/questions/10565654/how-does-the-messages-count-example-in-meteor-docs-work một nơi tốt để bắt đầu, nó phụ thuộc vào chính xác những gì bạn muốn gửi xuống. – Akshat

1

Bạn có thể thử gọi số Meteor.setInterval trên máy chủ (có thể là Meteor.startup). Điều đó sẽ hoạt động, mặc dù nó có thể không linh hoạt như giải pháp cron.

+1

Ý tưởng là tôi có thể có các quy trình độc lập, thậm chí tách chúng ra giữa nhiều máy chủ. Vì vậy, thực sự, nặng nề trên máy công nhân. – Mitar

0

Đến http://atmospherejs.com và tìm kiếm cron

Tốt nhất tôi thấy là percolate:synced-cron

Lắp đặt

meteor add percolate:synced-cron

Khái niệm cơ bản

SyncedCron.add({ 
    name: 'Crunch some important numbers for the marketing department', 
    schedule: function(parser) { 
    // parser is a later.parse object 
    return parser.text('every 2 hours'); 
    }, 
    job: function() { 
    var numbersCrunched = CrushSomeNumbers(); 
    return numbersCrunched; 
    } 
}); 

SyncedCron.start(); 

nâng cao

See their documentation

Các vấn đề liên quan