2011-08-03 12 views
12

私達の会社には、PythonベースのWebサイトとDjango/CeleryとRabbitMQを介して通信するいくつかのPythonベースのワーカーノードがあります。私はCeleryベースの作業者にタスクを提出する必要があるJavaベースのアプリケーションを持っています。私はJavaからRabbitMQにジョブを送ることはできますが、セラーリーベースのワーカーは決して仕事を引き受けません。両方のタイプの仕事提出のパケットキャプチャを見ると、相違点はありますが、デコードに関する文書を見つけることができないバイナリであるため、どのように対処するかはわかりません。誰でもここにJava/RabbitMQとCeleryを連携させて参照や経験を持っていますか?Django/Celeryとの相互運用Javaから

答えて

12

解決策が見つかりました。 RabbitMQのJavaライブラリは、exchange/queues/routekeysを参照しています。 Celeryでは、キュー名は実際にはJavaライブラリで参照されているエクスチェンジにマッピングされています。デフォルトでは、Celeryのキューは単に「セロリ」です。あなたのDjangoの設定は、次の構文を使用して「MYQUEUE」と呼ばれるキューを定義する場合:

CELERY_ROUTES = { 
    'mypackage.myclass.runworker'  : {'queue':'myqueue'}, 
} 

そして、Javaベースのコードは次のような何かをする必要があります。

 ConnectionFactory factory = new ConnectionFactory(); 
     Connection connection = null ; 
     try { 
      connection = factory.newConnection(mqHost, mqPort); 
     } catch (IOException ioe) { 
      log.error("Unable to create new MQ connection from factory.", ioe) ; 
     } 

     Channel channel = null ; 
     try { 
      channel = connection.createChannel(); 
     } catch (IOException ioe) { 
      log.error("Unable to create new channel for MQ connection.", ioe) ; 
     } 

     try { 
      channel.queueDeclare("celery", false, false, false, true, null); 
     } catch (IOException ioe) { 
      log.error("Unable to declare queue for MQ channel.", ioe) ; 
     } 

     try { 
      channel.exchangeDeclare("myqueue", "direct") ; 
     } catch (IOException ioe) { 
      log.error("Unable to declare exchange for MQ channel.", ioe) ; 
     } 

     try { 
      channel.queueBind("celery", "myqueue", "myqueue") ; 
     } catch (IOException ioe) { 
      log.error("Unable to bind queue for channel.", ioe) ; 
     } 

      // Generate the message body as a string here. 

     try { 
      channel.basicPublish(mqExchange, mqRouteKey, 
       new AMQP.BasicProperties("application/json", "ASCII", null, null, null, null, null, null, null, null, null, "guest", null, null), 
       messageBody.getBytes("ASCII")); 
     } catch (IOException ioe) { 
      log.error("IOException encountered while trying to publish task via MQ.", ioe) ; 
     } 

それはそれだけであることが判明します用語の違い。

+0

あなたの例外の使用は非常に間違っていますが、ヒントのおかげで.. – Debriter