ソケット統合実行時の統合エラー
症状
ソケット統合を実行したり、スキャンディレクトリとしてネットワーク上の場所を使用している場合、ログ内に次のようなエラーメッセージが表示されることがあります。
ERROR|Integration [connection name] failed to send message. Details: 'Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.'
対象製品
BarTender 2019以降
Integration Builder
解決方法
FTP統合の場合、このエラーは一時的にFTP接続が拒否されたことを示している可能性があります。ポーリング時間を数秒延長することで、多くの場合この問題は解消されます。
ソケット統合の場合、このエラーメッセージが表示されると、ラベル印刷が完全にスキップされることがあります。非常に多くのリクエストがあるソケット統合では、このエラーがソケットリクエストの多いタイミングや、時にはソケットがアイドル状態のときにも発生することがあります。
統合が多忙な場合、ポートがアイドル状態になる設定にしていても、ソケットが必ずしも閉じられるとは限りません。そのため、新しいリクエストが既に開いているポートに送られ、処理されずに通過してしまうことがあります。
これを解決するには、BarTenderがソケットを開閉するタイミングを制御する必要があります。統合の入力データセクションで、特定の文字列を読み取った後にソケットを強制的に閉じるよう設定できます。
ソケットを強制的に閉じる
最も簡単な方法は、BTXML内の終了タグを検出し、その直後にソケットを強制的に閉じることです。この方法は、ネットワークソケット経由でBTXMLを使ってドキュメントを印刷するチュートリアルの手順で紹介されています。
統合の入力データセクションで、以下のように設定を変更してください:
この設定により、</XMLScript>を受信した直後に統合がソケットを切断します。チェックボックスをオンにすることで、終了タグが入力データ内に保持され、BTXMLスクリプトが正しく処理されます。
接続を終了する
場合によっては、ソケットの強制終了だけでは不十分なことがあります。統合がソケットを閉じなかったり、ストリームが早く終了しすぎてデータが途切れてしまう場合、または送信側が特定の応答を期待してソケットを閉じる場合などです。このような場合は、特定の文字列を受信した後にデータストリームを終了させるだけでなく、BarTender側でネットワークソケットへ送信アクションを使って接続を強制的に終了させることができます。
このアクションは、データ受信が完了した直後に応答を返し、その後接続を終了します。