Next Page

1

Previous Page

スレッド: CFFTPのコネクションタイムアウトについて

作成日: 09/23/07 03:57 AM

返信: 6

atsumori


新米


入会日: 07/18/07

投稿数: 14

CFFTPのコネクションタイムアウトについて
09/21/07 6:08 PM

お世話になります。

さて、CFFTPを用いてファイル取得を試みているのですが、コネクションタイムアウト設定時間の変更は可能でしょうか?

FTPサーバがネットワーク上にいない場合、CFFTPでコネクションをopenしますと、タイムアウトが帰ってくるまでに20秒ほどかかってしまいます。

メンテ等でサーバをネットワークから切り離す場合があり、さらにはサーバが複数台ありますので、1台20秒の待ち時間が重なりますと、結構な遅延になってしまいます。
※FTPサービスがダウンしている場合(pingはOK)では、1−2秒でエラーが帰ってきます。

ちなみに、CFFTPのtimeoutオプションではうまくいきませんでした。

どなたかご存知でしたらよろしくお願いいたします。


Link | Top | Bottom

katz


一人前


入会日: 05/31/07

投稿数: 140

Re: CFFTPのコネクションタイムアウトについて
09/21/07 7:44 PM

一点確認ですが、FTPサーバーにはTCP/IPレベルでアクセスできない(FTPサーバーの電源を落としている、LANケーブルを抜いている、など)ということでよろしいでしょうか。

と言うことであれば、JavaがTCP/IPコネクションを張る際のタイムアウトが20秒程度に設定されていて、それがタイムアウトに時間がかかる原因と言えます。
タイムアウト値にはネットワークのプロパティのsun.net.client.defaultConnectTimeoutが使用されているものと思われます。
こちらを書き換えてみてはいかがでしょうか。

<cfset system = CreateObject('java', 'java.lang.System')>
<cfset system.setProperty("sun.net.client.defaultConnectTimeout","1000")>
このコードをCFFTP前に入れることで、TCP/IPコネクションが1秒でタイムアウトするようになるかと思われます。

Link | Top | Bottom

atsumori


新米


入会日: 07/18/07

投稿数: 14

Re: CFFTPのコネクションタイムアウトについて
09/22/07 1:58 PM

>>katz氏
ご返答有難うございます。

>一点確認ですが、FTPサーバーにはTCP/IPレベルでアクセスできない(FTPサーバーの電源を落としている、LANケーブルを抜いている、など)ということでよろしいでしょうか。
はい、仰るとおりの環境です。

そこで、教えて頂きました方法で試してみましたが、やはりタイムアウトまでに20秒かかってしまいます。

以下、テストコード。
<cfset system = CreateObject('java', 'java.lang.System')>
<cfset system.setProperty("sun.net.client.defaultConnectTimeout","1000")>

<cfftp
action="open"
connection="test"
server="192.168.0.1"
username="test"
password="test"
stoponerror="yes"
retrycount="1"
timeout="10"
>

何かやり方が悪いのでしょうか?


Link | Top | Bottom

katz


一人前


入会日: 05/31/07

投稿数: 140

Re: CFFTPのコネクションタイムアウトについて
09/22/07 2:56 PM

左様でしたか。
では、CFではsun.net.client.defaultConnectTimeoutを使っていないと言うことになりますね。

一つの方法としては、システムワイドでTCPのタイムアウト値を変更する方法が考えられます。
Solarisではtcp_time_wait_intervalなどが、WindowsではTcpTimedWaitDelayやTCP/IP の再送タイムアウトの最大値を変更する方法などが、Linuxでは/proc/sys/net/ipv4/tcp_syn_retriesあたりがそのパラメーターのよう(TCPの再送処理について)です。
そちらを変更すれば、上位レイヤーのJavaのTCPタイムアウト値も変更されるはずです。
ただ、システムワイドの値になってしまうので、他のアプリケーションのTCPタイムアウト値にも影響が出てしまうため注意が必要です。

ところで、CFのログにExceptionなど残っていないでしょうか。
/opt/coldfusion8/logs/application.log
/opt/coldfusion8/logs/cfserver.log
/opt/coldfusion8/logs/exception.log
あたりに、FTP接続しようとしてタイムアウトした旨のログが残るかと思います。それを見つけて貼っていただくと、JavaレベルでどのパラメータをいじればTCPタイムアウト値の変更ができるかが分かるかもしれません。
ちなみに、これらのログファイルはAdministrator画面で削除すれば再生成されますので、削除後にCFFTPを試してログ解析すると多少は見つけやすいかと思います。

Link | Top | Bottom

atsumori


新米


入会日: 07/18/07

投稿数: 14

Re: CFFTPのコネクションタイムアウトについて
09/22/07 3:31 PM

>>katz氏
素早いご返答有難うございます。

以下、exception.logの内容です。

"Error","jrpp-12","09/22/07","14:18:51",,"FTP 接続を確立する際に、例外が発生しました。この例外の原因 :java.net.ConnectException: Connection timed out: connect インクルードまたは処理されたファイルの特定のシーケンス :C:\Inetpub\wwwroot\test.cfm, line: 8 "
coldfusion.tagext.net.FtpTag$FtpConnectionException: FTP 接続を確立する際に、例外が発生しました。
at coldfusion.tagext.net.FtpTag.getConnection(FtpTag.java:655)
at coldfusion.tagext.net.FtpTag.doStartTag(FtpTag.java:1098)
at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:1915)
at cftest2ecfm511402424.runPage(C:\Inetpub\wwwroot\test.cfm:8)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:152)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:349)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:225)
at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:51)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:69)
at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:52)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:115)
at coldfusion.CfmServlet.service(CfmServlet.java:107)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:78)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:91)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:257)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:541)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:204)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:318)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:426)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:264)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

Link | Top | Bottom

katz


一人前


入会日: 05/31/07

投稿数: 140

Re: CFFTPのコネクションタイムアウトについて
09/22/07 4:15 PM

なるほど。
そもそもFTP接続にjava.net.URLConnectionを使用していないので、sun.net.client.defaultConnectTimeoutが無視されてしまうのは当然でした。失礼しました。

解決方法としてはやはり2つだと思います。
1つめは、先ほどのシステムワイドのTCPタイムアウト値を変更してしまう方法。
もう一つは、CFFTPする前に、Javaレベルで接続をしてみて、タイムアウトしたらCFFTPしないという方法です。
以下java.net.SocketでFTPサーバーに接続を試みて、1秒で反応がなかったらCFFTPしないというコードです。

<cfset ftpAddress = '192.168.0.1'>
<cfset connectSuccess = true>
<cftry>
  <cfset inetAddress = CreateObject('java', 'java.net.InetSocketAddress')>
  <cfset inetAddress.init(JavaCast('string', ftpAddress), JavaCast('int', 21))>
  <cfset socket = CreateObject('java', 'java.net.Socket')>
  <cfset socket.init()>
  <cfset socket.connect(inetAddress, JavaCast('int', 1000))>
  <cfset socket.close()>
  <cfcatch type="any">
    <cfset connectSuccess = false>
  </cfcatch>
</cftry>
<cfif connectSuccess EQ true>
  <cfftp
    action="open"
    connection="test"
    server="#ftpAddress#"
    username="test"
    password="test"
    stoponerror="yes"
    retrycount="1"
    timeout="10">
</cfif>

Link | Top | Bottom

atsumori


新米


入会日: 07/18/07

投稿数: 14

Re: CFFTPのコネクションタイムアウトについて
09/23/07 12:57 PM

>>katz氏
教えて頂きましたコードを試したところ、期待通りに1秒でタイムアウトされました。
これで対応したいと思います。

何から何まで有難うございました。

Link | Top | Bottom

Next Page

1

Previous Page

新規投稿

ログイン して返信して下さい。