CFTHREAD Выполнение дважды

У меня есть цикл, который вызывает объект cfcomponent.

    <cfset queue_list = "1,2,3">        
    <cfloop list="#queue_list#" index="z">  
                <cfset args = StructNew()>
                <cfset args.group_num = z>          
<cfset args.client_id = 1>          
                <cfset processdownloads = downloader.ProcessDownload(argumentCollection=args)>
            </cfloop>

Компонент имеет следующую функцию:

    <cffunction name="ProcessDownload" access="public" output="false">
        <cfargument name="group_num" type="numeric" required="yes">                     
        <cfargument name="client_id" type="numeric" required="yes">                     

        <cfset variables = arguments>

        <cfthread action="RUN" name="download_#variables.client_id#_#variables.group_num#" priority="high">

                    <cffile action="WRITE" file="#expandpath('download\download_in_process\')##variables.group_num#.json" output="#variables.group_num#">           

</cfthread>

</cffunction>

Когда я запускаю его, я получаю следующую ошибку:

Ошибка проверки атрибута для тега cfthread. Нить с именем DOWNLOAD_4003_3 не может быть создана. Имена потоков должны быть уникальными на странице.
Ошибка произошла в строке 29.

Я понятия не имею, почему, но, кажется, работает дважды. Разве это не должно генерировать новый поток с уникальным именем потока, таким образом избегая конфликта имени протектора?

2 ответа

Решение

Передайте group_num в качестве атрибута, чтобы вы могли получить к нему внутренний доступ без проблем с перезаписываемой областью действия переменных.

<cfthread action="RUN" name="download_#arguments.client_id#_#arguments.group_num#" priority="high" group_num="#arguments.group_num#">
    <cffile action="WRITE" file="#expandpath('download\download_in_process\')##attributes.group_num#.json" output="#attributes.group_num#">           
</cfthread>

Все остальные правы, проблема в том, какая у вас переменная область. Происходит то, что каждый цикл перезаписывает область видимости переменных, поэтому при создании потока он получает имя потока из области видимости переменной, для которой уже установлено значение 3... поэтому все три потока могут попытаться установить одинаковые значения. название.

Можете ли вы назвать это с помощью аргументов? Если нет... вы можете использовать местный. для имени и передачи информации в создание CFThread.

Вы правы в отношении компонента, вы не можете получить доступ к аргументам и т. Д., Который ведет себя совершенно иначе, чем снаружи компонента.

Бен Надель написал хороший пост об этих проблемах http://www.bennadel.com/blog/2215-an-experiment-in-passing-variables-into-a-cfthread-tag-by-reference.htm

Бен за победу как обычно.

Вероятно, потому что ваш код CFC не является потокобезопасным.

Это:

<cfset variables = arguments>

Копирует аргументы вашей функции в общую область объекта. Если downloader Объект разделяется между запросами, тогда каждый запрос будет использовать значения другого.

Почему вы копируете свои аргументы в область видимости переменных объектов? Это кажется странной вещью.

Другие вопросы по тегам