RequestTracker和Mason一遍又一遍地摧毁我的班级

时间:2012-06-15 00:21:00

标签: perl mason rt

我正在攻击使用Perl编写并使用Mason的Request Tracker 用于Web界面。我正在尝试制作一个自定义页面,它涉及一个自动处理程序,一个html页面,并在其他comps中引入一些方法。我有一个简单的类,我想用它来跟踪我的界面部分需要的一些东西。现在一切都好 tracks是一个数据库句柄。

package RTx::FooBar::Web;

use strict;
use warnings;

use RTx::FooBar::Handle;

sub new
{
        my $proto = shift;

        $RT::Logger->debug("creating new");

        my $class = ref($proto) || $proto;
        my $self = {};
        bless( $self, $class);

        my $handle = RTx::FooBar::Handle->new();
        $handle->Connect();
        $self->{cfHandle} = $handle;
        return $self;
}

sub DESTROY {
        my $self = shift;
        $RT::Logger->debug("destroy");

        delete $self->{cfHandle};
}

sub CFHandle
{
        my $self = shift;

        return $self->{cfHandle};
}

1;

我尝试将其粘贴到会话中,以便我可以在任何需要的地方使用它 它在Web界面中。所以我尝试在一个网页中使用它 - 自动处理程序:

% $m->call_next; 

<%INIT>
$RT::Logger->debug("my autohandler");
use RTx::FooBar::Web;
$session{cfWeb} ||= RTx::FooBar::Web->new();
</%INIT>

现在困扰我的事情(除了事实并非如此) 工作)是“新”方法中的记录打印出一次,但是 登录DESTROY方法打印出56次。而每一次, 在RTx :: FooBar中调试:: Handle-&gt; DESTROY也打印出来,表明这一点 $ self-&gt; {cfHandle}未被删除。任何人都可以建议为什么会这样 发生了什么?是因为session是一个绑定的哈希?

* 更新 * 我不再使用$ session,并且在创建一次后仍然会将我的句柄破坏56次。

1 个答案:

答案 0 :(得分:1)

这里只是一个猜测 - $session正在从外化版本(可能通过Storable等)重新创建对象。因此它在没有调用new的情况下返回对象,因此没有记录。不知道为什么每次都会被摧毁。

看起来$session实际上是一个绑定的哈希,一个Apache::Session或者实现相同接口的东西(文档谈论会话的数据库支持)。

如果您想拥有一个全局持久对象(即,不依赖于单个请求),请为其指定一个完全限定的名称,例如$RTx::FooBar::Web::TheObject ||= RTx::FooBar::Web->new();或使用类似Cache::MemoryCache的内容。或者,在MasonAllowGlobals设置中设置自己的全局变量,尽管您可能需要进入RT的配置文件来更改它。