Coldfusion的任务队列

时间:2016-02-02 20:03:13

标签: java coldfusion rabbitmq cfml

我正在构建一项功能,允许客户抓取他们的网站,获取链接并下载html文件。对下载的文件进行字数统计,并显示成本估算以用于翻译网页。

我想确保一次只运行一个估算。因此,如果有两个客户同时尝试估算其网站,则只会运行一个客户评估流程,而其他客户则需要等待。

为此我尝试使用RabbitMQ,这是建议给我的。我正在使用Coldfusion with framework / 1。我使用了rabbitmq网站上给出的Java示例。我可以发送消息,但我在消费消息时遇到问题。以下函数正在创建一个对象,同时在运行中覆盖一个函数。这在冷融中是不可能的。我尝试过松弛和谷歌小组的帮助,但我没有得到明确的答案。

final Consumer consumer = new DefaultConsumer(channel) {
  @Override
  public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    String message = new String(body, "UTF-8");

    System.out.println(" [x] Received '" + message + "'");
    try {
      doWork(message);
    } finally {
      System.out.println(" [x] Done");
    }
  }
};
channel.basicConsume(TASK_QUEUE_NAME, true, consumer);

我不熟悉Java。我尽力在coldfusion中转换上述步骤。我没有成功。我尝试了以下内容,我甚至不知道这是否是正确的方法。

consumer = javaloader.create("com.rabbitmq.client.DefaultConsumer").init(channel);
envelope = createObject("java","com.rabbitmq.client.Envelope");
properties = createObject("java","com.rabbitmq.client.BasicProperties");
consumerTag = toString(consumer.getConsumerTag());
body = javaCast("byte[]",[]);
            consumer.handleDelivery(consumerTag,envelope,properties,body);

The error I got when I run the above code

我浪费的时间超过了我需要的时间。我需要双向沟通。我希望估算过程能够继续告知用户每个步骤,例如爬网开始,爬网完成等等。

我只是想知道是否值得尝试使rabbitmq工作,或者它是否是适合这项工作的合适工具?我可以简单地在数据库中创建一个表,并在其中包含一个标记以对进程进行排队。哪个是实现该功能的最佳方式?还有其他有用的工具可以在coldfusion中排队任务吗?

P.S。我也尝试了以下解决方案: https://github.com/lmajano/messaging-polyglot

1 个答案:

答案 0 :(得分:1)

我不知道有一种最好的方法可以达到你想要的结果。有一件事是肯定的:仅使用RabbitMQ不是解决问题的方法。

Rabbit被设计为高速消息代理。它不担心消息的内容 - 它更关心路由和传递。您描述的问题是消息处理之一。事实上,有两个问题:

  1. 如何确保只有一个抓取任务针对给定的网站运行
  2. 如何向用户提供状态反馈
  3. 要解决第一个问题,您需要某种类型的任务预处理器,它会在确认重复的爬网任务之前检查正在运行的任务。您可以使用数据库或其他类型的分布式缓存(例如memcached)。

    第二个问题有点复杂,有很多方法可以实现它。最有可能的是,您将在更新正在运行的任务的状态时发布事件,然后该事件将到达用户。

    两种解决方案都与RabbitMQ的工作方式或系统中的角色无关。