2016-02-02 75 views
2

我正在构建一个功能,允许客户抓取他们的网站,获取链接并下载html文件。在下载的文件上完成字数统计,并显示翻译网页的成本估算。Coldfusion的任务队列

我想确保一次只有一个估算正在运行。因此,如果有两个客户端试图同时为他们的网站估算,则只有一个客户端估算过程会运行,而其他客户端需要等待。

为此,我尝试使用向我建议的RabbitMQ。我正在使用ColdFusion框架/ 1。我使用了rabbitmq网站中给出的Java示例。我可以发送消息,但我无法使用消息。以下函数创建一个对象,并同时覆盖一个函数。这在Coldfusion中是不可能的。我试图在懒散和谷歌团体获得帮助,但我没有得到明确的答案。

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

+0

*这在coldfusion中是不可能的*从技术上讲,它是可能的,但只有[interfaces](http://docs.oracle.com/javase/tutorial/java/concepts/interface.html),CF10 +。不幸的是,DefaultConsumer是一个具体的类,所以在这种情况下,你是正确的。 CF中的特定代码无法轻松模拟。 *我没有成功*如何?你说没有人工作,但不真正解释*如何*。你是否收到错误,什么都没发生(API说handleDelivery是没有操作的)。关于另一个项目的同样问题。 – Leigh

+0

@Leigh我对没有通过足够道歉。我已经添加了上面的错误消息屏幕截图。我对java的知识非常有限,所以很难理解大多数代码。在rabbitmq的google组中,我被建议“简单地对DefaultConsumer进行子类化或从零开始实施Consumer。”我更加困惑于答案。 – Soobax

+0

是的。这在java中很有意义。这就像在CFC中重写父组件函数一样。不幸的是,当你从* CF覆盖*的东西是一个java类的方法时,它会涉及更多 - 并且根本不可能使用具体的类。关于错误,乍一看它看起来是正确的,即参数,类型,顺序的数量。所以没有运行它,我不知道它为什么抱怨。另一个项目呢?看起来它有一个cfml示例。也就是说,确认方法可能是一个很好的开始,也就是说,如果它不是正确的工具,就没有必要去追求lib。 – Leigh

回答

2

我不知道有一个最好的方法来实现你想要的结果。有一点是肯定的:单靠RabbitMQ不是解决问题的办法。

兔子被设计成高速信息经纪人。它不担心邮件的内容 - 它更关心路由和传递。你所描述的问题是消息处理。事实上,有两个问题:

  1. 如何确保只有一个爬行任务对于一个给定网站
  2. 如何给状态反馈给用户操作

为了解决第一个问题,您需要某种类型的任务预处理器,它会在设置重复的爬网任务之前检查正在运行的任务。您可以利用数据库或其他类型的分布式缓存(例如memcached)。

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

这两种解决方案都与RabbitMQ的工作原理或其在系统中的作用无关。

+0

对于第一个问题,我决定使用数据库并为isRunning设置一个标志。对于第二个问题,我将使用coldfusion通知用户每一步开始和完成。我试图设置rabbitmq来创建工作队列,这样我就不必查询数据库来检查每一步。 – Soobax