blob: f11c935a2a3989a73a2908a5fa911417248484f5 [file]
<!doctype html><html lang=en-US dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-1.3.0 docs-doc-page docs-doc-id-guide/scala/grpc_support" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.1"><title data-rh=true>gRPC Support | Apache Fory™</title><meta data-rh=true name=viewport content="width=device-width, initial-scale=1.0"/><meta data-rh=true property=og:url content=https://fory.apache.org/docs/guide/scala/grpc_support /><meta data-rh=true property=og:locale content=en_US /><meta data-rh=true property=og:locale:alternate content=zh_CN /><meta data-rh=true name=docusaurus_locale content=en-US /><meta data-rh=true name=docsearch:language content=en-US /><meta data-rh=true http-equiv=Content-Security-Policy content="frame-src 'self' https://ghbtns.com/;"/><meta data-rh=true property=og:image content=https://fory.apache.org/img/logo.png /><meta data-rh=true property=og:image:width content=1500 /><meta data-rh=true property=og:image:height content=1500 /><meta data-rh=true name=twitter:card content=summary_large_image /><meta data-rh=true name=twitter:image content=https://fory.apache.org/img/logo.png /><meta data-rh=true name=docusaurus_version content=1.3.0 /><meta data-rh=true name=docusaurus_tag content=docs-default-1.3.0 /><meta data-rh=true name=docsearch:version content=1.3.0 /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-1.3.0 /><meta data-rh=true property=og:title content="gRPC Support | Apache Fory™"/><meta data-rh=true name=description content="Fory can generate Scala 3 gRPC service companions for schemas that define"/><meta data-rh=true property=og:description content="Fory can generate Scala 3 gRPC service companions for schemas that define"/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://fory.apache.org/docs/guide/scala/grpc_support /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/guide/scala/grpc_support hreflang=en-US /><link data-rh=true rel=alternate href=https://fory.apache.org/zh-CN/docs/guide/scala/grpc_support hreflang=zh-CN /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/guide/scala/grpc_support hreflang=x-default /><script data-rh=true type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"https://fory.apache.org/docs/guide/scala/","name":"Scala","position":1},{"@type":"ListItem","item":"https://fory.apache.org/docs/guide/scala/grpc_support","name":"gRPC Support","position":2}]}</script><link rel=alternate type=application/rss+xml href=/blog/rss.xml title="Apache Fory™ RSS Feed"><link rel=alternate type=application/atom+xml href=/blog/atom.xml title="Apache Fory™ Atom Feed"><script type=text/javascript>"fury.apache.org"===window.location.host&&(window.location.href="https://fory.apache.org"),function(){for(var o=window.location.pathname,a=["guide","introduction","start"],n=0;n<a.length;n++){var t=a[n],i=RegExp("^((?:/[a-z]{2}-[A-Z]{2})?/docs(?:/(?:next|[0-9]+.[0-9]+))?)/docs/"+t+"(/.*)?$"),c=o.match(i);if(c){var r=c[1]+"/"+t+(c[2]||"");window.location.replace(r+window.location.search+window.location.hash);return}}}()</script><link rel=stylesheet href=/assets/css/styles.3a1edaa1.css /><script src=/assets/js/runtime~main.605b11b1.js defer></script><script src=/assets/js/main.283fea4b.js defer></script></head><body><svg style="display: none;"><defs>
<symbol id=theme-svg-external-link viewBox="0 0 24 24"><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id=__docusaurus><div role=region aria-label="Skip to main content"><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>Skip to main content</a></div><nav aria-label=Main class="theme-layout-navbar navbar navbar--fixed-top"><div class=navbar__inner><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a class=navbar__brand href=/><div class=navbar__logo><img src=/img/fory-logo-light.png alt="Apache Fory™ Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"/><img src=/img/fory-logo-dark.png alt="Apache Fory™ Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"/></div><b class="navbar__title text--truncate"></b></a><a aria-current=page class="navbar__item navbar__link navbar__link--active" href=/docs/introduction/overview>Docs</a><a class="navbar__item navbar__link" href=/docs/specification/xlang_serialization_spec>Specification</a><a class="navbar__item navbar__link" href=/docs/community/>Community</a><a class="navbar__item navbar__link" href=/user>Users</a><a class="navbar__item navbar__link" href=/download>Download</a><a class="navbar__item navbar__link" href=/blog>Blog</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link>ASF</a><ul class=dropdown__menu><li><a href=https://www.apache.org/ target=_blank rel="noopener noreferrer" class=dropdown__link>Foundation</a><li><a href=https://www.apache.org/licenses/ target=_blank rel="noopener noreferrer" class=dropdown__link>License</a><li><a href=https://www.apache.org/events/current-event.html target=_blank rel="noopener noreferrer" class=dropdown__link>Events</a><li><a href=https://privacy.apache.org/policies/privacy-policy-public.html target=_blank rel="noopener noreferrer" class=dropdown__link>Privacy</a><li><a href=https://www.apache.org/security/ target=_blank rel="noopener noreferrer" class=dropdown__link>Security</a><li><a href=https://www.apache.org/foundation/sponsorship.html target=_blank rel="noopener noreferrer" class=dropdown__link>Sponsorship</a><li><a href=https://www.apache.org/foundation/thanks.html target=_blank rel="noopener noreferrer" class=dropdown__link>Thanks</a><li><a href=https://www.apache.org/foundation/policies/conduct.html target=_blank rel="noopener noreferrer" class=dropdown__link>Code of Conduct</a></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class=navbar__link aria-haspopup=true aria-expanded=false role=button href=/docs/guide/scala/grpc_support>1.3.0</a><ul class=dropdown__menu><li><a class=dropdown__link href=/docs/next/guide/scala/grpc_support>dev</a><li><a aria-current=page class="dropdown__link dropdown__link--active" href=/docs/guide/scala/grpc_support>1.3.0</a><li><a class=dropdown__link href=/docs/1.2.0/guide/scala/grpc_support>1.2.0</a><li><a class=dropdown__link href=/docs/1.1.0/introduction/overview>1.1.0</a><li><a class=dropdown__link href=/docs/1.0.0/introduction/overview>1.0.0</a><li><a class=dropdown__link href=/docs/0.17/introduction/overview>0.17</a><li><a class=dropdown__link href=/docs/0.16/introduction/overview>0.16</a><li><a class=dropdown__link href=/docs/0.15/introduction/overview>0.15</a><li><a class=dropdown__link href=/docs/0.14/introduction/overview>0.14</a><li><a class=dropdown__link href=/docs/0.13/introduction/overview>0.13</a><li><a class=dropdown__link href=/docs/0.12/introduction/overview>0.12</a><li><a class=dropdown__link href=/docs/0.11/introduction/overview>0.11</a><li><a class=dropdown__link href=/docs/0.10/introduction/overview>0.10</a></ul></div><a href=https://github.com/apache/fory target=_blank rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link><svg viewBox="0 0 24 24" width=20 height=20 aria-hidden=true class=iconLanguage_nlXk><path fill=currentColor d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/></svg>English</a><ul class=dropdown__menu><li><a href=/docs/guide/scala/grpc_support target=_self rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang=en-US>English</a><li><a href=/zh-CN/docs/guide/scala/grpc_support target=_self rel="noopener noreferrer" class=dropdown__link lang=zh-CN>简体中文</a></ul></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type=button disabled title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill=currentColor d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill=currentColor d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill=currentColor d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"/></svg></button></div><div class=navbarSearchContainer_Bca1><div class=navbar__search><span aria-label="expand searchbar" role=button class=search-icon tabindex=0></span><input id=search_input_react type=search placeholder=Loading... aria-label=Search class="navbar__search-input search-bar" disabled/></div></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class=docsWrapper_hBAB><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_njMd><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/docs/introduction/overview><span title=Introduction class=categoryLinkLabel_W154>Introduction</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/introduction/overview><span title=Overview class=linkLabel_WmDU>Overview</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/introduction/features><span title=Features class=linkLabel_WmDU>Features</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/introduction/benchmark><span title=Benchmark class=linkLabel_WmDU>Benchmark</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/docs/start/install><span title=Start class=categoryLinkLabel_W154>Start</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/start/install><span title=Install class=linkLabel_WmDU>Install</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/start/usage><span title=Usage class=linkLabel_WmDU>Usage</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false href=/docs/compiler/><span title="Schema IDL & Compiler" class=categoryLinkLabel_W154>Schema IDL & Compiler</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true href=/docs/guide/java/><span title=Guide class=categoryLinkLabel_W154>Guide</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/java/><span title=Java class=categoryLinkLabel_W154>Java</span></a><button aria-label="Expand sidebar category 'Java'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/python/><span title=Python class=categoryLinkLabel_W154>Python</span></a><button aria-label="Expand sidebar category 'Python'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/rust/><span title=Rust class=categoryLinkLabel_W154>Rust</span></a><button aria-label="Expand sidebar category 'Rust'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/cpp/><span title=C++ class=categoryLinkLabel_W154>C++</span></a><button aria-label="Expand sidebar category 'C++'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/go/><span title=Go class=categoryLinkLabel_W154>Go</span></a><button aria-label="Expand sidebar category 'Go'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/javascript/><span title=JavaScript class=categoryLinkLabel_W154>JavaScript</span></a><button aria-label="Expand sidebar category 'JavaScript'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/csharp/><span title=C# class=categoryLinkLabel_W154>C#</span></a><button aria-label="Expand sidebar category 'C#'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/swift/><span title=Swift class=categoryLinkLabel_W154>Swift</span></a><button aria-label="Expand sidebar category 'Swift'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/dart/><span title=Dart class=categoryLinkLabel_W154>Dart</span></a><button aria-label="Expand sidebar category 'Dart'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--active" tabindex=0 href=/docs/guide/scala/><span title=Scala class=categoryLinkLabel_W154>Scala</span></a><button aria-label="Collapse sidebar category 'Scala'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/scala/configuration><span title=Configuration class=linkLabel_WmDU>Configuration</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/scala/type_serialization><span title="Type Serialization" class=linkLabel_WmDU>Type Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/scala/schema_metadata><span title="Schema Metadata" class=linkLabel_WmDU>Schema Metadata</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/scala/default_values><span title="Default Values" class=linkLabel_WmDU>Default Values</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/scala/schema_idl><span title="Schema IDL And Xlang" class=linkLabel_WmDU>Schema IDL And Xlang</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/docs/guide/scala/grpc_support><span title="gRPC Support" class=linkLabel_WmDU>gRPC Support</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/kotlin/><span title=Kotlin class=categoryLinkLabel_W154>Kotlin</span></a><button aria-label="Expand sidebar category 'Kotlin'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/xlang/><span title="Cross Language" class=categoryLinkLabel_W154>Cross Language</span></a><button aria-label="Expand sidebar category 'Cross Language'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div></ul></ul></nav></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_VOVn"><div class=docItemContainer_Djhp><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label=Breadcrumbs><ul class=breadcrumbs><li class=breadcrumbs__item><a aria-label="Home page" class=breadcrumbs__link href=/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><span class=breadcrumbs__link>Guide</span><li class=breadcrumbs__item><a class=breadcrumbs__link href=/docs/guide/scala/><span>Scala</span></a><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>gRPC Support</span></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 1.3.0</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type=button class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>gRPC Support</h1></header><p>Fory can generate Scala 3 gRPC service companions for schemas that define
services. The generated service code uses normal grpc-java channels, servers,
deadlines, status codes, interceptors, and transport security, while request
and response objects are serialized with Fory instead of protobuf.</p>
<p>Use this mode when both sides of the RPC are generated from the same Fory IDL,
protobuf IDL, or FlatBuffers IDL and you want gRPC transport semantics with
Fory payload encoding. Use standard protobuf gRPC code generation when your API
must be consumed by generic protobuf clients, reflection tools, or components
that expect protobuf message bytes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=add-dependencies>Add Dependencies<a href=#add-dependencies class=hash-link aria-label="Direct link to Add Dependencies" title="Direct link to Add Dependencies" translate=no></a></h2>
<p>Generated Scala service files compile against grpc-java. The <code>fory-scala</code>
artifact does not add gRPC as a hard dependency, so add grpc-java dependencies
in your application build and align the version with the rest of your service
stack.</p>
<div class="language-sbt codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-sbt codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">libraryDependencies ++= Seq(</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> "org.apache.fory" %% "fory-scala" % "&lt;fory-version>",</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> "io.grpc" % "grpc-api" % "&lt;grpc-version>",</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> "io.grpc" % "grpc-stub" % "&lt;grpc-version>",</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> "io.grpc" % "grpc-netty-shaded" % "&lt;grpc-version>"</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">)</span><br/></div></code></pre></div></div>
<p>Generated Scala models and gRPC service companions are Scala 3 source. The
<code>fory-scala</code> artifact remains cross-built for Scala 2.13 and Scala 3, and the
dependency-free <code>org.apache.fory.scala.rpc</code> handle traits are available from
the shared artifact.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=define-a-service>Define a Service<a href=#define-a-service class=hash-link aria-label="Direct link to Define a Service" title="Direct link to Define a Service" translate=no></a></h2>
<p>Service definitions can come from Fory IDL, protobuf IDL, or FlatBuffers
<code>rpc_service</code> definitions. A Fory IDL service looks like this:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>package</span><span class="token plain"> demo</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">greeter</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>message</span><span class="token plain"> </span><span class="token class-name">HelloRequest</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>message</span><span class="token plain"> </span><span class="token class-name">HelloReply</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> reply </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>service</span><span class="token plain"> </span><span class="token class-name">Greeter</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>rpc</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>SayHello</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token class-name">HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>returns</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token class-name">HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>Generate Scala model and gRPC companion code with <code>--grpc</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style=color:#36acaa>--scala_out</span><span class="token operator" style=color:#393A34>=</span><span class="token plain">./generated/scala </span><span class="token parameter variable" style=color:#36acaa>--grpc</span><br/></div></code></pre></div></div>
<p>For this schema, the Scala generator emits:</p>
<table><thead><tr><th>File<th>Purpose<tbody><tr><td><code>HelloRequest.scala</code><td>Fory model type for the request<tr><td><code>HelloReply.scala</code><td>Fory model type for the response<tr><td><code>GreeterForyModule.scala</code><td>Fory registration module for generated types<tr><td><code>GreeterGrpc.scala</code><td>grpc-java service base, client, and codecs</table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=implement-a-server>Implement a Server<a href=#implement-a-server class=hash-link aria-label="Direct link to Implement a Server" title="Direct link to Implement a Server" translate=no></a></h2>
<p>Extend the generated <code>GreeterGrpc.GreeterImplBase</code> class and register it with a
standard grpc-java <code>Server</code>. Unary RPCs can be implemented with a direct
request-to-response method:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>package</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>demo</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>greeter</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">ServerBuilder</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>final</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> GreeterService </span><span class="token keyword" style=color:#00009f>extends</span><span class="token plain"> GreeterGrpc</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">GreeterImplBase </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> sayHello</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">request</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloReply </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> HelloReply</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-interpolation id function" style=color:#d73a49>s</span><span class="token string-interpolation string" style=color:#e3116c>"Hello, </span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>${</span><span class="token string-interpolation interpolation expression">request</span><span class="token string-interpolation interpolation expression punctuation" style=color:#393A34>.</span><span class="token string-interpolation interpolation expression">name</span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>}</span><span class="token string-interpolation string" style=color:#e3116c>"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token annotation punctuation" style=color:#393A34>@main</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> runServer</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> server </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> ServerBuilder</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">forPort</span><span class="token punctuation" style=color:#393A34>(</span><span class="token number" style=color:#36acaa>50051</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">addService</span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>new</span><span class="token plain"> GreeterService</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">build</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">start</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> server</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">awaitTermination</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>Generated request and response types are registered by the generated code, so
service implementations do not perform manual serializer registration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=create-a-client>Create a Client<a href=#create-a-client class=hash-link aria-label="Direct link to Create a Client" title="Direct link to Create a Client" translate=no></a></h2>
<p>Use the generated client with an ordinary grpc-java channel:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>package</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>demo</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>greeter</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">ManagedChannelBuilder</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>scala</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>concurrent</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">Await</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>scala</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>concurrent</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>duration</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">DurationInt</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token annotation punctuation" style=color:#393A34>@main</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> runClient</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> channel </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> ManagedChannelBuilder</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">forAddress</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"localhost"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>50051</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">usePlaintext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">build</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>try</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> client </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> GreeterGrpc</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">newClient</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">channel</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> call </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> client</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">sayHello</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"Fory"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> reply </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> Await</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">result</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">call</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">asFuture</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>30.</span><span class="token plain">seconds</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">reply</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">reply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>finally</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> channel</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">shutdownNow</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>Unary Scala-friendly methods return <code>RpcFuture[A]</code>. Use <code>asFuture</code> for Scala
composition, and call <code>cancel()</code> when the RPC should be cancelled before it
completes. The same generated client also exposes grpc-java-style per-method
variants such as observer-based async calls, blocking calls, and
<code>ListenableFuture</code> unary calls.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=streaming-rpcs>Streaming RPCs<a href=#streaming-rpcs class=hash-link aria-label="Direct link to Streaming RPCs" title="Direct link to Streaming RPCs" translate=no></a></h2>
<p>Fory service definitions can use the same gRPC streaming shapes as grpc-java:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>service</span><span class="token plain"> </span><span class="token class-name">Greeter</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>rpc</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>SayHello</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token class-name">HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>returns</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token class-name">HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>rpc</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>LotsOfReplies</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token class-name">HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>returns</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>stream</span><span class="token plain"> </span><span class="token class-name">HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>rpc</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>LotsOfGreetings</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>stream</span><span class="token plain"> </span><span class="token class-name">HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>returns</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token class-name">HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>rpc</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>Chat</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>stream</span><span class="token plain"> </span><span class="token class-name">HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>returns</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>stream</span><span class="token plain"> </span><span class="token class-name">HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>Generated Scala methods use these shapes:</p>
<table><thead><tr><th>IDL shape<th>Scala client convenience<th>grpc-java-style methods<tbody><tr><td>Unary<td><code>RpcFuture[Resp]</code><td>Async observer, blocking, and <code>ListenableFuture</code><tr><td>Server streaming<td><code>RpcIterator[Resp]</code><td>Async observer and blocking iterator<tr><td>Client streaming<td>None<td><code>StreamObserver</code> request stream<tr><td>Bidirectional streaming<td>None<td><code>StreamObserver</code> request and response streams</table>
<p>The Scala-friendly convenience layer covers the cases where a direct Scala
handle can keep the important lifecycle controls. Unary calls use
<code>RpcFuture[A]</code> so callers can compose with Scala <code>Future</code> without losing
cancellation. Server-streaming calls use <code>RpcIterator[A]</code> so callers can consume
responses with the normal Scala <code>Iterator</code> contract while still being able to
close the underlying RPC. Client-streaming and bidirectional streaming stay on
grpc-java <code>StreamObserver</code> APIs because the request stream lifecycle,
completion, cancellation, and flow-control rules are the grpc-java rules.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=server-streaming-clients>Server-Streaming Clients<a href=#server-streaming-clients class=hash-link aria-label="Direct link to Server-Streaming Clients" title="Direct link to Server-Streaming Clients" translate=no></a></h3>
<p>Use the Scala-friendly method when the client wants pull-style consumption:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> stream </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> client</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">lotsOfReplies</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"Fory"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>try</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>while</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">stream</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">hasNext</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> reply </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> stream</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">next</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">reply</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">reply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>finally</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> stream</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">close</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p><code>RpcIterator[A]</code> extends Scala <code>Iterator[A]</code> and <code>AutoCloseable</code>. A fully
consumed stream closes when the server completes it. If the caller stops early,
call <code>close()</code> or <code>cancel()</code> to release the gRPC call and notify the server that
the response stream is no longer needed.</p>
<p>Use the observer overload when the client wants grpc-java async callbacks:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>stub</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">StreamObserver</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">client</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">lotsOfReplies</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> HelloRequest</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"Fory"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>new</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">reply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">t</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> Throwable</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> t</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">printStackTrace</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"done"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<p>The generated client also exposes a blocking grpc-java-style iterator through
<code>lotsOfRepliesBlocking(request)</code>. Prefer the Scala-friendly <code>RpcIterator</code> when
you need early cancellation; use the blocking iterator only when matching an
existing grpc-java workflow.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=client-streaming-clients>Client-Streaming Clients<a href=#client-streaming-clients class=hash-link aria-label="Direct link to Client-Streaming Clients" title="Direct link to Client-Streaming Clients" translate=no></a></h3>
<p>For client-streaming RPCs, the generated method accepts a response observer and
returns the request observer. Send every request with <code>onNext</code>, then call
<code>onCompleted</code> exactly once when the client has finished sending:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>stub</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">StreamObserver</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> requests </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> client</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">lotsOfGreetings</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>new</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">reply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">t</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> Throwable</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> t</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">printStackTrace</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"server completed"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">requests</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"Ada"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">requests</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"Grace"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">requests</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<p>If the client cannot finish sending requests, signal the failure with
<code>requests.onError(error)</code>. Deadlines, cancellation, and call options are the
standard grpc-java stub features, so they are configured on the generated client
stub before starting the call.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=bidirectional-clients>Bidirectional Clients<a href=#bidirectional-clients class=hash-link aria-label="Direct link to Bidirectional Clients" title="Direct link to Bidirectional Clients" translate=no></a></h3>
<p>Bidirectional streaming uses the same grpc-java request observer pattern, but
responses can arrive while the client is still sending requests:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>stub</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">StreamObserver</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> requests </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> client</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">chat</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>new</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloReply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">reply</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">t</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> Throwable</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> t</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">printStackTrace</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> println</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"chat closed"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">requests</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"first"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">requests</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"second"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">requests</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<p>Use grpc-java observer subtypes such as <code>ClientResponseObserver</code>,
<code>ClientCallStreamObserver</code>, or <code>ServerCallStreamObserver</code> when an application
needs manual inbound flow control, readiness callbacks, cancellation handlers,
or direct transport-level cancellation. The generated Scala methods accept the
standard grpc-java observer types, so those advanced grpc-java patterns remain
available without a separate Fory API.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=streaming-servers>Streaming Servers<a href=#streaming-servers class=hash-link aria-label="Direct link to Streaming Servers" title="Direct link to Streaming Servers" translate=no></a></h3>
<p>Unary server methods can use the direct Scala-friendly override shown earlier.
Streaming server methods use grpc-java observers. A server-streaming
implementation receives one request and writes zero or more responses:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>stub</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">StreamObserver</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>scala</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>util</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>control</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">NonFatal</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>final</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> GreeterService </span><span class="token keyword" style=color:#00009f>extends</span><span class="token plain"> GreeterGrpc</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">GreeterImplBase </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> lotsOfReplies</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> request</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloRequest</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>try</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-interpolation id function" style=color:#d73a49>s</span><span class="token string-interpolation string" style=color:#e3116c>"Hello, </span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>${</span><span class="token string-interpolation interpolation expression">request</span><span class="token string-interpolation interpolation expression punctuation" style=color:#393A34>.</span><span class="token string-interpolation interpolation expression">name</span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>}</span><span class="token string-interpolation string" style=color:#e3116c>"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-interpolation id function" style=color:#d73a49>s</span><span class="token string-interpolation string" style=color:#e3116c>"Welcome, </span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>${</span><span class="token string-interpolation interpolation expression">request</span><span class="token string-interpolation interpolation expression punctuation" style=color:#393A34>.</span><span class="token string-interpolation interpolation expression">name</span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>}</span><span class="token string-interpolation string" style=color:#e3116c>"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>catch</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>case</span><span class="token plain"> NonFatal</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">e</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>=></span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">e</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>Client-streaming servers return an observer for incoming requests and write the
single response when the request stream completes:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>stub</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">StreamObserver</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>scala</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>collection</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>mutable</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">ArrayBuffer</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>final</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> GreeterService </span><span class="token keyword" style=color:#00009f>extends</span><span class="token plain"> GreeterGrpc</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">GreeterImplBase </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> lotsOfGreetings</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>new</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>private</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> names </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> ArrayBuffer</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">empty</span><span class="token punctuation" style=color:#393A34>[</span><span class="token builtin">String</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> names </span><span class="token operator" style=color:#393A34>+=</span><span class="token plain"> value</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">name</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">t</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> Throwable</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> names</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">clear</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">names</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">mkString</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"Hello "</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>", "</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>""</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>Bidirectional servers also return an observer for incoming requests, but may
emit responses from each <code>onNext</code> call:</p>
<div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> </span><span class="token namespace" style=opacity:0.7>io</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>grpc</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token namespace" style=opacity:0.7>stub</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>.</span><span class="token plain">StreamObserver</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>final</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> GreeterService </span><span class="token keyword" style=color:#00009f>extends</span><span class="token plain"> GreeterGrpc</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">GreeterImplBase </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> chat</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>new</span><span class="token plain"> StreamObserver</span><span class="token punctuation" style=color:#393A34>[</span><span class="token plain">HelloRequest</span><span class="token punctuation" style=color:#393A34>]</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> HelloRequest</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onNext</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">HelloReply</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-interpolation id function" style=color:#d73a49>s</span><span class="token string-interpolation string" style=color:#e3116c>"Echo: </span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>${</span><span class="token string-interpolation interpolation expression">value</span><span class="token string-interpolation interpolation expression punctuation" style=color:#393A34>.</span><span class="token string-interpolation interpolation expression">name</span><span class="token string-interpolation interpolation punctuation" style=color:#393A34>}</span><span class="token string-interpolation string" style=color:#e3116c>"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">t</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> Throwable</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>override</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>def</span><span class="token plain"> onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token builtin">Unit</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> responseObserver</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">onCompleted</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>Server-streaming, client-streaming, and bidirectional server methods use
grpc-java <code>StreamObserver</code> APIs because streaming completion, request flow
control, cancellation, and backpressure follow grpc-java behavior.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=grpc-runtime-behavior>gRPC Runtime Behavior<a href=#grpc-runtime-behavior class=hash-link aria-label="Direct link to gRPC Runtime Behavior" title="Direct link to gRPC Runtime Behavior" translate=no></a></h2>
<p>The generated service code only replaces request and response serialization.
All normal gRPC operational features still belong to grpc-java:</p>
<ul>
<li class="">Deadlines and cancellations</li>
<li class="">TLS and authentication</li>
<li class="">Name resolution and load balancing</li>
<li class="">Client and server interceptors</li>
<li class="">Status codes and metadata</li>
<li class="">Channel pooling and lifecycle management</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=troubleshooting>Troubleshooting<a href=#troubleshooting class=hash-link aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=missing-iogrpc-or-guava-classes>Missing <code>io.grpc</code> or Guava Classes<a href=#missing-iogrpc-or-guava-classes class=hash-link aria-label="Direct link to missing-iogrpc-or-guava-classes" title="Direct link to missing-iogrpc-or-guava-classes" translate=no></a></h3>
<p>Add the grpc-java dependencies shown above. Generated Fory service files import
grpc-java APIs, but <code>fory-scala</code> intentionally does not depend on gRPC.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=generic-protobuf-clients-cannot-read-payloads>Generic Protobuf Clients Cannot Read Payloads<a href=#generic-protobuf-clients-cannot-read-payloads class=hash-link aria-label="Direct link to Generic Protobuf Clients Cannot Read Payloads" title="Direct link to Generic Protobuf Clients Cannot Read Payloads" translate=no></a></h3>
<p>Fory-generated gRPC services use Fory bytes inside gRPC message frames, not
protobuf message bytes. Use a Fory-generated client for Fory-generated services,
or provide a separate protobuf service endpoint for generic protobuf clients.</div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href=https://github.com/apache/fory-site/tree/main/docs/guide/scala/grpc-support.md target=_blank rel="noopener noreferrer" class=theme-edit-this-page><svg fill=currentColor height=20 width=20 viewBox="0 0 40 40" class=iconEdit_Z9Sw aria-hidden=true><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"/></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href=/docs/guide/scala/schema_idl><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>Schema IDL And Xlang</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/guide/kotlin/><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Kotlin Serialization Guide</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href=#add-dependencies class="table-of-contents__link toc-highlight">Add Dependencies</a><li><a href=#define-a-service class="table-of-contents__link toc-highlight">Define a Service</a><li><a href=#implement-a-server class="table-of-contents__link toc-highlight">Implement a Server</a><li><a href=#create-a-client class="table-of-contents__link toc-highlight">Create a Client</a><li><a href=#streaming-rpcs class="table-of-contents__link toc-highlight">Streaming RPCs</a><ul><li><a href=#server-streaming-clients class="table-of-contents__link toc-highlight">Server-Streaming Clients</a><li><a href=#client-streaming-clients class="table-of-contents__link toc-highlight">Client-Streaming Clients</a><li><a href=#bidirectional-clients class="table-of-contents__link toc-highlight">Bidirectional Clients</a><li><a href=#streaming-servers class="table-of-contents__link toc-highlight">Streaming Servers</a></ul><li><a href=#grpc-runtime-behavior class="table-of-contents__link toc-highlight">gRPC Runtime Behavior</a><li><a href=#troubleshooting class="table-of-contents__link toc-highlight">Troubleshooting</a><ul><li><a href=#missing-iogrpc-or-guava-classes class="table-of-contents__link toc-highlight">Missing <code>io.grpc</code> or Guava Classes</a><li><a href=#generic-protobuf-clients-cannot-read-payloads class="table-of-contents__link toc-highlight">Generic Protobuf Clients Cannot Read Payloads</a></ul></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Community</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://lists.apache.org/list.html?dev@fory.apache.org target=_blank rel="noopener noreferrer" class=footer__link-item>Mailing list<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A target=_blank rel="noopener noreferrer" class=footer__link-item>Slack<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://twitter.com/ApacheFory target=_blank rel="noopener noreferrer" class=footer__link-item>Twitter<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Docs</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/docs/start/install>Install</a><li class=footer__item><a class=footer__link-item href=/docs/start/usage>Usage</a><li class=footer__item><a class=footer__link-item href=/docs/introduction/benchmark>Benchmark</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Repositories</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://github.com/apache/fory target=_blank rel="noopener noreferrer" class=footer__link-item>Apache Fory™<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://github.com/apache/fory-site target=_blank rel="noopener noreferrer" class=footer__link-item>Website<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div></div><div class="footer__bottom text--center"><div class=margin-bottom--sm><a href=https://apache.org/ rel="noopener noreferrer" class=footerLogoLink_BH7S><img src=/img/asf_logo.svg alt="ASF Logo" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" width=200 /><img src=/img/asf_logo.svg alt="ASF Logo" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" width=200 /></a></div><div class=footer__copyright><div>
<p>
Copyright © 2026 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br/>
Apache Fory, Fory, Apache, the Apache Logo and the Apache Fory logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.
</p>
</div></div></div></div></footer></div></body>