2013-12-17 3 views
1

Следующий код работает на Adobe ColdFusion 9.01+ но не Railo 4,1Исключение нулевого указателя на <cfthread>

Кроме того, это не удается только на Post

Этот код называется внутри FW/1 setupRequest() в application.cfc

<cfthread name="threadA" action="run"> 

<cftry> 

<cfquery> 
    INSERT 
    INTO dbo.Traffic (Circuit, Fuseaction, IP_hash) 
    VALUES (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listfirst(variables.rc.fuseaction, '.')#">, 
     <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listlast(variables.rc.fuseaction, '.')#">, 
     <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#cgi.remote_addr#"> 
     ) 
</cfquery> 


<cfcatch /> 
</cftry> 

</cfthread> 

Ошибка

java.lang.NullPointerException на railo.runtime.net.http.HttpUtil.cloneParameters (HttpUtil.java:66): 66 на railo.runtime.net.http.HttpServletRequestDummy.clone (HttpServletRequestDummy.java:677): 677 в railo.runtime.thread.ThreadUtil.cloneHttpServletRequest (ThreadUtil.java:67): 67 на railo.runtime.thread.ThreadUtil.clonePageContext (ThreadUtil.java:29): 29 на Railo. runtime.thread.ChildThreadImpl. (ChildThreadImpl.java:101): 101 at railo.runtime.tag.ThreadTag.register (ThreadTag.java:269): 269 at scorecard38.application_cfc $ cf.udfCall (D: \ railo \ WebApps \ WWW \ Scorecard38 \ Application.cf с: 162): 162 на railo.runtime.type.UDFImpl.implementation (UDFImpl.java:94): 94

Дикий Угадай

variables.rc не получает копируются в нить

+0

Если вы хотите протестировать свою теорию, отправьте себе по электронной почте дамп области переменных из этой темы. –

+0

Я пропустил что-то, где начинается тэг cfcatch? – user2595617

+0

'' это то же самое, что ''. В основном он фиксирует ошибку и никогда не показывает или ничего не делает –

ответ

1

variables.rc не будет скопирован в поток, если вы не добавите его в качестве аргумента. Добавить rc в качестве аргумента, а затем вместо variables.rc вы будете обращаться к нему через arguments.rc

<cfthread name="threadA" action="run" rc="#variables.rc#"> 
    <cftry> 

    <cfquery> 
    INSERT INTO dbo.Traffic (Circuit, Fuseaction, IP_hash) 
    VALUES (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listfirst(arguments.rc.fuseaction, '.')#">, 
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#listlast(arguments.rc.fuseaction, '.')#">, 
    <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#cgi.remote_addr#"> 
    ) 
    </cfquery> 

    <cfcatch /> 
    </cftry> 

</cfthread> 

Если это не работает, вам придется удалить try/catch и разгружать свой cfthread, чтобы увидеть ошибку. Код ниже будет выводить «Variable C is undefined»

<cfthread name="threadA" action="run"> 
    <cfset b = c> 
</cfthread> 
<cfdump var="#cfthread#"><cfabort> 
+0

Область переменных из основного потока доступна для других потоков. Вы уверены, что не имеете в виду функцию? –

+0

Я бы предположил, что он уже подтвердил, что может получить доступ к функции 'rc', прежде чем он доберется до этого. –

+0

Я считаю, что ваш ответ неверен. В документации по cfthread, http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-75a8.html ничего не говорится о передаче аргументов. Однако он указывает: «Все потоки на одной странице имеют общую область переменных, поэтому вы можете использовать ее для данных, которые являются общими для всех потоков. Вы должны быть осторожны, чтобы блокировать доступ к переменным, если это необходимо, для предотвращения взаимоблокировок или условий гонки между нитями ». Мой собственный опыт подтверждает это. Вот почему я проголосовал против этого ответа. –

1

У меня была такая же проблема с вами. Вы используете CGI varaible, и вот что вызывает проблему.