当前位置: 首页 > 面试题库 >

通过Java与Django / Celery互操作

上官思博
2023-03-14
问题内容

我们公司有一个基于Python的网站和一些基于Python的工作程序节点,它们通过Django /
Celery和RabbitMQ进行通信。我有一个基于Java的应用程序,需要将任务提交给基于Celery的工作人员。我可以将作业从Java发送到RabbitMQ很好,但是基于Celery的工作人员从来没有接过工作。从查看两种类型的作业提交的数据包捕获来看,存在差异,但是我无法理解如何解释它们,因为其中很多都是二进制文件,因此我无法找到有关解码的文档。这里有人对Java
/ RabbitMQ和Celery一起工作有任何参考或经验吗?


问题答案:

我找到了解决方案。RabbitMQ的Java库引用交换/队列/路由键。在Celery中,队列名称实际上是映射到Java库中引用的交换。默认情况下,芹菜的队列只是“芹菜”。如果您的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) ;
        }

事实证明,这只是术语上的差异。



 类似资料:
  • Kotlin is 100% interoperable with Java™ and Android™ 在前面的章节中,我们已经学习了Kotlin的基础语法、类型系统、泛型与集合类、面向对象与函数式编程等主题,在上一章中我们还看到了Kotlin提供的轻量级并发编程模型:协程的相关内容。 从本章开始到在后面的章节中,我们将进入工程代码的实战。我们将在后面分别介绍Kotlin集成SpringBoot

  • 问题内容: 基本上我需要做的是 我尝试做明显的 但这最终会引发异常 即使在互操作文档中为访问静态字段指定的表示法也会产生相同的异常 问题答案: 您可以使用$访问内部类 请注意,如果要导入,也应该导入。

  • Java 互操作 Clojure程序可以使用所有的java类以及接口。和在java里面一样 java.lang 这个包里面的类是默认导入的。你可以手动的用 import 函数来导入其它包的类。看例子: (import '(java.util Calendar GregorianCalendar) '(javax.swing JFrame JLabel)) 同时也可以看下宏ns下面的 [:

  • 问题内容: 如何将Django与AWS Elastic Beanstalk结合使用,它们也只能通过celery在主节点上运行任务? 问题答案: 这就是我在弹性beantalk上用django设置celery并具有良好的可伸缩性的方法。 请记住,“leader_only”的选项container_commands仅适用于环境重建或部署的应用程式。如果服务工作足够长时间,则Elastic Beanst

  • 下面是我发现的可能与这个问题有关的内容。 我认为我必须以某种方式启动链接到提到的PendingIntent id的特定意图(在本例中为或) 使用命令,然后在中搜索,我找到了意图的名称。其内容如下: (就像我们可以使用命令从adb启动Whatsapp,也应该可以启动pendingIntent。)

  • 在外出地点可经由互联网连接自己家中的PS3™。即使是远离自己家中的场所、或是海外皆可进行遥控操作。 A ) PS3™ 有线或无线连接互联网 B ) ADSL调制解调器、缆线调制解调器、光纤终端设备(ONU)等 C ) 互联网连接 D ) 接入点或无线路由器 E ) 以Wi-Fi连接 F ) 以移动网络连接 经由互联网进行遥控操作时,可能会因您使用的网络设备而出现无法操作的现象。详细请参阅PS3™用