2017-01-07 7 views
0

공식 RabbitMQ 자바 스크립트 튜토리얼RabbitMQ의 amqp.node 통합

amqp.connect('amqp://localhost', function(err, conn) { 
    conn.createChannel(function(err, ch) { 
    var q = 'hello'; 

    ch.assertQueue(q, {durable: false}); 
    // Note: on Node 6 Buffer.from(msg) should be used 
    ch.sendToQueue(q, new Buffer('Hello World!')); 
    console.log(" [x] Sent 'Hello World!'"); 
    }); 
}); 

그러나, 나는 그것이 다른 곳에서이 코드를 재사용하기 어렵다 찾을 amqp.node 클라이언트 라이브러리의 사용을 보여 표현한다. 특히, 채널 객체가 콜백되어 있기 때문에 채널 객체를 내보내는 방법을 알지 못합니다. 내 NodeJs/Express 앱의 예 :

app.post('/posts', (req, res) => { 
    -- Create a new Post 
    -- Publish a message saying that a new Post has been created 
    -- Another 'newsfeed' server consume that message and update the newsfeed table 
    // How do I reuse the channel 'ch' object from amqp.node here 
}); 

이 지침에 대한 지침이 있습니까? 다른 라이브러리에 대한 제안을 환영합니다. (시작한 이래로, 가장 쉬운 것으로 생각되는 것이 사용 용이)

+0

채널 개체를 내 보내야하는 경우 채널을 만드는 파일에서 'module.exports'를 사용할 수 있습니다. 예를 들어,'conn.createChannel' 콜백 안에서'module.exports.channel = ch'를 호출하십시오. 그런 다음 'channelCreatingScript.channel'과 같은 스크립트를 작성하는'필수 '파일을 다른 파일에서 액세스 할 수 있습니다. – ishmaelMakitla

+0

시작됩니다 undefined – rocketspacer

+1

수출 명세서를 외부에 넣을 수 있습니다 - 그리고 그것을 'null'또는 '{}'로 지정할 수 있습니다. 'module.exports.channel'을 통해 새로운 값을 할당하면 그것을 업데이트 할 것입니다. – ishmaelMakitla

답변

0

설명에 설명 된대로 module.exports을 사용하여 새로 생성 된 채널을 노출 할 수 있습니다. 물론 채널 배열이나 다른 데이터 구조를 유지하려는 경우가 아니라면 새 채널을 만들 때마다 재정의됩니다. 이 가정하면 channelCreator.js라는 스크립트에이 도움이

var channelCreator = require("<path>/channelCreator.js"); 
    //this is where you can access the channel object: 
    if(channelCreator.channel){ 
     channelCreator.channel.sendToQueue('QueueName', new Buffer('This is Some Message.')); 
     console.log(" [x] Sent 'Message'"); 
    } 

희망 : 당신은 "수출"채널을 사용할 수 있습니다 스크립트에서

amqp.connect('amqp://localhost', function(err, conn) { 
    conn.createChannel(function(err, ch) { 
    var q = 'hello'; 

    ch.assertQueue(q, {durable: false}); 
    //this is where you can export the channel object 
    module.exports.channel = ch; 
    //moved the sending-code to some 'external script' 
    }); 
}); 

.

+0

channelCreator.channel이 정의되지 않은 경우 어떻게됩니까? 나는 내 메시지를 바로 떨어 뜨릴 수 없는가? 가능한 시나리오는 내가 초기화 될 때까지 기다리는 것이지만, 언제 그것이 될지 모르겠습니다. – rocketspacer

+0

정말 도움이되어 주셔서 감사합니다. 나는 나와 함께 당신의 시간을 보내 주셔서 정말로 감사합니다. D – rocketspacer

+1

도와 드리겠습니다. 채널이 생성 될 때까지 기다리기를 원하는 경우에는'amqplib' 예제처럼 콜백 함수를 사용해야한다고 생각합니다. – ishmaelMakitla

1

amqp.node는 AMQP에서 Node.js 로의 최소 변환을 수행하는 저수준 API 세트입니다. 기본적으로 더 친숙한 API에서 사용해야하는 드라이버입니다.

DIY 솔루션을 원하면 모듈에서 내보내고 해당 API 파일 내에서 연결, 채널 및 기타 개체를 관리 할 수있는 API를 만드십시오.

하지만 직접하는 것은 좋지 않습니다. 일을 올바르게하는 것은 쉽지 않습니다.

나는 이것을 처리하기 위해 Rabbot (https://github.com/arobson/rabbot/)과 같은 라이브러리를 사용할 것을 제안합니다.

저는 지금 꽤 오랫동안 Rabbot을 사용 해왔고 실제로 작동하는 방식을 정말 좋아합니다. AMQP의 세부 사항을 없애고, 필자가 필요로하는 응용 프로그램 및 메시징 패턴의 비즈니스 가치에 초점을 맞춰서 우화를 만듭니다.