2017-01-10 39 views
2

通過隊列運行作業我從ArangoDb 2.5.7移動ArangoDb 3.1.7。除了喬布斯之外,我已經成功地完成了所有工作。我看文檔,我不明白如果我必須爲此創建一個單獨的服務?如何arangodb

所以,我有一個福克斯應用對myApp

manifest.json的

{ 
"name": "myApp", 
"version": "0.0.1", 
"author": "Deepak", 
"files": 
{ 
    "/static": "static" 
}, 

"engines": 
{ 
    "arangodb": "^3.1.7" 
}, 

"scripts": 
{ 
    "setup": "./scripts/setup.js", 
    "myJob": "./scripts/myJob.js" 
}, 

"main": "index.js" 

}

index.js

'use strict'; 
module.context.use('/one', require('./app')); 

app.js

const createRouter = require('org/arangodb/foxx/router'); 
const controller = createRouter(); 
module.exports = controller; 

const queues = require('@arangodb/foxx/queues'); 
queue = queues.create('myQueue', 2); 
queue.push({mount:"/myJob", name:"myJob"}, {"a":4}, {"allowUnknown": true}); 

myJob.js

const argv = module.context.argv; 
var obj = argv[0]; 
console.log('obj:'+obj); 

我獲得以下錯誤:

Job failed: ArangoError: service not found Mount path: "/myJob".

我不知道我是否有擴大myJob作爲外部服務。你可以幫我嗎。我沒有看到如何去做的完整例子。

+1

您需要創建掛載點隊列中的另一個服務......在你的問題,你需要創建服務「myJob」.. 如果你想使用相同的服務,使用你的foxx安裝路徑,而不是「/ myJob」 –

+0

這是否意味着我需要創建另一個_db/_system/myJob/APP結構和manifest.json,index.js等..? –

回答

2

回答您的問題:

您不必將作業腳本提取到新服務中。您可以使用module.context.mount來指定當前服務的安裝點。

您可以找到有關文檔中的上下文對象的詳細信息:https://docs.arangodb.com/3.1/Manual/Foxx/Context.html

順便說一句,這可能不是一個好主意,在安裝的時候隨意創造就業機會。共同使用的情況下用於隊列是創建路由執行作業作爲傳入請求的副作用(例如,派遣上註冊一個歡迎電子郵件)。

如果您在掛載時創建一個作業(例如,在您的主文件或它所需的文件中),只要執行該文件,該作業就會創建,每個Foxx線程至少一次(默認ArangoDB使用多個Foxx線程來處理並行請求),或者每個請求(!)啓用一次開發模式。

同樣,如果你在創建安裝腳本工作每當執行安裝腳本將創建它,雖然這將只在一個線程中的每個時間(但仍然在發展模式被激活一次,每次請求)發生。

如果需要例如這旁邊住你的服務週期的工作,你應該把它放在一個獨特的隊列,只有在你的安裝腳本檢查是否已經存在後創建它。


隊列API的變化:

在2.6改變隊列API由於與舊的API會經常導致掛起的作業不正確改期當ArangoDB守護進程是一個嚴重的問題在作業被推入隊列後重新啓動。

具體ArangoDB 2.6推出所謂的基於腳本的(而不是基於函數的)作業類型:https://docs.arangodb.com/3.1/Manual/ReleaseNotes/UpgradingChanges26.html#foxx-queues

支持舊的基於功能的作業類型在ArangoDB 2.7滴出並將食譜配方進行了更新,反映基於腳本的作業類型:https://docs.arangodb.com/2.8/cookbook/FoxxQueues.html

新隊列的更詳細的描述可以在文檔中找到:https://docs.arangodb.com/3.1/Manual/Foxx/Scripts.html