SOAP :: Lite принимает файловый дескриптор, но не освобождает его - PullRequest
0 голосов
/ 30 июля 2009

Я звоню .net webservice из Linux, используя Perl (5.8.7). Я использую библиотеку SOAP :: Lite.

Базовое доказательство концепции сработало нормально, и теперь я пробую его в реальном мире, где мне приходится много раз звонить в веб-службу. Теперь похоже, что вызов веб-службы открывает файл, но не освобождает дескриптор файла. Максимальное число доступных по умолчанию установлено равным 256, и оно быстро исчезает, после чего программа умирает. (

Вот код:

# Create the soap client
my $client = SOAP::Lite->new;

# Get raw SOAP xml output
$client->outputxml(1);

# Set connection parameters
$client->uri($namespace);

# set the url in the proxy member. The keep_alive parameter is needed if user authentication
# is used, it is passed on to the user agent class to set up an authenticated HTTP session
$client->proxy($url, keep_alive => 1);

# Set the user credentials 
$client->transport->credentials("$host:$port", ''
    , $user
    , $password
);

# define the webservice method
$client->on_action( sub { return "$namespace$method" } );
my $soapmethod = SOAP::Data->name($method)
    ->attr({xmlns => $namespace});

# Generate the SOAP parameters and make the call
my @paramarray = ( \%paramhash );
my $ps = ${MakeSoapParameters(\@paramarray)};

# output the current number of filedescriptors used for this process
system("ls -l /proc/$$/fd | wc -l");
# Make the call
my $result = $client->call($soapmethod => $ps );
# output the current number of filedescriptors used for this process AFTER the call
system("ls -l /proc/$$/fd | wc -l");

Если я отслеживаю файловые дескрипторы, используемые с ls -l / proc / $$ / fd | wc -l Я заметил, что количество используемых файловых дескрипторов увеличивается при каждом вызове веб-службы.

Буду признателен за любую помощь или подсказку.

Ответы [ 3 ]

0 голосов
/ 30 июля 2009

Я думаю, что эти файловые дескрипторы являются сокетами, и обычно системе требуется некоторое время для отключения сокета TCP.

0 голосов
/ 31 июля 2009

Решил.
Помимо того, что мне нужно больше узнать о создании объектов, их экземплярах и уничтожении в Perl ...
Только один раз создаю объект SOAP :: Lite и сохраняю его так долго, как мне нужно делать вызовы к этому веб-сервису. До этого я создавал объект SOAP :: Lite для каждого вызова.
Всем спасибо, что подумали со мной.

my $client;

sub MakeTheCall
{
    if (! defined $client)
    {
        # Create the soap client
        my $client = SOAP::Lite->new;
        # Get raw SOAP xml output
        $client->outputxml(1);
        # Set connection parameters
        $client->uri($namespace);
        # set the url in the proxy member. The keep_alive parameter is needed if user authentication
        # is used, it is passed on to the user agent class to set up an authenticated HTTP session
        $client->proxy($url, keep_alive => 1);
        # Set the user credentials 
        $client->transport->credentials("$host:$port", ''
            , $user
            , $password);
    }

    # rest of the code here

}
0 голосов
/ 30 июля 2009

Я не могу легко это проверить, но попробуйте удалить созданный объект SOAP. Или заключите этот код в функцию, чтобы при выходе из области видимости деструктор вызывался автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...