QGrpcInterceptorChain Class
Speichert und verwaltet eine Abfolge von Interceptoren. Mehr...
| Kopfzeile: | #include <QGrpcInterceptorChain> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Grpc) target_link_libraries(mytarget PRIVATE Qt6::Grpc) |
| Seit: | Qt 6.11 |
- Liste aller Mitglieder, einschließlich vererbter Mitglieder
- QGrpcInterceptorChain ist Teil der „Qt GRPC -Interceptors“.
Öffentliche Funktionen
| QGrpcInterceptorChain() | |
| QGrpcInterceptorChain(const QGrpcInterceptorChain &) | |
| ~QGrpcInterceptorChain() | |
| bool | add(T *interceptor) |
| bool | add(std::unique_ptr<T> &&interceptor) |
| QtGrpc::InterceptorCapabilities | capabilities() const |
| QtGrpc::InterceptorCapabilities | capabilitiesAt(qsizetype index) const |
| void | clear() |
| bool | empty() const |
| bool | hasHandlerFor(QtGrpc::InterceptorCapability cap) const |
| bool | isEmpty() const |
| bool | set(Ts *... interceptors) |
| bool | set(std::unique_ptr<Ts> &&... interceptors) |
| qsizetype | size() const |
| void | swap(QGrpcInterceptorChain &other) |
| QGrpcInterceptorChain & | operator=(const QGrpcInterceptorChain &) |
Ausführliche Beschreibung
QGrpcInterceptorChain speichert Interceptor-Instanzen, die verschiedene Phasen eines RPC überwachen oder modifizieren. Die Kette wird beim Erstellen an einen Kanal übergeben, der die Kette für den Rest seiner Lebensdauer verwaltet.
Im Verlauf des Lebenszyklus eines RPC ruft der Kanal die in der Kette gespeicherten Interceptors an den entsprechenden Interception-Punkten auf.
Interceptoren werden der Kette in einer festgelegten Reihenfolge hinzugefügt. Die Reihenfolge ist entscheidend und bestimmt, wie Interceptoren während der ausgehenden und eingehenden Phasen eines RPC aufgerufen werden. Weitere Informationen finden Sie im Abschnitt „Richtung und Ablauf “ der Übersicht zu „Qt GRPC -Interceptoren“.
Interceptoren können unter Verwendung von zwei primären Eigentumsmodellen hinzugefügt werden:
- Mit Eigentumsübertragung: Fügen Sie Interceptoren mithilfe von `
std::unique_ptr<T>` hinzu. Bei Erfolg übernimmt die Kette das Eigentum und zerstört die Interceptoren, wenn die Kette (und damit der Kanal) zerstört wird. - „Non-Owning“: Fügen Sie Interceptoren mithilfe von Rohzeigern hinzu (
T*). Die Kette übernimmt keine Eigentümerschaft. Der Aufrufer muss sicherstellen, dass die Interceptor-Objekte so lange gültig bleiben, wie der Kanal sie aufrufen könnte.
Beide Modelle können innerhalb derselben Kette kombiniert werden. Die Kombination von Interceptoren mit und ohne Eigentumsübergang ist zwar unterstützt, erfordert jedoch Sorgfalt, um sicherzustellen, dass Interceptoren ohne Eigentumsübergang länger bestehen bleiben als alle Kanäle, die sie möglicherweise nutzen.
Hinweis: QGrpcInterceptorChain ist nicht kopierbar und kann nur verschoben werden.
Siehe auch QtGrpc::InterceptorCapability.
Dokumentation der Mitgliedsfunktionen
QGrpcInterceptorChain::QGrpcInterceptorChain()
Erstellt eine leere Interceptor-Kette.
[delete] QGrpcInterceptorChain::QGrpcInterceptorChain(const QGrpcInterceptorChain &)
Erstellt eine Instanz von ` QGrpcInterceptorChain` durch Kopieren. Diese Funktion wurde gelöscht.
[noexcept] QGrpcInterceptorChain::~QGrpcInterceptorChain()
Zerstört die Abfangkette.
template <typename T> requires QtGrpcPrivate::if_interceptor<T> bool QGrpcInterceptorChain::add(T *interceptor)
Fügt „ interceptor “ zur Kette hinzu, ohne die Eigentumsrechte zu übernehmen.
Gibt „ true “ zurück, wenn der Interceptor hinzugefügt wurde; andernfalls wird „ false “ zurückgegeben.
Beim Festlegen von Interceptoren über einen Rohzeiger behält der Aufrufer die Eigentumsrechte. Die ` QGrpcInterceptorChain ` speichert Referenzen ohne Eigentumsrechte auf die bereitgestellten Interceptoren.
Die Interceptor-Kette wird an den Kanal übertragen und geht in dessen Besitz über. Daher müssen alle Interceptor-Objekte während der gesamten Lebensdauer des Kanals, der die Kette verwendet, gültig bleiben.
Der folgende Code zeigt, wie ein benutzerdefinierter Deleter verwendet wird, um die Lebensdauer eines Interceptors an einen einzelnen Kanal zu binden:
auto *metricsInterceptor = new MetricsInterceptor();
auto *authInterceptor = new AuthInterceptor();
~~~
QGrpcInterceptorChain chain;
if (!chain.add(metricsInterceptor))
qFatal("Failed to add metrics interceptor");
if (!chain.add(authInterceptor))
qFatal("Failed to add auth interceptor");
auto channel = std::shared_ptr<QGrpcHttp2Channel>(
new QGrpcHttp2Channel(QUrl("you_uri:port"), std::move(chain)),
[&metricsInterceptor, &authInterceptor](QGrpcHttp2Channel* ptr) {
delete ptr;
qDebug() << "Channel destroyed.";
// Wenn diese Interceptors nicht von anderen Kanälen gemeinsam genutzt werden,
// ist dies der geeignete Ort, um sie zu löschen. Andernfalls muss ihre
// Lebensdauer extern verwaltet werden.
delete metricsInterceptor;
delete authInterceptor;
metricsInterceptor = nullptr;
authInterceptor = nullptr;
}
);Jeder Interceptor-Typ muss mindestens eine Interceptor-Schnittstelle (z. B. ` QGrpcStartInterceptor ` oder ` QGrpcFinishedInterceptor`) implementieren, um Interceptor-Funktionen bereitzustellen.
template <typename T> requires QtGrpcPrivate::if_interceptor<T> bool QGrpcInterceptorChain::add(std::unique_ptr<T> &&interceptor)
Fügt interceptor zur Kette hinzu und übernimmt die Verantwortung dafür.
Gibt „ true “ zurück, wenn der Interceptor hinzugefügt wurde; andernfalls wird „ false “ zurückgegeben.
Die Eigentumsrechte an ` interceptor ` werden nur dann an die Kette übertragen, wenn der Interceptor erfolgreich hinzugefügt wurde. Wenn die Funktion ` false` zurückgibt, verbleiben die Eigentumsrechte beim Aufrufer.
Jeder Interceptor-Typ muss mindestens eine Interceptor-Schnittstelle (z. B. ` QGrpcStartInterceptor ` oder ` QGrpcFinishedInterceptor`) implementieren, um Interception-Funktionen bereitzustellen.
Siehe auch ` set()` und ` clear()`.
[noexcept] QtGrpc::InterceptorCapabilities QGrpcInterceptorChain::capabilities() const
Gibt die kombinierten Funktionen aller in der Kette gespeicherten Interceptoren zurück.
Der Rückgabewert ist das bitweise ODER der von den Interceptoren bereitgestellten Funktionen.
Siehe auch hasHandlerFor(), capabilitiesAt() und QtGrpc::InterceptorCapability.
QtGrpc::InterceptorCapabilities QGrpcInterceptorChain::capabilitiesAt(qsizetype index) const
Gibt die vom Interceptor bereitgestellten Funktionen unter index zurück.
Warnung: Der Aufruf dieser Funktion mit einem „ index “, der für die Kette ungültig ist, führt zu undefiniertem Verhalten.
Siehe auch ` capabilities()` und ` size()`.
void QGrpcInterceptorChain::clear()
Löscht die Kette.
Entfernt alle Interceptoren aus der Kette. Alle Interceptoren, die zur Kette gehören, werden zerstört.
[noexcept] bool QGrpcInterceptorChain::empty() const
Gibt „ true “ zurück, wenn die Kette keine Interceptoren enthält; andernfalls wird „ false “ zurückgegeben.
Siehe auch size() und isEmpty().
[noexcept] bool QGrpcInterceptorChain::hasHandlerFor(QtGrpc::InterceptorCapability cap) const
Gibt „ true “ zurück, wenn die Kette mindestens einen Interceptor enthält, der einen Handler für die Fähigkeit „ cap “ bereitstellt; andernfalls wird „ false “ zurückgegeben.
Siehe auch capabilities() und capabilitiesAt().
[noexcept] bool QGrpcInterceptorChain::isEmpty() const
Gibt „ true “ zurück, wenn die Kette keine Interceptoren enthält; andernfalls wird „ false “ zurückgegeben.
Siehe auch size() und empty().
template <typename... Ts> requires QtGrpcPrivate::if_interceptor<Ts...> bool QGrpcInterceptorChain::set(Ts *... interceptors)
Ersetzt den Inhalt der Kette durch „ interceptors “, ohne die Eigentumsrechte daran zu übernehmen.
Gibt „ true “ zurück, wenn alle Interceptoren erfolgreich hinzugefügt wurden; andernfalls wird „ false “ zurückgegeben und die Kette bleibt unverändert.
Beim Setzen von Interceptoren über einen Rohzeiger behält der Aufrufer das Eigentumsrecht. Die ` QGrpcInterceptorChain ` speichert Referenzen ohne Eigentumsrecht auf die bereitgestellten Interceptoren.
Die Interceptor-Kette wird an den Kanal übertragen und geht in dessen Besitz über. Daher müssen alle Interceptor-Objekte während der gesamten Lebensdauer des Kanals, der die Kette verwendet, gültig bleiben.
Der folgende Code zeigt, wie man einen benutzerdefinierten Deleter verwendet, um die Lebensdauer eines Interceptors an einen einzelnen Kanal zu binden:
auto *metricsInterceptor = new MetricsInterceptor();
auto *authInterceptor = new AuthInterceptor();
~~~
QGrpcInterceptorChain chain;
if (!chain.set(metricsInterceptor, authInterceptor))
qFatal("Failed to set interceptors to chain");
auto channel = std::shared_ptr<QGrpcHttp2Channel>(
new QGrpcHttp2Channel(QUrl("you_uri:port"), std::move(chain)),
[&metricsInterceptor, &authInterceptor](QGrpcHttp2Channel* ptr) {
delete ptr;
qDebug() << "Channel destroyed.";
// Wenn diese Interceptoren nicht von anderen Kanälen gemeinsam genutzt werden,
// ist dies der geeignete Ort, um sie zu löschen. Andernfalls muss ihre
// Lebensdauer extern verwaltet werden.
delete metricsInterceptor;
delete authInterceptor;
metricsInterceptor = nullptr;
authInterceptor = nullptr;
}
);Jeder Interceptor-Typ muss mindestens eine Interceptor-Schnittstelle (z. B. ` QGrpcStartInterceptor ` oder ` QGrpcFinishedInterceptor`) implementieren, um Interception-Funktionen bereitzustellen.
Siehe auch „ add()“ und „ clear()“.
template <typename... Ts> requires QtGrpcPrivate::if_interceptor<Ts...> bool QGrpcInterceptorChain::set(std::unique_ptr<Ts> &&... interceptors)
Ersetzt den Inhalt der Kette durch interceptors und übernimmt die Eigentumsrechte daran.
Gibt „ true “ zurück, wenn alle Interceptoren erfolgreich hinzugefügt wurden; andernfalls wird „ false “ zurückgegeben und die Kette bleibt unverändert.
Interceptoren werden in der Reihenfolge verarbeitet, in der sie an diese Funktion übergeben werden. Wenn alle Hinzufügungen erfolgreich sind, wird die Kette durch die neuen Interceptoren in dieser Reihenfolge ersetzt.
Die Eigentumsübertragung erfolgt schrittweise, während die Interceptoren verarbeitet werden. Wenn der Vorgang fehlschlägt, werden alle Interceptoren, die vor dem Fehler erfolgreich hinzugefügt wurden, zerstört, während die verbleibenden (noch nicht verarbeiteten) `unique_ptrs` gültig bleiben.
Jeder Interceptor-Typ muss mindestens eine Interceptor-Schnittstelle (z. B. ` QGrpcStartInterceptor ` oder ` QGrpcFinishedInterceptor`) implementieren, um Interception-Funktionen bereitzustellen.
Siehe auch ` add()` und ` clear()`.
[noexcept] qsizetype QGrpcInterceptorChain::size() const
Gibt die Anzahl der in der Kette gespeicherten Interceptoren zurück.
Siehe auch ` isEmpty()`.
[noexcept] void QGrpcInterceptorChain::swap(QGrpcInterceptorChain &other)
Tauscht „ other “ gegen dieses Objekt aus. Dieser Vorgang ist sehr schnell und schlägt niemals fehl.
[delete] QGrpcInterceptorChain &QGrpcInterceptorChain::operator=(const QGrpcInterceptorChain &)
Weist dieser „ QGrpcInterceptorChain “-Instanz „ other “ per Kopierzuweisung zu. Diese Funktion wird gelöscht.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.