我正在构建一项功能,允许客户抓取他们的网站,获取链接并下载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);
我浪费的时间超过了我需要的时间。我需要双向沟通。我希望估算过程能够继续告知用户每个步骤,例如爬网开始,爬网完成等等。
我只是想知道是否值得尝试使rabbitmq工作,或者它是否是适合这项工作的合适工具?我可以简单地在数据库中创建一个表,并在其中包含一个标记以对进程进行排队。哪个是实现该功能的最佳方式?还有其他有用的工具可以在coldfusion中排队任务吗?
P.S。我也尝试了以下解决方案: https://github.com/lmajano/messaging-polyglot
答案 0 :(得分:1)
我不知道有一种最好的方法可以达到你想要的结果。有一件事是肯定的:仅使用RabbitMQ不是解决问题的方法。
Rabbit被设计为高速消息代理。它不担心消息的内容 - 它更关心路由和传递。您描述的问题是消息处理之一。事实上,有两个问题:
要解决第一个问题,您需要某种类型的任务预处理器,它会在确认重复的爬网任务之前检查正在运行的任务。您可以使用数据库或其他类型的分布式缓存(例如memcached)。
第二个问题有点复杂,有很多方法可以实现它。最有可能的是,您将在更新正在运行的任务的状态时发布事件,然后该事件将到达用户。
两种解决方案都与RabbitMQ的工作方式或系统中的角色无关。