1

シナリオを想像してみてください。SAP にメッセージを書き込む (RFC を呼び出す) C で記述された ADAPTER があります。

アダプターは、新しいメッセージが「エンジン」に到着したときにのみ呼び出されるため、最大で 1 日以上活動がない期間を持つことができます。ここで問題が発生します。STANDARD コードの「低レベル ソケット」レイヤーで接続ハンドルが無効になります。または、SAP 自体の SAP パラメータによって、「アクティブではないハンドルを強制終了する」と表示される場合があります。

そこで、私が今やっているのは、「アダプターの上にある」スレッドを SPAWN し、10 秒ごとに SAP を ping することです。ここでの問題は、SAP へのメッセージの送信と PING/HEARTBEAT メッセージの送信に同じ接続ハンドルを使用していることです。

SAP は RFC ハンドルについて次のように述べています。

" RFC ハンドルは複数のスレッドで使用できますが、一度に 1 つのスレッドでのみアクティブにすることができます。あるスレッドによって作成された RFC 接続の RFC ハンドルは別のスレッドで使用できますが、これらのスレッドはアクセスを同期する必要がありますこのハンドルに

しかし、「pthread_mutex_lock」などを使用してこれを機能させようとしましたが、機能しません。

GLOBAL「ハンドル」が 1 つあり、アダプターの SHARED LIB が起動すると、次のようなスレッドを起動します。

rc = pthread_create(&heartbeatThread, NULL, heartbeatThreadMainLoop, (void *)NULL);

そして、このスレッドは 10 秒ほどごとに SAP を ping します。

完璧な世界では、ここで SAP への MESSAGING が優先されることを望みます。そのため、PING は「静か」になるまで完全に待機してから、再度起動する必要があります。

私は次のようなリンクを見てきました:

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#SYNCHRONIZATION

しかし、実際にはコードのセクション全体をロック/ロック解除したいので、MESSAGEがSAPに送信される場合、PINGスレッドは待機する必要があると言ったように....しかし、PINGスレッドがビジーの場合、何らかの形で割り込み、言いたいと思います「ねえ、メッセージ用の接続ハンドルが必要です」...

このためのベストプラクティスの「パターン」は何ですか?

そして、助けていただければ幸いです

ありがとう

リントン

4

1 に答える 1

0

ADAPTERのスコープを拡大することにより、アーキテクチャ全体を単純化できます。

メインループがリクエストを無期限に待機する代わりに、10秒後にタイムアウトにします。タイムアウトした場合は、ウェイクアップロジックを実行します。いずれの場合(要求またはタイムアウト)でも、タイマーをリセットします。

これにより、共有の問題全体が回避され、ADAPTERがSAPとのすべての対話に責任を持つようになります。

于 2012-04-19T19:17:24.513 に答える