我正在使用Catalyst framework编写Web应用程序。我还使用了一个名为TheSchwartz的作业队列。
我想要使用一个作业队列,因为我希望尽可能多的特定于应用程序的代码与Web应用程序接口代码分离。
基本上整个系统由三个主要部分组成:
因此理论上,GUI为爬虫创建作业,从而为“攻击组件”创建作业。
目前我在Catalyst中有一个Model,它实例化一个TheSchwartz对象,以便Web应用程序中的控制器可以将作业添加到作业队列。
我还需要创建一些工作者脚本来持续监听(/检查数据库)新的作业,以便他们可以执行所需的操作。目前TheSchwartz的数据库特定内容是在Catalyst中的模型中,我认为我不能轻易访问Catalyst之外的那些?
我不想在模型中复制TheSchwartz作业队列的数据库连接数据,然后在我的作业工作者脚本中复制数据库连接数据。我应该在位于Catalyst外部的另一个类中包装TheSchwartz对象的创建,并在当前实例化TheSchwartz对象的模型中调用它吗?然后我也可以在工作脚本中使用它。或者我应该在配置文件中包含数据库数据并在需要时实例化新的TheSchwartz对象(在Catalyst /内部作业工作者脚本中)?
或者我只是在想这个?
一些关于内容丰富的Web应用程序架构文章的链接也可能很有用(我之前从未构建过一种复杂的复杂性。)。
干杯
答案 0 :(得分:4)
您使用的是DBIx :: Class吗?即使你不是,这里的基本思想也适用,但我会继续并假设你是。
Catalyst模型应该是另一个类的包装器,提供足够的行为来与Catalyst接口,而不是其他任何东西。例如,Catalyst :: Model :: DBIC :: Schema只是DBIx :: Class :: Schema的包装器。它从Catalyst获取配置并将其传递给DBIC,它将ResultSet注入到模型命名空间中(这样你就可以执行$c->model('DB::Table')
技巧),然后就可以了。
优点是,由于所有重要的代码都存在于Catalyst :: Model之外,因此它完全独立于Catalyst。您可以从维护脚本或作业队员或其他任何工作人员加载您的Schema,传递一些配置,告诉它连接并去,而不必调用Catalyst。 ResultSet中的所有信息和逻辑以及其他任何信息和逻辑在Catalyst之外都是同样可用的。
答案 1 :(得分:3)
如果我理解正确,那么您的问题是“如何在Catalyst之外重用我的数据库连接?”。
您应该在Catalyst应用程序中使用DBIx :: Class。您可以在任何其他应用程序中重用相同的文件。催化剂中的$c->mode('DB::MyTable')->search(...)
与催化剂外的相同:
my $schema = MyApp::Model::DB->new();
$schema->resultset('MyTable')->search(...)
任何模型都可以在Catalyst之外调用,就像常规包MyApp :: Model :: Library-> new()一样。您只是想确保不使用$ c作为参数。
答案 2 :(得分:2)
您应该关注的一件事是使用TheSchwartz::Simple创建作业而不是TheSchwartz本身(您实际上只需要处理作业)。优点是: