<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KuFlow</title>
    <description>The latest articles on DEV Community by KuFlow (@kuflow).</description>
    <link>https://dev.to/kuflow</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F972835%2F265ab3eb-c647-4a3b-8b1f-d478435ba439.jpg</url>
      <title>DEV Community: KuFlow</title>
      <link>https://dev.to/kuflow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kuflow"/>
    <language>en</language>
    <item>
      <title>KuFlow as a Temporal.io-based Workflow Orchestrator</title>
      <dc:creator>KuFlow</dc:creator>
      <pubDate>Fri, 16 Dec 2022 09:27:01 +0000</pubDate>
      <link>https://dev.to/kuflow/kuflow-as-a-temporalio-based-workflow-orchestrator-3el3</link>
      <guid>https://dev.to/kuflow/kuflow-as-a-temporalio-based-workflow-orchestrator-3el3</guid>
      <description>&lt;p&gt;KuFlow, among other things, orchestrates &lt;a href="https://temporal.io"&gt;Temporal.io&lt;/a&gt; workflows so you can manage your workflows more easily. With KuFlow, you can create and run workflows in seconds and manage them all from one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is KuFlow?
&lt;/h2&gt;

&lt;p&gt;According to one of our developers, "From Temporal.io's point of view, KuFlow can be seen as a layer that builds on Temporal and provides authorization, authentication, data governance, and a collaborative user interface, among other features."&lt;/p&gt;

&lt;p&gt;If you ask me, KuFlow is an orchestra conductor that directs the rhythm of business processes in an orderly manner and on time, making them "sound in harmony" so that they flow efficiently with the clear intention of adding value to the organization, and Temporal.io is part of the band in conjunction with humans and machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  How KuFlow powers the use of Temporal.io
&lt;/h2&gt;

&lt;p&gt;By interacting with the KuFlow user interface, you can trigger information inputs and outputs in the form of tasks for the desired business process. with an authorization system that guarantees that only the right people or systems have access to the information and functions necessary to perform interactions with the tasks.&lt;/p&gt;

&lt;p&gt;Behind the scenes, where developers can do their magic, APIs can be used to connect to the different platforms in the environment, and if they don't have APIs, KuFlow can make use of RPA tools, such as robotframework or uiPath, and complete the processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The advantages of using KuFlow as a layer of empowerment of Temporal.io
&lt;/h2&gt;

&lt;p&gt;KuFlow provides the role of supervisor to humans over machines, which execute all tasks: repetitive, long, short, boring, prone to failure, and many more. And it empowers him to decide if the result is as expected or not.&lt;/p&gt;

&lt;p&gt;Therefore, the human is not replaced by the machine, but is freed from the time and effort that would be required to perform the tasks, giving them the possibility of using that time on issues of greater importance to the business, such as generating new income or searching for ways to save or improve management.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AxxfGwfm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/fe8f7f17e67c8cb88efca4ec2afc5212/f5a85/BLG13-superhero-KuFlow.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AxxfGwfm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/fe8f7f17e67c8cb88efca4ec2afc5212/f5a85/BLG13-superhero-KuFlow.webp" alt="KuFlow powers the use of Temporal.io" width="608" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But KuFlow not only works with Temporal.io
&lt;/h2&gt;

&lt;p&gt;With KuFlow it is also possible to work with serverless workflows apart from &lt;a href="https://temporal.io"&gt;Temporal.io&lt;/a&gt;, we explain it in &lt;a href="https://KuFlow.com/blog/es/serverless-tutorial-vaction-request"&gt;this&lt;/a&gt; blog entry, but in summary, almost as a no-code tool, the correct use It would be a rather low-code tool; in just a matter of minutes with our drag-and-drop tool, you can have a workflow that interacts with one or more users of the organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  In conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://temporal.io"&gt;Temporal.io&lt;/a&gt; is a workflow platform based on microservices that offers a complete solution and KuFlow complements and enhances it. Adding security, resiliency, and collaboration, With KuFlow, developers can create robust and highly scalable workflows for their applications, allowing them to fully harness the power of temporal.io.&lt;/p&gt;

&lt;p&gt;In terms of resiliency, KuFlow enables workflow users to detect and respond to events in real time, ensuring a higher level of service continuity.&lt;/p&gt;

&lt;p&gt;Finally, we recommend you try &lt;a href="https://app.KuFlow.com"&gt;KuFlow&lt;/a&gt; by creating a free account and finding out for yourself.&lt;/p&gt;

&lt;p&gt;For more information, visit our &lt;a href="https://docs.KuFlow.com"&gt;technical documentation&lt;/a&gt; and our &lt;a href="https://www.youtube.com/channel/UCXoRtHICa86YfX8P_wu1f6Q"&gt;video tutorials&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>temporal</category>
      <category>java</category>
      <category>showdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>No-code or Workflow as code? Better both</title>
      <dc:creator>KuFlow</dc:creator>
      <pubDate>Tue, 29 Nov 2022 15:53:21 +0000</pubDate>
      <link>https://dev.to/kuflow/no-code-or-workflow-as-code-better-both-6o</link>
      <guid>https://dev.to/kuflow/no-code-or-workflow-as-code-better-both-6o</guid>
      <description>&lt;p&gt;In KuFlow we know that some users don't need a fine-grain control of the workflows that they develop. Sometimes, the business process is so simple that you just want to establish a bunch of tasks, establish the relationship between them, and run the process.&lt;/p&gt;

&lt;p&gt;For that kind of scenario, maybe you don’t need to implement the workflow as code and deploy it in a conventional way, so we have developed the KuFlow Diagram Tool that is based on these three pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/awslabs/diagram-maker" rel="noopener noreferrer"&gt;Diagram Maker&lt;/a&gt;, a new drag-and-drop tool designed to allow our users to implement simple workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://serverlessworkflow.io/" rel="noopener noreferrer"&gt;Serverless workflow&lt;/a&gt;. Instead of reinventing the wheel, we decided to base this feature on an established and mature specification. Serverless workflow is a powerful open-source standard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://temporal.io/" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt; as the main runtime engine that acts as the foundation for the workflow execution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkuflow.com%2Fstatic%2F3a1b582710289fd7d5a8ef515018b213%2Fd00b9%2Fkuflow_diagram_tool.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkuflow.com%2Fstatic%2F3a1b582710289fd7d5a8ef515018b213%2Fd00b9%2Fkuflow_diagram_tool.webp" alt="Serverless workflows in KuFlow" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;First of all, you must define your workflow using our Diagram Maker Tool.&lt;/p&gt;

&lt;p&gt;Thanks to the great work of &lt;a href="https://github.com/awslabs" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;, we could build a minimalist UI, that fits our necessities.&lt;/p&gt;

&lt;p&gt;But please remember! This is a first version of this tool. We are planning to add features to it, according to the feedback we receive from the community.&lt;/p&gt;

&lt;p&gt;Once you have defined the workflow on a diagram, a JSON, following the &lt;a href="https://serverlessworkflow.io/" rel="noopener noreferrer"&gt;Serverless workflow&lt;/a&gt; specification, is stored in KuFlow. With this specification, we can use all the great tools/libs that are developed.&lt;/p&gt;

&lt;p&gt;Finally, our KuFlow Diagram Runner executes the JSON created after the diagram. This Runner is based on the great work of &lt;a href="https://github.com/tsurdilo" rel="noopener noreferrer"&gt;Tihomir Surdilovic&lt;/a&gt; (aka &lt;a href="https://twitter.com/tsurdilo" rel="noopener noreferrer"&gt;tsurdilo&lt;/a&gt;) that you can find at &lt;a href="https://github.com/tsurdilo/swtemporal" rel="noopener noreferrer"&gt;his repo&lt;/a&gt; (&lt;em&gt;kudos&lt;/em&gt;, Tihomir!). Thanks to his awesome work, we have developed a very simple Serverless Workflow Runtime, that doesn't have all the features that the specification allows, but we think that it covers the core set of them as a first version.&lt;/p&gt;

&lt;p&gt;The runtime is developed using &lt;a href="https://temporal.io/" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt;, which is one of the main tools that we are currently using at KuFlow. Thanks to, all the workflow executions are robust: your application will be durable, reliable, and scalable.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I do it?
&lt;/h2&gt;

&lt;p&gt;We are preparing a video tutorial with all the required steps (stay tuned on &lt;a href="https://twitter.com/kuflowio" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or subscribe to &lt;a href="https://www.youtube.com/channel/UCXoRtHICa86YfX8P_wu1f6Q" rel="noopener noreferrer"&gt;our YouTube channel&lt;/a&gt;!).&lt;/p&gt;

&lt;p&gt;Meanwhile, you can try to create your own Serverless Workflow in KuFlow on your own, creating a new process definition and selecting “KuFlow Diagram Tool” as its Workflow Engine. Please remember that you can use &lt;a href="https://community.kuflow.com/" rel="noopener noreferrer"&gt;our forum&lt;/a&gt; to ask about any issue or doubt you may find.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkuflow.com%2Fstatic%2Ff4567261a7246965be40b25156755b45%2Fd00b9%2Fkuflow_serverless_workflow.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkuflow.com%2Fstatic%2Ff4567261a7246965be40b25156755b45%2Fd00b9%2Fkuflow_serverless_workflow.webp" alt="Serverless workflows in KuFlow" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Well, honestly, we are not very sure at this moment. We have thought about different paths for continuing the development: adding more features to the Diagram Tool, covering more details of the Serverless Workflow specification, building a DSL tool from scratch,... We are looking forward to getting some feedback from you, in order to establish the best priorities thinking in our community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please share your thoughts with us on &lt;a href="https://twitter.com/kuflowio" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>No-code or Workflow as code? Better both</title>
      <dc:creator>KuFlow</dc:creator>
      <pubDate>Tue, 29 Nov 2022 15:49:19 +0000</pubDate>
      <link>https://dev.to/kuflow/no-code-or-workflow-as-code-better-both-57f5</link>
      <guid>https://dev.to/kuflow/no-code-or-workflow-as-code-better-both-57f5</guid>
      <description>&lt;p&gt;In KuFlow we know that some users don't need a fine-grain control of the workflows that they develop. Sometimes, the business process is so simple that you just want to establish a bunch of tasks, establish the relationship between them, and run the process.&lt;/p&gt;

&lt;p&gt;For that kind of scenario, maybe you don’t need to implement the workflow as code and deploy it in a conventional way, so we have developed the KuFlow Diagram Tool that is based on these three pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/awslabs/diagram-maker"&gt;Diagram Maker&lt;/a&gt;, a new drag-and-drop tool designed to allow our users to implement simple workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://serverlessworkflow.io/"&gt;Serverless workflow&lt;/a&gt;. Instead of reinventing the wheel, we decided to base this feature on an established and mature specification. Serverless workflow is a powerful open-source standard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://temporal.io/"&gt;Temporal&lt;/a&gt; as the main runtime engine that acts as the foundation for the workflow execution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mLdzkz5r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/3a1b582710289fd7d5a8ef515018b213/d00b9/kuflow_diagram_tool.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mLdzkz5r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/3a1b582710289fd7d5a8ef515018b213/d00b9/kuflow_diagram_tool.webp" alt="Serverless workflows in KuFlow" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;First of all, you must define your workflow using our Diagram Maker Tool.&lt;/p&gt;

&lt;p&gt;Thanks to the great work of &lt;a href="https://github.com/awslabs"&gt;AWS&lt;/a&gt;, we could build a minimalist UI, that fits our necessities.&lt;/p&gt;

&lt;p&gt;But please remember! This is a first version of this tool. We are planning to add features to it, according to the feedback we receive from the community.&lt;/p&gt;

&lt;p&gt;Once you have defined the workflow on a diagram, a JSON, following the &lt;a href="https://serverlessworkflow.io/"&gt;Serverless workflow&lt;/a&gt; specification, is stored in KuFlow. With this specification, we can use all the great tools/libs that are developed.&lt;/p&gt;

&lt;p&gt;Finally, our KuFlow Diagram Runner executes the JSON created after the diagram. This Runner is based on the great work of &lt;a href="https://github.com/tsurdilo"&gt;Tihomir Surdilovic&lt;/a&gt; (aka &lt;a href="https://twitter.com/tsurdilo"&gt;tsurdilo&lt;/a&gt;) that you can find at &lt;a href="https://github.com/tsurdilo/swtemporal"&gt;his repo&lt;/a&gt; (&lt;em&gt;kudos&lt;/em&gt;, Tihomir!). Thanks to his awesome work, we have developed a very simple Serverless Workflow Runtime, that doesn't have all the features that the specification allows, but we think that it covers the core set of them as a first version.&lt;/p&gt;

&lt;p&gt;The runtime is developed using &lt;a href="https://temporal.io/"&gt;Temporal&lt;/a&gt;, which is one of the main tools that we are currently using at KuFlow. Thanks to, all the workflow executions are robust: your application will be durable, reliable, and scalable.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I do it?
&lt;/h2&gt;

&lt;p&gt;We are preparing a video tutorial with all the required steps (stay tuned on &lt;a href="https://twitter.com/kuflowio"&gt;Twitter&lt;/a&gt; or subscribe to &lt;a href="https://www.youtube.com/channel/UCXoRtHICa86YfX8P_wu1f6Q"&gt;our YouTube channel&lt;/a&gt;!).&lt;/p&gt;

&lt;p&gt;Meanwhile, you can try to create your own Serverless Workflow in KuFlow on your own, creating a new process definition and selecting “KuFlow Diagram Tool” as its Workflow Engine. Please remember that you can use &lt;a href="https://community.kuflow.com/"&gt;our forum&lt;/a&gt; to ask about any issue or doubt you may find.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6KbbiIWI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/f4567261a7246965be40b25156755b45/d00b9/kuflow_serverless_workflow.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6KbbiIWI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/f4567261a7246965be40b25156755b45/d00b9/kuflow_serverless_workflow.webp" alt="Serverless workflows in KuFlow" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Well, honestly, we are not very sure at this moment. We have thought about different paths for continuing the development: adding more features to the Diagram Tool, covering more details of the Serverless Workflow specification, building a DSL tool from scratch,... We are looking forward to getting some feedback from you, in order to establish the best priorities thinking in our community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please share your thoughts with us on &lt;a href="https://twitter.com/kuflowio"&gt;Twitter&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>temporal</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How KuFlow supports Temporal as a workflows engine for our processes?</title>
      <dc:creator>KuFlow</dc:creator>
      <pubDate>Tue, 15 Nov 2022 09:06:11 +0000</pubDate>
      <link>https://dev.to/kuflow/how-kuflow-supports-temporal-as-a-worfkows-engine-for-our-processes-3j5c</link>
      <guid>https://dev.to/kuflow/how-kuflow-supports-temporal-as-a-worfkows-engine-for-our-processes-3j5c</guid>
      <description>&lt;p&gt;In such a diverse world, it would be boring to have a single way of doing things. That's why at KuFlow we support different ways to implement the logic of our processes and tasks. And in this post, we will talk about one of them, the orchestration through &lt;a href="https://temporal.io/"&gt;Temporal&lt;/a&gt;, which gives us a powerful way to manage our workflows.&lt;/p&gt;

&lt;p&gt;We will not go into detail on the concepts that are handled in our platform, for that you can consult the &lt;a href="https://docs.kuflow.com/"&gt;documentation&lt;/a&gt; or other &lt;a href="https://kuflow.com/es/blog"&gt;blog entries&lt;/a&gt;, but as a general idea, we can stay with the following. KuFlow is a platform that allows you to model business processes that involve a series of tasks to carry out their achievement. These tasks can be performed by humans or by systems and are basically activities to perform actions and/or collect information. We also need to establish a way to control the performance of these tasks, their order, their asynchronous or non-asynchronous nature, or their ability to recover from errors. In other words, we need a workflow to orchestrate our process. At KuFlow we call &lt;em&gt;WorkFlow Engine&lt;/em&gt; for the different types of implementations we support. In this case, Temporal is the &lt;em&gt;Workflow Engine&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Temporal for your KuFlow processes?
&lt;/h2&gt;

&lt;p&gt;The use of Temporal gives us several benefits, the main one being the ability to implement the resilience of our operations in a comfortable and reliable way. For example, let's imagine that a task of one of our processes makes a call to a third-party API. If this API is not available at the time of its call, the task fails and our process could be blocked. In this case, we would like the workflow of our process to be retried later and have to forget about all the scaffolding required to do so. Also, if we have already issued modification requests to other external APIs, we would like that when recovering the process, the consumption of these APIs would be deterministic and would not fail because we have consumed them twice. We achieve all this by implementing our workflows with Temporal.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does Temporal integrate with KuFlow?
&lt;/h2&gt;

&lt;p&gt;In order to simplify as much as possible the infrastructure of our customers, in KuFlow we have our own Temporal cloud avoiding the need to deploy this infrastructure by customers. Having a Temporal cloud is not our core business and in the future, we may also offer the possibility to use other clouds such as &lt;a href="https://temporal.io/cloud"&gt;Temporal Cloud&lt;/a&gt; or any other.&lt;/p&gt;

&lt;p&gt;To implement a Workflow in a process using Temporal, we need to develop what in KuFlow we call Worker. A worker is nothing more than an application that runs on our customers' servers and interacts with the KuFlow API and the Temporal API available in our cloud. This approach allows for a hybrid cloud architecture that provides flexibility when accessing the different services that you want to consume in the Worker. Thus, for example, a Worker deployed on the customer's servers would have access to the customer's private services in a secure and reliable way in order to extract data and make decisions based on their needs.&lt;/p&gt;

&lt;p&gt;To facilitate the development of this Worker, a library that facilitates the consumption of the KuFlow API through Temporal Activities is provided. Together with the different SDKs provided by Temporal, the construction of a Worker is, in most cases, child's play. The various languages for which these libraries are provided are updated frequently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;One of the most important aspects for us is everything related to security. And for this reason, apart from a powerful RBAC system that is deployed on the customer's resources, we use a series of authentication mechanisms to access the different APIs that we offer. To facilitate the management of access and credentials to these APIs, KuFlow defines the concept of 'Application'. By definition, an 'Application' is composed of credentials and access certificates. In turn, these applications are used as candidates or "principals" to grant roles and permissions to the resources you want.&lt;/p&gt;

&lt;h3&gt;
  
  
  How is authentication and authorization achieved with the Temporal API?
&lt;/h3&gt;

&lt;p&gt;Schematically, to authenticate we will use Mutual TLS and to get authorization we will use a JWT bearer token. Obtaining the certificates and credentials is done from the KuFlow App in a simple way, without the need to create and upload the certificates manually. Armed with this data we can now connect our workers to the KuFlow cloud. The authentication mechanism follows the following flow: On the one hand, it is necessary to obtain a JWT bearer token that will allow us authorization in Temporal, for this a request is issued to the KuFlow API Rest (authenticated by BasicAuth) that returns the token. With this token, the communications to Temporal's API GRPC are made, besides using the certificates to encrypt the communication and to achieve the authentication with this API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KiGRS6wh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/cf98558da83533e9216470b7e5bda38b/d00b9/authentication.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KiGRS6wh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/cf98558da83533e9216470b7e5bda38b/d00b9/authentication.webp" alt="authentication" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more information, please refer to the &lt;a href="https://docs.kuflow.com/developers/overview/authentication"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To deal with problems such as carrier token renewal and to make the developer's experience as comfortable as possible, this mechanism is implemented in the libraries we provide as support for Workers. An example of token renegotiation can be seen in this code extracted from the &lt;strong&gt;kuflow-engine-client library&lt;/strong&gt; in Java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KuFlowAuthorizationTokenSupplier&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;AuthorizationTokenSupplier&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="no"&gt;LOGGER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LoggerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLogger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KuFlowAuthorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="no"&gt;EXPIRE_PERCENTAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Duration&lt;/span&gt; &lt;span class="no"&gt;EXPIRE_MAX_DURATION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofMinutes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationApi&lt;/span&gt; &lt;span class="n"&gt;authenticationApi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;volatile&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;volatile&lt;/span&gt; &lt;span class="nc"&gt;Instant&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;KuFlowAuthorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AuthenticationApi&lt;/span&gt; &lt;span class="n"&gt;authenticationApi&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authenticationApi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;authenticationApi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;supply&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestToken&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Bearer "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;requestToken&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;Instant&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isTokenNonExpired&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isTokenNonExpired&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="nc"&gt;AuthenticationResource&lt;/span&gt; &lt;span class="n"&gt;authentication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationResource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;authentication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AuthenticationTypeResource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;authentication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authenticationApi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createAuthentication&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authentication&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="nc"&gt;Duration&lt;/span&gt; &lt;span class="n"&gt;expireDuration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;between&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Instant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;authentication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getExpiredAt&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="n"&gt;expireDuration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSeconds&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expireDuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSeconds&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;EXPIRE_PERCENTAGE&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expireDuration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;EXPIRE_MAX_DURATION&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;expireDuration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;EXPIRE_MAX_DURATION&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;authentication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getToken&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tokenExpireAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Instant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;plus&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expireDuration&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="no"&gt;LOGGER&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Regenerated JWT Temporal authorization token. Expired at: {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isTokenNonExpired&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Instant&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;tokenExpireAt&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nc"&gt;Instant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;isBefore&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenExpireAt&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we have done here is to implement the &lt;em&gt;AuthorizationTokenSupplier&lt;/em&gt; interface provided by the Temporal SDK to use our KuFlow API client library to negotiate a token when needed. In the same way, we implemented the &lt;em&gt;GrpcMetadataProvider&lt;/em&gt; interface with the purpose of adding as metadata the token provided by the previous implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthorizationGrpcMetadataProvider&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;GrpcMetadataProvider&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;AUTHORIZATION_HEADER_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="nc"&gt;Metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"authorization"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ASCII_STRING_MARSHALLER&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;AuthorizationTokenSupplier&lt;/span&gt; &lt;span class="n"&gt;authorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;AuthorizationGrpcMetadataProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AuthorizationTokenSupplier&lt;/span&gt; &lt;span class="n"&gt;authorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authorizationTokenSupplier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;authorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@Override&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Metadata&lt;/span&gt; &lt;span class="nf"&gt;getMetadata&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Metadata&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Metadata&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;AUTHORIZATION_HEADER_KEY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;authorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;supply&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This metadata provider class for the GRPC connection to Temporal, will be the one we will use later when we configure our &lt;em&gt;WorkflowServiceStub&lt;/em&gt; in the Worker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;WorkflowServiceStubsOptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newBuilder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addGrpcMetadataProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;AuthorizationGrpcMetadataProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KuFlowAuthorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authenticationApi&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the last step to successfully connect to Temporal we need to create an SSL context that will be used in the negotiation with MutualTLS. For this, we need to extend the SslContext class of the SDK. The implementation depends on your needs but an example of it can be found in the following code snippet available in our example repositories on &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;SslContext&lt;/span&gt; &lt;span class="nf"&gt;createSslContext&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;MutualTlsProperties&lt;/span&gt; &lt;span class="n"&gt;mutualTls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applicationProperties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTemporal&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getMutualTls&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCert&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCertData&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCert&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKey&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCa&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;KuFlowEngineClientException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key and ca are required"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCertData&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKeyData&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCaData&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;KuFlowEngineClientException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"keyData or caData are required"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;InputStream&lt;/span&gt; &lt;span class="n"&gt;certInputStream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCert&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCertData&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="nc"&gt;InputStream&lt;/span&gt; &lt;span class="n"&gt;keyInputStream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKey&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKeyData&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="nc"&gt;InputStream&lt;/span&gt; &lt;span class="n"&gt;caInputStream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCa&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;mutualTls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCaData&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;KeyStore&lt;/span&gt; &lt;span class="n"&gt;trustStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;KeyStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KeyStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultType&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="n"&gt;trustStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;X509Certificate&lt;/span&gt; &lt;span class="n"&gt;certificate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;X509Certificate&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;CertificateFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"X509"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;generateCertificate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;caInputStream&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;trustStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCertificateEntry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"temporal-ca"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;certificate&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="nc"&gt;TrustManagerFactory&lt;/span&gt; &lt;span class="n"&gt;trustManagerFactory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TrustManagerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TrustManagerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultAlgorithm&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="n"&gt;trustManagerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trustStore&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;TrustManager&lt;/span&gt; &lt;span class="n"&gt;trustManager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trustManagerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTrustManagers&lt;/span&gt;&lt;span class="o"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;SimpleSslContextBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forPKCS8&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;certInputStream&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keyInputStream&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;setTrustManager&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trustManager&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KeyStoreException&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;NoSuchAlgorithmException&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;CertificateException&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;KuFlowEngineClientException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unable to configure mTLS"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, like the GRPC metadata provider, we add this SSL context to our WorkflowServiceStubs options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;WorkflowServiceStubs&lt;/span&gt; &lt;span class="nf"&gt;workflowServiceStubs&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Builder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WorkflowServiceStubsOptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newBuilder&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTarget&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applicationProperties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTemporal&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getTarget&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setSslContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createSslContext&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addGrpcMetadataProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;AuthorizationGrpcMetadataProvider&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KuFlowAuthorizationTokenSupplier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authenticationApi&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;WorkflowServiceStubsOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;validateAndBuildWithDefaults&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;WorkflowServiceStubs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newServiceStubs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point it is useful to remember that when configuring a Temporal-backed process in the KuFlow APP, it is possible to download a ready-to-use Worker template that uses these connection configuration mechanisms, so you have a working example just a few clicks away. Similarly, much more information and integration examples can be found in our &lt;a href="https://github.com/kuflow/kuflow-engine-samples-java"&gt;GitHub&lt;/a&gt; repository and in our &lt;a href="https://www.linguee.es/ingles-espanol/traduccion/documentation.html"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BfBzOQCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/40317ce3d962a9b8048641a62848418b/c71bf/process-definition.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BfBzOQCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/40317ce3d962a9b8048641a62848418b/c71bf/process-definition.webp" alt="process-definition" width="721" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Notes on the Temporal cloud deployed in KuFlow
&lt;/h3&gt;

&lt;p&gt;As discussed earlier in the article, the purpose of offering a Temporal deployment is to facilitate integration for our customers. At this point, it is important to highlight some issues: Our Temporal deployment is a slightly modified version of the one available in the official Temporal repositories. Basically, security and authorization modifications have been added. As a result, some API methods are not available. For example, you will not be able to use our Temporal deployment to execute Workflows that are not launched from KuFlow processes, which is necessary to avoid abuse. Or in the same way, it is also not possible to cancel Workflows if not from the KuFlow App. Other APIs may not be available, unlike a normal Temporal installation. However, all the APIs that guarantee the correct functioning of your workers are enabled. If you need any of the currently disabled APIs, you can request them by contacting us.&lt;/p&gt;

&lt;p&gt;Some other modifications made allow you, for example, to know from the App if there is any worker currently online for your process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M_W2aKfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/43d62bd91202afe7b0acdd999a85b830/d00b9/worker-status.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M_W2aKfu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/43d62bd91202afe7b0acdd999a85b830/d00b9/worker-status.webp" alt="worker-status" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the same way, we try to keep our Temporal deployments as up-to-date as possible, if you have any questions about this, please contact us.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article, we have superficially explored the use of Temporal as a workflow engine for our KuFlow processes. This solution provides us with a number of advantages over the other workflow engines we support, such as access to private services, allowing greater flexibility when implementing Worker. In the same way, the resilience and scalability offered by Temporal makes it the most recommendable option when the processes are highly complex and need to orchestrate different external APIs.The following table shows a summary of the main features of each of the supported Workflows Engine:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tN9HhTqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/1d3ae08f415b29020f6da1ecb8f3d431/d00b9/workflow-engine-matrix.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tN9HhTqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://kuflow.com/static/1d3ae08f415b29020f6da1ecb8f3d431/d00b9/workflow-engine-matrix.webp" alt="workflow-engine-matrix" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try &lt;strong&gt;KuFlow&lt;/strong&gt; for free, &lt;a href="http://app.kuflow.com/"&gt;creating your own free account&lt;/a&gt; and start automating your company.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published in &lt;a href="https://kuflow.com/blog/en/temporal-workflows/"&gt;KuFlow's Blog - How KuFlow supports Temporal as a worfkows engine for our processes?&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>temporal</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
