From d423c2c13687ef6a359e3bfdc0fb1d7dbf1034ae Mon Sep 17 00:00:00 2001 From: Nathan Lee Date: Thu, 24 Mar 2022 13:59:27 +1100 Subject: [PATCH 001/119] Update mule-high-availability-ha-clusters.adoc Clarified the persistent vs non persistent OS/transient vs persistent VM. Clarified what shared state actually is, as I think people reckon this will share everything and our terminology was wide open for misinterpretation. Also added information about Runtime fabric as well, as clustering is an option for that too. CloudHub does something else to get the same sort of capabilities. --- .../mule-high-availability-ha-clusters.adoc | 56 ++++++++++++------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 87270ca1a9..5dd69fb723 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -9,7 +9,13 @@ For an equivalent to clustering in CloudHub, see xref:runtime-manager::cloudhub- Mule Enterprise Edition supports scalable clustering to provide high availability (HA) for applications. -A cluster is a set of Mule runtime engines that acts as a unit. In other words, a cluster is a virtual server composed of multiple nodes (Mule runtime engines). The nodes in a cluster communicate and share information through a distributed shared memory grid. This means that the data is replicated across memory in different machines. +A cluster is a set of Mule runtime engines that acts as a unit. In other words, a cluster is a virtual server composed of multiple nodes (Mule runtime engines). The nodes in a cluster communicate and share Object Store and VM queue data through a distributed shared memory grid. This means that the data is replicated across memory in different machines. + +This shared memory grid, replicated state applies to: + +* persistent and non-persistent Object stores +* persistent and transient VM queues + image::cluster.png[] @@ -18,15 +24,15 @@ Contact your customer service representative about pricing for this feature. == The Benefits of Clustering -By default, clustering Mule runtime engines ensures high system availability. If a Mule runtime engine node becomes unavailable due to failure or planned downtime, another node in the cluster can assume the workload and continue to process existing events and messages. The following figure illustrates the processing of incoming messages by a cluster of two nodes. Notice that the processing load is balanced across nodes: Node 1 processes message 1 while Node 2 simultaneously processes message 2. +By default, clustering Mule runtime engines ensures high system availability. If a Mule runtime engine node becomes unavailable due to failure or planned downtime, another node in the cluster can assume the workload and continue to process messages from VM queues as well as continue to service other requests. The following figure illustrates the processing of incoming messages by a cluster of two nodes. Notice that the processing load is balanced across nodes: Node 1 processes message 1 while Node 2 simultaneously processes message 2. image::failovernofail.png[FailoverNoFail] -If one node fails, the other available nodes pick up the work of the failing node. As shown in the following figure, if Node 2 fails, Node 1 processes both message 1 and message 2. +If one node fails, the other available nodes pick up the work of the failing node. This would be via an external load balancer redirecting the share of traffic to the still active node, or via use of VM queues to enable the active nodes to continue to process in-flight messages. As shown in the following figure, if Node 2 fails, Node 1 processes both message 1 and message 2. image::failovernode2fail.png[FailoverNode2Fail] -Because all nodes in a cluster of Mule runtime engines process messages simultaneously, clusters can also improve performance and scalability. Compared to a single node instance, clusters can support more users or improve application performance by sharing the workload across multiple nodes or by adding nodes to the cluster. +Because all nodes in a cluster of Mule runtime engines are "active active" and can process messages simultaneously, clusters can also improve performance and scalability. Compared to a single node instance, clusters can support more users or improve application performance by sharing the workload across multiple nodes or by adding nodes to the cluster. Note that not all applications will perform better with horizontally scaling or clustering - as it depends on having work of a nature that can be shared with those additional nodes, and some applications with heavy dependency on Object Stores might suffer from the work to replicate/coordinate access to the data within the shared memory grid. The following figure illustrates workload sharing in more detail. Both nodes process messages related to order fulfillment. However, when one node is heavily loaded, it can move the processing for one or more steps in the process to another node. Here, processing of the Process order discount step is moved to Node 1, and processing of the Fulfill order step is moved to Node 2. @@ -42,7 +48,7 @@ If you divide your flows into a series of steps and connect these steps with a c You can set up an alert to appear when a node goes down and when a node comes back up. [NOTE] -All Mule runtime engines in a cluster actively process messages. Note that each Mule node is also internally scalable – a single node can scale by taking advantage of multiple cores. Mule operates as a single node in a cluster, even when it uses multiple cores. +All Mule runtime engines in a cluster actively process messages. Note that each Mule node is also vertically scalable – a single node can scale by taking advantage of multiple cores or additional memory. Mule operates as a single node in a cluster, even when it uses multiple cores. === Concurrency Issues Solved by Clusters @@ -55,20 +61,20 @@ All Mule instances access the same Mule file folders concurrently, which can lea All Mule instances get the same TCP requests and then process duplicate messages. * JMS topics. + -All Mule instances connect to the same JMS topic, which might lead to the repeated processing of messages when scaling the non-clustered Mule instance horizontally. +All Mule instances connect to the same JMS topic, which might lead to the repeated processing of messages when scaling the non-clustered Mule instance horizontally. To the JMS broker the instances appear as separate subscribers and will all get a copy of each message, which is rarely the required behavior. Although there is a "shared subscriber" configuration available which might also address this requirement to instruct the JMS broker to treat all instances as a combined subscriber and to give them each separate messages. * JMS request-reply/request-response. + All Mule instances are listening for messages in the same response queue. This implies that a Mule instance might obtain a response that isn't correlated to the request it sent and might result in incorrect responses or make a flow fail with timeout. -* Idempotent Redelivery Policy. + -Idempotency doesn’t work if the same request is received by different Mule instances. Duplicated messages aren’t possible. +* Idempotent Redelivery Policy and Idempotent Message Validation. + +Idempotency doesn’t work correctly with horizontal scaling if the same request is received by different Mule instances if the Object Store contents used by the Redelivery policy or the Idempotency Message Validator is localized. With the cluster sharing the Object Store values used by these idepotency features - duplicated messages aren’t possible because all nodes are sharing the list of already processed identifiers. * Salesforce streaming API. + If multiple instances of the same application are deployed, they will fail because the API only supports a single consumer. There is no failover support if the instance connected is stopped or crashes. == Prerequisites -* A cluster requires at least two Mule runtime engine instances, each one running on different machines. +* A cluster requires at least two Mule runtime engine instances, each one running on different machines (to avoid a single point of failure on the machine). * Mule high availability (HA) requires a reliable network connection between servers to maintain synchronization between the nodes in the cluster. * Keep the ports configured for the Mule cluster open. ** If you configure your cluster through Runtime Manager and you use the default ports, keep TCP ports `5701`, `5702`, and `5703` open. @@ -88,15 +94,19 @@ High Availability is a method of designing a computer system to prevent any down == Cluster Design and Management -Anypoint Runtime Manager enables you to set up a cluster of Mule instances, and then deploy an application to run on the cluster. You can also monitor the status information for clusters and individual nodes. When clustered, you can easily manage several servers as one. +Anypoint Runtime Manager enables you to set up a customer-hosted cluster of Mule instances, and then deploy an application to run on the cluster. You can also monitor the status information for clusters and individual nodes. When clustered, you can easily manage several servers as one. [NOTE] For more detailed information about cluster management, see xref:runtime-manager::managing-servers.adoc[Managing Servers] in Runtime Manager. +For Runtime Fabric an option exists at deployment time to provision the Mule runtime replicas in cluster mode. + A Mule Cluster consists of two or more Mule runtime engines, or nodes, grouped together and treated as a single unit. With the initial configuration, MuleSoft recommends that you scale a cluster to no more than eight Mule runtime engines. With Anypoint Runtime Manager, you can deploy, monitor, or stop all the Mule runtime engines in a cluster as if they were a single Mule runtime engine. +Note: CloudHub does not use this clustering configuration for provisioned workers, but it has other High Availability features to provide an equivalent experience, such as externalized state management via Anypoint Object Store (OSv2) or the persistent queues feature (which moves the VM queues external from the workers so they are shared and will survive re-provisioning). + All the nodes in a cluster share memory as illustrated below: image::topology-4-cluster.png[topology_4-cluster] @@ -105,7 +115,7 @@ Mule uses an active-active model to cluster Mule runtime engines. The benefit of === Primary Node Difference -In an active-active model, there is no primary node. However, one of the nodes acts as the primary polling node. This means that sources can be configured to only be used by the primary polling node so that no other node reads messages from that source. +In an active-active model, all nodes are able to perform processing. However, one of the nodes acts as the "primary node" which runs the schedulers and any event sources marked as "primary node only". This means that sources needing to run on just one node in a cluster can be configured to only be used by the primary polling node so that no other node reads messages from that source. This feature works differently depending on the source type: @@ -121,9 +131,11 @@ This feature works differently depending on the source type: ---- -== Queues +This example might be for a use case where the application is receiving messages from JMS where serial/single message at a time processing is critical. The default configuration of the JMS Connector's On New Message source has "primary node only" selected by default, but most connector sources do not have "primary node only" selected. The decision on the default configuration lies with the developers of the connector. For a use case where all nodes should perform processing the developer would de-select the primaryNodeOnly value so that all cluster nodes enable the source. + -You can set up a VM queue explicitly to load balance across Mule runtime engines (nodes). Thus, if your entire application flow contains a sequence of child flows, the cluster can assign each successive child flow to whichever Mule runtime engine happens to be available at the time. The cluster can potentially process a single message on multiple nodes as it passes through the VM endpoints in the application flow, as illustrated below: +== Queues +Execution of code and calling of flows via flow reference will happen on the same node that execution of the event began. But in order to share or distribute execution across clustered Mule runtimes you can set up and instead publish to a VM queue explicitly to load balance across nodes. Both persistent and transient VM Queues will use the shared memory grid of the cluster and any transition through a VM queue will potentially jump to another active node. Thus, if your entire application flow contains a sequence of child flows, linked via a publish/listener for a VM queue, the cluster can assign each successive child flow to whichever Mule runtime engine happens to be available at the time. The cluster can potentially process a single message on multiple nodes as it passes through the VM queues in the application flow, as illustrated below: image::load-balancing.png[load_balancing] @@ -141,6 +153,9 @@ Connectors such as JMS, VM, and JDBC provide built-in transactional support, thu You must use XA transactions to move messages between dissimilar connectors that support transactions. This ensures that the Mule runtime engine commits associated transactions from all the dissimilar connectors as a single unit. +[NOTE] +Transactions cannot span interactions or operations with systems that the connector does not support transactions, so if any of the involved operations cannot be included in the transaction an alternative pattern such as https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf[Sagas] would be an alternative. + == Cluster Support for Connectors All Mule connectors are supported within a cluster. Because of differences in the way different connectors access inbound traffic, the details of this support vary. In general, outbound traffic acts the same way inside and outside a cluster. Mule runtimes support three basic types of connectors: @@ -161,7 +176,7 @@ Listener-based connectors read data using a protocol that fully supports concurr Listener-based connectors are supported in clusters as described below: * Listener-based connectors fully support multiple readers and writers. No special considerations apply either to input or to output. -* Note that, in a cluster, VM connector queues are a shared, cluster-wide resource. The cluster will automatically synchronize access to the VM connector queues. Because of this, any cluster node can process a message written to a VM queue. This makes VM ideal for sharing work among cluster nodes. +* Note that, in a cluster, VM connector queues (both persistent and transient) are a shared, cluster-wide resource. The cluster will automatically synchronize access to the VM connector queues. Because of this, any cluster node can process a message written to a VM queue. This makes VM ideal for sharing work among cluster nodes. === Resource-based Connectors @@ -203,11 +218,11 @@ Ensuring that all cluster nodes reside on the same LAN is the best practice to l === Distributed Data-center Clustering -Linking cluster nodes through a WAN network introduces many possible points of failure, such as external routers and firewalls, which can prevent proper synchronization between cluster nodes. This not only affects performance but also requires you to plan for possible side effects in your app. For example, when two cluster nodes reconnect after getting cut off by a failed network link, the ensuing synchronization process can cause messages to be processed twice, which creates duplicates that must be handled in your application logic. +Linking cluster nodes through a WAN network introduces many possible points of failure, such as external routers and firewalls, which can prevent proper synchronization between cluster nodes. This not only affects performance but also requires you to plan for possible side effects in your app. For example, when two cluster nodes reconnect after getting cut off by a failed network link, the ensuing synchronization process can cause messages to be processed twice, which creates duplicates that must be handled in your application logic. It might also mean that applications using Object Store end up with inconsistent state due to lack of ability for communication between the nodes. Another issue which could occur is that multiple nodes become "primary" due to separate nodes believing they are the sole node in the cluster. Note that it is possible to use nodes of a cluster located in different data centers and not necessarily located on the same LAN, but some restrictions apply. -To prevent this behavior, it is necessary to enable the Quorum Protocol. This protocol is used to allow one set of nodes to continue processing data while other sets do nothing with the shared data until they reconnect. Basically, when a disconnection occurs, only the portion with the most nodes will continue to function. For instance, assume two data centers, one with three nodes and another with two nodes. If a connectivity problem occurs in the data center with two nodes, then the data center with three nodes will continue to function, and the second data center will not. If the three-node data center goes offline, none of your nodes will function. To prevent this outage, you must create the cluster in at least three data centers with the same number of nodes. It is unlikely for two data centers to crash, so if just one data center goes offline, the cluster will always be functional. +To prevent this "split brain" processing behavior, it is necessary to enable the Quorum Protocol. This protocol is used to allow one set of nodes to continue processing data while other sets do nothing with the shared data until they reconnect. Basically, when a disconnection occurs, only the portion with the most nodes will continue to function. For instance, assume two data centers, one with three nodes and another with two nodes. If a connectivity problem occurs in the data center with two nodes, then the data center with three nodes will continue to function, and the second data center will not. If the three-node data center goes offline, none of your nodes will function. To prevent this outage, you must create the cluster in at least three data centers with the same number of nodes. It is unlikely for two data centers to crash, so if just one data center goes offline or is separated from the others by a network fault, the cluster will always be functional. IMPORTANT: A cluster partition that does not have enough nodes to function will continue reacting to external system calls, but all operations over the object stores will fail, preventing data generation. @@ -224,18 +239,19 @@ IMPORTANT: A cluster partition that does not have enough nodes to function will == Clustering and Load Balancing -When Mule clusters are used to serve TCP requests (where TCP includes SSL/TLS, UDP, Multicast, HTTP, and HTTPS), some load balancing is needed to distribute the requests among the clustered instances. There are various software load balancers available, two of them are: +When Mule clusters are used to serve TCP requests (where TCP includes SSL/TLS, UDP, Multicast, HTTP, and HTTPS), some load balancing is needed to distribute the requests among the clustered instances. While Runtime Fabric includes a load balancer capability as part of the underlying docker/K8s infrastructure, for customer-hosted/manually provisioned clusters you will need to supply a 3rd party load balancer or perform some sort of client-side load balancing/fail-over. +There are various software load balancers available, two of them are: * NGINX, an open-source HTTP server and reverse proxy. You can use NGINX's `HttpUpstreamModule` for HTTP(S) load balancing. * The Apache web server, which can also be used as an HTTP(S) load balancer. -Many hardware load balancers can also route both TCP and HTTP or HTTPS traffic +Many hardware load balancers can also route both TCP and HTTP or HTTPS traffic. [[cluster-high-performance]] == Clustering for High Performance -This section applies only for on-premises deployments. High performance is implemented differently on CloudHub and Pivotal Cloud Foundry. + -See xref:runtime-manager::deployment-strategies.adoc[Deployment Strategies] for more information about each of these deployments. +This section applies only for customer-hosted, manually provisioned cluster deployments. + +See xref:runtime-manager::deployment-strategies.adoc[Deployment Strategies] for more information about other deployment options. If high performance is your primary goal (rather than reliability), you can configure a Mule cluster or an individual application for maximum performance using a performance profile. By implementing the performance profile for specific applications within a cluster, you can maximize the scalability of your deployments while deploying applications with different performance and reliability requirements in the same cluster. Performance profiles that you configure at the container level apply to all applications within the container. Application-level configuration overrides container-level configuration. From f965fb2fbb4d3ac99e296ef233ccd4988c40c07b Mon Sep 17 00:00:00 2001 From: Mariano Rean Date: Mon, 2 Oct 2023 18:13:25 -0300 Subject: [PATCH 002/119] W-14221636: Update Feature Flagging doc --- modules/ROOT/pages/feature-flagging.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/feature-flagging.adoc b/modules/ROOT/pages/feature-flagging.adoc index fadd231315..81710c6c58 100644 --- a/modules/ROOT/pages/feature-flagging.adoc +++ b/modules/ROOT/pages/feature-flagging.adoc @@ -119,7 +119,7 @@ The following table shows the available feature flags, a description of their fu *Enabled by Default Since* -* Not enabled by default in any Mule version. +* 4.4.0 *Issue ID* From 5411558bbaff7dabdada6b8e9ac10b5c215f1111 Mon Sep 17 00:00:00 2001 From: Nicu Parente Date: Thu, 5 Oct 2023 15:27:59 -0700 Subject: [PATCH 003/119] added 4.5 example. Removed unsupported sample --- modules/ROOT/pages/deploy-to-cloudhub.adoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploy-to-cloudhub.adoc b/modules/ROOT/pages/deploy-to-cloudhub.adoc index ea7dbe8ecd..c048395015 100644 --- a/modules/ROOT/pages/deploy-to-cloudhub.adoc +++ b/modules/ROOT/pages/deploy-to-cloudhub.adoc @@ -98,7 +98,10 @@ The following table shows the available parameters to configure the CloudHub dep If not set, by default this value is set to +https://anypoint.mulesoft.com+. | No | `muleVersion` | The Mule runtime engine version to run in your CloudHub instance. + Ensure that this value is equal to or higher than the earliest required Mule version of your application. + -Example values: `4.3.0`, `4.2.2-hf4` | Yes +Example value: `4.3.0` + + +Starting in 4.5, only the Major.Minor will be required for deployments to Cloud Hub. This will deploy the latest version of the Mule Runtime. +Example value: `4.5`| Yes | `username` | Your CloudHub username | Only when using Anypoint Platform credentials to login. | `password` | Your CloudHub password | Only when using Anypoint Platform credentials to login. | `applicationName` | The name of your application in CloudHub + From f735ca7fa1cde5429c7b4319c98b3548bd705d42 Mon Sep 17 00:00:00 2001 From: Nicu Parente Date: Thu, 5 Oct 2023 16:59:18 -0700 Subject: [PATCH 004/119] removed Cloud Hub spacing --- modules/ROOT/pages/deploy-to-cloudhub.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploy-to-cloudhub.adoc b/modules/ROOT/pages/deploy-to-cloudhub.adoc index c048395015..0633b073a8 100644 --- a/modules/ROOT/pages/deploy-to-cloudhub.adoc +++ b/modules/ROOT/pages/deploy-to-cloudhub.adoc @@ -100,7 +100,7 @@ If not set, by default this value is set to +https://anypoint.mulesoft.com+. | N Ensure that this value is equal to or higher than the earliest required Mule version of your application. + Example value: `4.3.0` + -Starting in 4.5, only the Major.Minor will be required for deployments to Cloud Hub. This will deploy the latest version of the Mule Runtime. +Starting in 4.5, only the Major.Minor will be required for deployments to CloudHub. This will deploy the latest version of the Mule Runtime. Example value: `4.5`| Yes | `username` | Your CloudHub username | Only when using Anypoint Platform credentials to login. | `password` | Your CloudHub password | Only when using Anypoint Platform credentials to login. From 937f8fa1c9e235ad57e88c2fe0e694768433669f Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:58:31 -0300 Subject: [PATCH 005/119] Update modules/ROOT/pages/deploy-to-cloudhub.adoc --- modules/ROOT/pages/deploy-to-cloudhub.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploy-to-cloudhub.adoc b/modules/ROOT/pages/deploy-to-cloudhub.adoc index 0633b073a8..0cd259491b 100644 --- a/modules/ROOT/pages/deploy-to-cloudhub.adoc +++ b/modules/ROOT/pages/deploy-to-cloudhub.adoc @@ -100,7 +100,7 @@ If not set, by default this value is set to +https://anypoint.mulesoft.com+. | N Ensure that this value is equal to or higher than the earliest required Mule version of your application. + Example value: `4.3.0` + -Starting in 4.5, only the Major.Minor will be required for deployments to CloudHub. This will deploy the latest version of the Mule Runtime. +Starting with Mule 4.5, deployments to CloudHub require Major.Minor version which deploys the latest version of Mule runtime. Example value: `4.5`| Yes | `username` | Your CloudHub username | Only when using Anypoint Platform credentials to login. | `password` | Your CloudHub password | Only when using Anypoint Platform credentials to login. From c93f9d8001a6a4ba713e3c124cde0775b4f252b1 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Fri, 6 Oct 2023 14:06:01 -0300 Subject: [PATCH 006/119] Update modules/ROOT/pages/deploy-to-cloudhub.adoc --- modules/ROOT/pages/deploy-to-cloudhub.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploy-to-cloudhub.adoc b/modules/ROOT/pages/deploy-to-cloudhub.adoc index 0cd259491b..9e0c395eb3 100644 --- a/modules/ROOT/pages/deploy-to-cloudhub.adoc +++ b/modules/ROOT/pages/deploy-to-cloudhub.adoc @@ -100,7 +100,7 @@ If not set, by default this value is set to +https://anypoint.mulesoft.com+. | N Ensure that this value is equal to or higher than the earliest required Mule version of your application. + Example value: `4.3.0` + -Starting with Mule 4.5, deployments to CloudHub require Major.Minor version which deploys the latest version of Mule runtime. +Starting with Mule 4.5, deployments to CloudHub require Major.Minor version, which deploys the latest version of Mule runtime. Example value: `4.5`| Yes | `username` | Your CloudHub username | Only when using Anypoint Platform credentials to login. | `password` | Your CloudHub password | Only when using Anypoint Platform credentials to login. From 89772f367ec03943e5aac1297156787d78784fcc Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 9 Nov 2023 16:36:46 -0300 Subject: [PATCH 007/119] W-14464537-RewordConfigurableProperties-4.4-dm --- modules/ROOT/pages/for-each-scope-concept.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/for-each-scope-concept.adoc b/modules/ROOT/pages/for-each-scope-concept.adoc index 1236ac7a9f..22f0c66d39 100644 --- a/modules/ROOT/pages/for-each-scope-concept.adoc +++ b/modules/ROOT/pages/for-each-scope-concept.adoc @@ -102,11 +102,11 @@ To download and open an example project while you are in Anypoint Studio, click For Each scopes open and close with a `` tag. Components that are affected by this scope are defined as child elements of the `` tag. -=== Configurable Properties +=== Configurable Variables [%header,cols="35,20,45"] |=== -|Property | Default | Description +|Variable | Default | Description | `collection` | `payload` | An expression that returns a Java collection, object array, map, or DOM @@ -114,7 +114,7 @@ For Each scopes open and close with a `` tag. Components that are affec | `counterVariableName` | `counter` -| Name of the property that stores the number of messages over which it iterates. +| Name of the variable that stores the number of messages over which it iterates. | `batchSize` | `1` @@ -123,7 +123,7 @@ For Each scopes open and close with a `` tag. Components that are affec | `rootMessageVariableName` | `rootMessage` -| Name of the property that stores the parent message. The parent is the complete, non-split message. +| Name of the variable that stores the parent message. The parent is the complete, non-split message. |=== From 628cd10cb42372f491aa7dd2b03134dfd91d85c4 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 15 Nov 2023 16:06:11 -0300 Subject: [PATCH 008/119] W-14186831-updateHotDeploy-dm --- modules/ROOT/pages/deploy-on-premises.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploy-on-premises.adoc b/modules/ROOT/pages/deploy-on-premises.adoc index 7eff59c299..be40961448 100644 --- a/modules/ROOT/pages/deploy-on-premises.adoc +++ b/modules/ROOT/pages/deploy-on-premises.adoc @@ -334,7 +334,8 @@ Updating a Mule application at runtime can be a complex change involving class m There are two ways you can update an application: -* By adding the modifications over an existing unpacked app folder and touching the main configuration file (`mule-config.xml` located in the app's root directory by default). +* By adding the modifications over an existing unpacked app folder and touching the main configuration file (`mule-config.xml` located in the app's root directory by default). + +For this option to be valid, start the runtime with the system property `-M-Dmule.deployment.forceParseConfigXmls=true`. * By adding a new `jar` with an updated version of the app into the `$MULE_HOME/apps` directory. Mule detects the `jar` as an updated version of an existing application and ensures the update by a clean redeployment of the app. + Note that Mule discards any modifications to the old application folder. The new app folder is a clean unpacked application from a `jar`. From a2b9e64e1051687f92c1f7769bd6dc4d1e3f8773 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 22 Nov 2023 17:47:12 -0300 Subject: [PATCH 009/119] W-14544465-fixStudioLink-44-dm --- modules/ROOT/pages/flow-component.adoc | 4 ++-- modules/ROOT/pages/intro-java-integration.adoc | 2 +- modules/ROOT/pages/migration-module-vm.adoc | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/flow-component.adoc b/modules/ROOT/pages/flow-component.adoc index 57c02d9093..dd937a7d4c 100644 --- a/modules/ROOT/pages/flow-component.adoc +++ b/modules/ROOT/pages/flow-component.adoc @@ -51,7 +51,7 @@ Set `maxConcurrency` to `1` to cause the flow to process requests one at a time. See xref:execution-engine.adoc#backpressure[Back-pressure] for details about Mule's behavior after the the maximum concurrency value is reached. | Business Events a| Optional: Defaults to `false`. For Mule apps that you deploy to CloudHub, you can enable business events (XML example: `tracking:enable-default-event="true"`) and add a Transaction ID (XML example: `). See xref::business-events.adoc[Business Events]. -| Metadata | As with many other components, you can set metadata for this component. For more on this topic, see the Studio document xref:7.1@studio::metadata-editor-concept.adoc[Metadata Editor]. +| Metadata | As with many other components, you can set metadata for this component. For more on this topic, see the Studio document xref:studio::metadata-editor-concept.adoc[Metadata Editor]. |=== == Subflow Configuration @@ -62,7 +62,7 @@ Subflow scopes provide a way to edit the name of the subflow and to add metadata |=== | Field | Description | Name (`name`) | Name for the subflow. Subflows automatically receive an editable name that matches (or partially matches) the project name. -| Metadata | As with many other components, you can set up metadata for this component. For more on this topic, see the Studio document xref:7.1@studio::metadata-editor-concept.adoc[Metadata Editor]. +| Metadata | As with many other components, you can set up metadata for this component. For more on this topic, see the Studio document xref:studio::metadata-editor-concept.adoc[Metadata Editor]. |=== == XML for Flows and Subflows diff --git a/modules/ROOT/pages/intro-java-integration.adoc b/modules/ROOT/pages/intro-java-integration.adoc index 76bd444709..fb64eaafcd 100644 --- a/modules/ROOT/pages/intro-java-integration.adoc +++ b/modules/ROOT/pages/intro-java-integration.adoc @@ -66,7 +66,7 @@ For more detail on this module, see xref:connectors::scripting/scripting-module. While the Scripting module is a very powerful tool that allows for interoperation with Java by executing any random set of instructions, often you simply need to just instantiate a class or execute a single method. While Mule 3 usually relies on MEL for this, the Java module was introduced in Mule 4 to allow for these use cases. Other advantages of the Java module over the Scripting module are: -* Support for xref:7.1@studio::datasense-explorer.adoc[DataSense]: Each time you execute a method, you will get DataSense for the output type and the method's input arguments. +* Support for xref:studio::datasense-explorer.adoc[DataSense]: Each time you execute a method, you will get DataSense for the output type and the method's input arguments. * UI Support: You get visual aids in terms of methods available for each class, autocompletion, and so on. === Create a New Java Instance diff --git a/modules/ROOT/pages/migration-module-vm.adoc b/modules/ROOT/pages/migration-module-vm.adoc index 8b21f68bdd..8c5ffa0cd6 100644 --- a/modules/ROOT/pages/migration-module-vm.adoc +++ b/modules/ROOT/pages/migration-module-vm.adoc @@ -6,7 +6,7 @@ endif::[] The VM transport was completely rewritten. It evolved away from the Mule 3 transport model into an operation-based connector. This enables many new capabilities: * The ability to consume messages from a queue on demand, unlike the old transport, which only provided a polling inbound endpoint. -* Enhanced xref:7.1@studio::datasense-explorer.adoc[DataSense]. +* Enhanced xref:studio::datasense-explorer.adoc[DataSense]. [[whats_covered_here]] == What's Covered Here? From cda0c0d17e972fe3cbc657707a7af5acb2be1995 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 12 Dec 2023 13:06:03 -0300 Subject: [PATCH 010/119] W-14616560-object-store-note-44-dm --- .../ROOT/pages/creating-and-managing-a-cluster-manually.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc b/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc index 5faa5da9fe..2a079c7fb5 100644 --- a/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc +++ b/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc @@ -87,6 +87,11 @@ Quorum feature is only valid for components that use Object Store. === Object Store Persistence +[NOTE] +-- +Ensure you set up a centralized JDBC store for the cluster object store persistence. Otherwise, shutting down all cluster nodes causes the content of object stores to be lost, no matter if the persistent setting is enabled on the object store configuration. +-- + You can persistently store JDBC data in a central system that is accessible by all cluster nodes when using Mule runtime engine on-premises. The following relational database systems are supported: From 1dd126a877062322cbf1dc9ed0699e741f75cd7a Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 12 Dec 2023 17:27:29 -0300 Subject: [PATCH 011/119] W-10622084-add-XAconfiguration-references-44-dm --- modules/ROOT/pages/xa-transactions.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/xa-transactions.adoc b/modules/ROOT/pages/xa-transactions.adoc index 53bd246919..2348428511 100644 --- a/modules/ROOT/pages/xa-transactions.adoc +++ b/modules/ROOT/pages/xa-transactions.adoc @@ -23,10 +23,10 @@ A global XA transaction is a reliable way of coordinating multiple XA resources, To configure the event sources that support XA transactions, please check out the Connectors documentation: -* JMS -* IBMMQ -* VM -* Database +* xref:jms-connector::jms-connector-reference.adoc#parameters-7[JMS] +* xref:ibm-mq-connector::ibm-mq-transactions.adoc#xa-transactions[IBMMQ] +* xref:vm-connector::vm-reference.adoc#parameters-6[VM] +* xref:db-connector::database-connector-xa-transactions.adoc[Database] == Configuring a Try Scope to use XA Transactions From 288999fb2aed945659e0453bdb3c5b62d8c2e1ad Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 22 Dec 2023 11:08:52 -0300 Subject: [PATCH 012/119] W-14689200-missingProperty-RTFdeploy-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc index 922e679d96..087919a2ff 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc @@ -299,6 +299,8 @@ Configuration example: | `generateDefaultPublicUrl` | When this parameter is set to true, Runtime Fabric generates a public URL for the deployed application. +| `disableAmLogForwarding` | Disables application logs forwarding to Anypoint Monitoring. By default, it is set to `false`. + |=== // end::rtfDeploymentSettingsReference[] From e4faec4307abac25efbc388200d83389bf24f368 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 22 Dec 2023 17:59:55 -0300 Subject: [PATCH 013/119] apply review --- modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc index 087919a2ff..114a67ae34 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc @@ -299,7 +299,7 @@ Configuration example: | `generateDefaultPublicUrl` | When this parameter is set to true, Runtime Fabric generates a public URL for the deployed application. -| `disableAmLogForwarding` | Disables application logs forwarding to Anypoint Monitoring. By default, it is set to `false`. +| `disableAmLogForwarding` | Disables the application-level log forwarding to Anypoint Monitoring. By default, it is set to `false`. |=== // end::rtfDeploymentSettingsReference[] From 6340b7ac84920d5ef9cb04c09278053e1d53efc6 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 26 Dec 2023 13:09:41 -0300 Subject: [PATCH 014/119] W-14712504-add-pathRewrite-4.4-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 050ff8b41f..9fa8e67c5b 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -194,6 +194,8 @@ Configuration example: ---- | No +| `pathRewrite` | Supplies the base path expected by the HTTP listener in your application. This value must begin with `/`. This parameter is used only for applications that are deployed to xref:cloudhub-2::ch2-private-space-about.adoc[private space]. | No + |=== // end::DeploymentReference[] From a3fbed561b489c5d2a247be50c2f94b0f4c0eeed Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 26 Dec 2023 17:11:12 -0300 Subject: [PATCH 015/119] W-14719421-updateOverviewTopic-44-dm --- modules/ROOT/nav.adoc | 4 ++-- modules/ROOT/pages/index.adoc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 50f66d42de..2b95581e36 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -1,6 +1,6 @@ -.xref:index.adoc[Mule Overview] +.xref:index.adoc[Mule Runtime] * xref:whats-new-in-mule.adoc[What's New in Mule] -* xref:index.adoc[Mule Overview] +* xref:index.adoc[Overview] ** xref:mule-components.adoc[Mule Components] ** xref:about-flows.adoc[Flows and Subflows] ** xref:about-mule-configuration.adoc[Mule Configuration File] diff --git a/modules/ROOT/pages/index.adoc b/modules/ROOT/pages/index.adoc index 62027504c0..0cbe1fcc29 100644 --- a/modules/ROOT/pages/index.adoc +++ b/modules/ROOT/pages/index.adoc @@ -1,4 +1,4 @@ -= Mule Overview += Mule Runtime Engine Overview ifndef::env-site,env-github[] include::_attributes.adoc[] endif::[] From f95ad718ced42a2376bfdcd599381dcecb46dc4d Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 29 Dec 2023 15:19:48 -0300 Subject: [PATCH 016/119] W-14722215-UpgradeTool-comment-44-dm --- modules/ROOT/pages/mule-upgrade-tool.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-upgrade-tool.adoc b/modules/ROOT/pages/mule-upgrade-tool.adoc index 55c340cf34..dddd51a350 100644 --- a/modules/ROOT/pages/mule-upgrade-tool.adoc +++ b/modules/ROOT/pages/mule-upgrade-tool.adoc @@ -2,7 +2,7 @@ include::release-notes::partial$mule-upgrade-tool/mule-upgrade-tool-1.1.0.adoc[tag=intro] -If the Runtime Manager agent is installed in your current Mule instance, the upgrade tool also updates the agent version as part of the upgrade process. +If the Runtime Manager agent is installed in your current Mule instance, the upgrade tool also updates the agent version as part of the upgrade process. This process requires you to reinstall the Anypoint Monitoring agent. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. The Mule upgrade tool supports upgrading clustered Mule instances by manually upgrading each node using the tool. For additional information on how to proceed with the upgrade, see <>. Though highly recommended, using the tool is not strictly necessary to upgrade your current Mule instance. For a completely manual upgrade, see xref:release-notes::mule-runtime/updating-mule-4-versions.adoc#mulerunvers[Upgrading an On-Premises Mule Instance Managed Through Runtime Manager]. From 744dc00ae942c7767711a310443e8c65f8a3c10f Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 3 Jan 2024 13:59:04 -0300 Subject: [PATCH 017/119] w-14722215-applying comments --- modules/ROOT/pages/mule-upgrade-tool.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-upgrade-tool.adoc b/modules/ROOT/pages/mule-upgrade-tool.adoc index dddd51a350..a31c52c910 100644 --- a/modules/ROOT/pages/mule-upgrade-tool.adoc +++ b/modules/ROOT/pages/mule-upgrade-tool.adoc @@ -2,7 +2,9 @@ include::release-notes::partial$mule-upgrade-tool/mule-upgrade-tool-1.1.0.adoc[tag=intro] -If the Runtime Manager agent is installed in your current Mule instance, the upgrade tool also updates the agent version as part of the upgrade process. This process requires you to reinstall the Anypoint Monitoring agent. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. +If the Runtime Manager agent is installed in your current Mule instance, the upgrade tool also updates the agent version as part of the upgrade process. + +After successfully upgrading your Mule instance, if the Anypoint Monitoring agent is installed in the Mule instance that is upgraded, reinstall the agent as the update of the agent is not supported. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. The Mule upgrade tool supports upgrading clustered Mule instances by manually upgrading each node using the tool. For additional information on how to proceed with the upgrade, see <>. Though highly recommended, using the tool is not strictly necessary to upgrade your current Mule instance. For a completely manual upgrade, see xref:release-notes::mule-runtime/updating-mule-4-versions.adoc#mulerunvers[Upgrading an On-Premises Mule Instance Managed Through Runtime Manager]. From 50447c1eb340bdadf7e14d8ec82dd7226748bdc8 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 22 Jan 2024 15:36:10 -0300 Subject: [PATCH 018/119] W-14848493-Update-tls-configuration44-dm --- modules/ROOT/pages/tls-configuration.adoc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/tls-configuration.adoc b/modules/ROOT/pages/tls-configuration.adoc index 6b88b3144a..848abfe469 100644 --- a/modules/ROOT/pages/tls-configuration.adoc +++ b/modules/ROOT/pages/tls-configuration.adoc @@ -66,7 +66,20 @@ The keystore contains one or two passwords: == Client Configuration -If the `tls:context` is empty (no `tls:key-store` or `tls:trust-store` defined), then the default values of the JVM are used, which usually include a truststore with certificates for all the major certifying authorities. +If the `tls:context` has an empty truststore defined, then the default values of the JVM are used, which usually include a truststore with certificates for all the major certifying authorities. Consider the following scenarios: + +* When the truststore is defined inline: +---- + + + +---- +* When the truststore is defined with a global element: +---- + + + +---- If the client requires a certificate from the server that it is trying to connect to, then add the `tls:trust-store` element. Set `path` to the location of the truststore file that contains the certificates of the trusted servers. From f2e7d5621585de5fcfc4d4c5501c07797659cb8d Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Tue, 27 Feb 2024 14:36:01 -0300 Subject: [PATCH 019/119] W-15081432-UpdateCODEOWNERS-44-dm --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 85041e3ebe..fa2954fd2e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,2 @@ #GUSINFO:MS CX Engineering,MS CX (DOCS) -* @dukesphere @mulesoft/team-docs +* @dmerlob @mulesoft/team-docs From a531f19e9f6a79b5908574df02d98eac6c8b3997 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 1 Mar 2024 16:55:58 -0300 Subject: [PATCH 020/119] W-15153418-MMPpackagingTag-44-dm --- modules/ROOT/pages/using-maven-with-mule.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/using-maven-with-mule.adoc b/modules/ROOT/pages/using-maven-with-mule.adoc index 5721e084f8..9ad97ddac2 100644 --- a/modules/ROOT/pages/using-maven-with-mule.adoc +++ b/modules/ROOT/pages/using-maven-with-mule.adoc @@ -39,6 +39,8 @@ Anypoint Studio's built-in Maven support minimizes the chances that you would ha * Update your POM file and `settings.xml` when necessary. + +When updating your POM file, the `` tag is mandatory. Depending on the type of project you are creating, valid values for this tag are `mule-application`, `mule-domain`, `mule-policy`, and `mule-domain-bundle`. For example, if you create a Mule project using Anypoint Studio, the tag is automatically configured as `mule-application`. ++ If you create Maven projects from the command line using archetypes, you need to manage your POM file manually, and in some cases, adjust your `settings.xml` file to point to the MuleSoft Enterprise repository and supply credentials. In some cases, even if you manage your project with Anypoint Studio, you may need to make manual adjustments to your POM as well. * Use SNAPSHOT version. From 9bd5bb5f568e12374424376c801543b79f284706 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 11 Mar 2024 17:35:54 -0300 Subject: [PATCH 021/119] W-15228052-RTF-CH2notSupportMDC-44-dm --- modules/ROOT/pages/logging-mdc.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/ROOT/pages/logging-mdc.adoc b/modules/ROOT/pages/logging-mdc.adoc index 0bc4cb1a44..469634605b 100644 --- a/modules/ROOT/pages/logging-mdc.adoc +++ b/modules/ROOT/pages/logging-mdc.adoc @@ -17,6 +17,9 @@ To use the MDC Logging operations, complete the following tasks: * Install the Mule Tracing module in your application. * Change the pattern layouts in the `log4j2.xml` file to `MDC`. +[NOTE] +If you are using Anypoint Runtime Fabric or CloudHub 2.0 to deploy your Mule applications, MDC logging isn't supported. + == Install the Mule Tracing Module Follow the next steps to install the Mule Tracing module in your application. From ce49da5e4672f649f0a2156fef0ff7256e92e550 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 13 Mar 2024 13:15:27 -0300 Subject: [PATCH 022/119] W-13623896-MMPch1-paramAvailability-dm --- modules/ROOT/pages/deploy-to-cloudhub.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploy-to-cloudhub.adoc b/modules/ROOT/pages/deploy-to-cloudhub.adoc index 9e0c395eb3..907b5b4a46 100644 --- a/modules/ROOT/pages/deploy-to-cloudhub.adoc +++ b/modules/ROOT/pages/deploy-to-cloudhub.adoc @@ -159,7 +159,8 @@ include::mule-runtime::partial$mmp-concept.adoc[tag=connectedAppsParameterDescri | `applyLatestRuntimePatch` | When set to `true`, the plugin instructs CloudHub to update the worker to the latest available patch for the Mule runtime engine version specified in the deployment configuration, and then deploys the application. + By default, it is set to `false`. | No | `disableCloudHubLogs` | When set to `true`, the plugin instructs CloudHub to disable CloudHub logging and instead use the application configured in the `log4j2.xml` file. + -By default, it is set to `false`. | No +By default, it is set to `false`. + +This parameter is available in plugin version 3.8.1 and later. | No |=== == Encrypt Credentials From 28ae4be41e5dd36343ddccfd020774597e7aee98 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 13 Mar 2024 13:58:01 -0300 Subject: [PATCH 023/119] W-12764411-publicURLparameter-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 9fa8e67c5b..a7f01d20ca 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -252,7 +252,7 @@ Configuration example: !=== .3+! `inbound` // ! `pathRewrite` ! TBC. - ! `publicURL` ! URL of the deployed application. + ! `publicURL` ! URL of the deployed application. You can add multiple comma-separated values. ! `lastMileSecurity` ! Enable Last-Mile security to forward HTTPS connections to be decrypted by this application. This requires an SSL certificate to be included in the Mule application, and also requires more CPU resources. The default value is `false`. ! `forwardSslSession` ! Enables SSL forwarding during a session. The default value is `false`. !=== From e5d9bdec031ebf057bf56e438459fdc219f1377d Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:35:41 -0300 Subject: [PATCH 024/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 5dd69fb723..62f41f220f 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -24,7 +24,7 @@ Contact your customer service representative about pricing for this feature. == The Benefits of Clustering -By default, clustering Mule runtime engines ensures high system availability. If a Mule runtime engine node becomes unavailable due to failure or planned downtime, another node in the cluster can assume the workload and continue to process messages from VM queues as well as continue to service other requests. The following figure illustrates the processing of incoming messages by a cluster of two nodes. Notice that the processing load is balanced across nodes: Node 1 processes message 1 while Node 2 simultaneously processes message 2. +By default, clustering Mule runtime engines ensures high system availability. If a Mule runtime engine node becomes unavailable due to failure or planned downtime, another node in the cluster can assume the workload and continue to process messages from VM queues and to service other requests. The following figure illustrates the processing of incoming messages by a cluster of two nodes. Notice that the processing load is balanced across nodes: Node 1 processes message 1 while Node 2 simultaneously processes message 2. image::failovernofail.png[FailoverNoFail] From f9c47944eac64a94bc0451d8b4b4d6020a390e54 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:35:58 -0300 Subject: [PATCH 025/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 62f41f220f..25a25eba77 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -28,7 +28,7 @@ By default, clustering Mule runtime engines ensures high system availability. If image::failovernofail.png[FailoverNoFail] -If one node fails, the other available nodes pick up the work of the failing node. This would be via an external load balancer redirecting the share of traffic to the still active node, or via use of VM queues to enable the active nodes to continue to process in-flight messages. As shown in the following figure, if Node 2 fails, Node 1 processes both message 1 and message 2. +If one node fails, the other available nodes pick up the work of the failing node. An external load balancer redirects the failing node's share of traffic to an active node, or through VM queues to enable the active nodes to continue to process in-flight messages. As shown in the following figure, if Node 2 fails, Node 1 processes both message 1 and message 2. image::failovernode2fail.png[FailoverNode2Fail] From d2d3ac139c7ab3120522eeebd630f9b6b89a67cb Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:40:58 -0300 Subject: [PATCH 026/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 25a25eba77..8f0d75cd03 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -67,7 +67,7 @@ All Mule instances connect to the same JMS topic, which might lead to the repeat All Mule instances are listening for messages in the same response queue. This implies that a Mule instance might obtain a response that isn't correlated to the request it sent and might result in incorrect responses or make a flow fail with timeout. * Idempotent Redelivery Policy and Idempotent Message Validation. + -Idempotency doesn’t work correctly with horizontal scaling if the same request is received by different Mule instances if the Object Store contents used by the Redelivery policy or the Idempotency Message Validator is localized. With the cluster sharing the Object Store values used by these idepotency features - duplicated messages aren’t possible because all nodes are sharing the list of already processed identifiers. +Idempotency doesn’t work correctly with horizontal scaling if the same request is received by different Mule instances and the Object Store contents used by the Redelivery policy or the Idempotency Message Validator is localized. For a cluster sharing Object Store values used by these idempotency features, duplicate messages aren’t possible because all nodes are sharing the list of already-processed identifiers. * Salesforce streaming API. + If multiple instances of the same application are deployed, they will fail because the API only supports a single consumer. There is no failover support if the instance connected is stopped or crashes. From 8c6500d05ff0ffd7e654a980fd54f63b91a9f949 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:41:16 -0300 Subject: [PATCH 027/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 8f0d75cd03..95fa6d86c3 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -74,7 +74,7 @@ If multiple instances of the same application are deployed, they will fail becau == Prerequisites -* A cluster requires at least two Mule runtime engine instances, each one running on different machines (to avoid a single point of failure on the machine). +* A cluster requires at least two Mule runtime engine instances, each one running on different machines to avoid a single point of failure on the machine. * Mule high availability (HA) requires a reliable network connection between servers to maintain synchronization between the nodes in the cluster. * Keep the ports configured for the Mule cluster open. ** If you configure your cluster through Runtime Manager and you use the default ports, keep TCP ports `5701`, `5702`, and `5703` open. From 5cb505f2f4c7ba60feefd57102950433a268a8e3 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:41:34 -0300 Subject: [PATCH 028/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 95fa6d86c3..3fafad01ef 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -99,7 +99,7 @@ Anypoint Runtime Manager enables you to set up a customer-hosted cluster of Mule [NOTE] For more detailed information about cluster management, see xref:runtime-manager::managing-servers.adoc[Managing Servers] in Runtime Manager. -For Runtime Fabric an option exists at deployment time to provision the Mule runtime replicas in cluster mode. +For Anypoint Runtime Fabric, an option exists at deployment time to provision the Mule runtime replicas in cluster mode. A Mule Cluster consists of two or more Mule runtime engines, or nodes, grouped together and treated as a single unit. With the initial configuration, MuleSoft recommends that you scale a cluster to no more than eight Mule runtime engines. From 19c89637c4c54013126cd077f0d423d9c92e66e4 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:42:02 -0300 Subject: [PATCH 029/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 3fafad01ef..aa172717cb 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -239,7 +239,7 @@ IMPORTANT: A cluster partition that does not have enough nodes to function will == Clustering and Load Balancing -When Mule clusters are used to serve TCP requests (where TCP includes SSL/TLS, UDP, Multicast, HTTP, and HTTPS), some load balancing is needed to distribute the requests among the clustered instances. While Runtime Fabric includes a load balancer capability as part of the underlying docker/K8s infrastructure, for customer-hosted/manually provisioned clusters you will need to supply a 3rd party load balancer or perform some sort of client-side load balancing/fail-over. +When Mule clusters are used to serve TCP requests (where TCP includes SSL/TLS, UDP, Multicast, HTTP, and HTTPS), some load balancing is needed to distribute the requests among the clustered instances. Though Anypoint Runtime Fabric includes load-balancer capability as part of the underlying Docker Kubernetes (K8s) infrastructure, customer-hosted, manually-provisioned clusters require you to supply a third party load balancer or perform client-side load balancing and fail-over. There are various software load balancers available, two of them are: * NGINX, an open-source HTTP server and reverse proxy. You can use NGINX's `HttpUpstreamModule` for HTTP(S) load balancing. From f4734292cfeaa64c6514241bcbc2002673f98bac Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 17:44:30 -0300 Subject: [PATCH 030/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index aa172717cb..f70e5d51a2 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -115,7 +115,7 @@ Mule uses an active-active model to cluster Mule runtime engines. The benefit of === Primary Node Difference -In an active-active model, all nodes are able to perform processing. However, one of the nodes acts as the "primary node" which runs the schedulers and any event sources marked as "primary node only". This means that sources needing to run on just one node in a cluster can be configured to only be used by the primary polling node so that no other node reads messages from that source. +In an active-active model, all nodes are able to perform processing. However, one of the nodes acts as the primary node, which runs the schedulers and any event sources marked as "primary node only". This model enables you to configure sources to run on a single, primary polling node in a cluster and prevent other nodes in the cluster from reading messages from those sources. This feature works differently depending on the source type: From 9cfaa2a0939641d93cb970d15b0712ef7d69eab4 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Mar 2024 18:51:51 -0300 Subject: [PATCH 031/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index a250b81f62..3fbaefe961 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -15,6 +15,7 @@ This shared memory grid, replicated state applies to: * persistent and non-persistent Object stores * persistent and transient VM queues +* Mule runtime LockFactory image::cluster.png[Cluster] From 3707e5bd4ed8c9f03fd0e7da8f09fbc0d31ad289 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:26:46 -0300 Subject: [PATCH 032/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 3fbaefe961..6db09038d2 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -62,7 +62,7 @@ All Mule instances access the same Mule file folders concurrently, which can lea All Mule instances get the same TCP requests and then process duplicate messages. * JMS topics. + -All Mule instances connect to the same JMS topic, which might lead to the repeated processing of messages when scaling the non-clustered Mule instance horizontally. To the JMS broker the instances appear as separate subscribers and will all get a copy of each message, which is rarely the required behavior. Although there is a "shared subscriber" configuration available which might also address this requirement to instruct the JMS broker to treat all instances as a combined subscriber and to give them each separate messages. +All Mule instances connect to the same JMS topic, which might lead to the repeated processing of messages when scaling the non-clustered Mule instance horizontally. To the JMS broker, the instances appear as separate subscribers, all of which get a copy of each message. This behavior is rarely required, but a "shared subscriber" configuration is available to instruct the JMS broker to treat all instances as a combined subscriber and to give them each separate messages. * JMS request-reply/request-response. + All Mule instances are listening for messages in the same response queue. This implies that a Mule instance might obtain a response that isn't correlated to the request it sent and might result in incorrect responses or make a flow fail with timeout. From ff3dd3128f9daa64f4b8491e6c00faad16206a01 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:27:41 -0300 Subject: [PATCH 033/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc Co-authored-by: Duke --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 6db09038d2..d216ce863d 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -33,7 +33,7 @@ If one node fails, the other available nodes pick up the work of the failing nod image::failovernode2fail.png[FailoverNode2Fail] -Because all nodes in a cluster of Mule runtime engines are "active active" and can process messages simultaneously, clusters can also improve performance and scalability. Compared to a single node instance, clusters can support more users or improve application performance by sharing the workload across multiple nodes or by adding nodes to the cluster. Note that not all applications will perform better with horizontally scaling or clustering - as it depends on having work of a nature that can be shared with those additional nodes, and some applications with heavy dependency on Object Stores might suffer from the work to replicate/coordinate access to the data within the shared memory grid. +Because all nodes in a cluster of Mule runtime engines are "active active" and can process messages simultaneously, clusters can also improve performance and scalability. Compared to a single node instance, clusters can support more users or improve application performance by sharing the workload across multiple nodes or by adding nodes to the cluster. Note that not all applications perform better when horizontally scaling or clustering. Performance depends on the nature of the work to be shared with additional nodes. Performance of some applications with a heavy dependency on Object Stores can degrade because of the work required to replicate or coordinate access to the data within the shared memory grid. The following figure illustrates workload sharing in more detail. Both nodes process messages related to order fulfillment. However, when one node is heavily loaded, it can move the processing for one or more steps in the process to another node. Here, processing of the Process order discount step is moved to Node 1, and processing of the Fulfill order step is moved to Node 2. From 364ed13e93c506c071681ca4ca5c6a3680770384 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:44:09 -0300 Subject: [PATCH 034/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index d216ce863d..4b3c997245 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -106,7 +106,7 @@ A Mule Cluster consists of two or more Mule runtime engines, or nodes, grouped t With Anypoint Runtime Manager, you can deploy, monitor, or stop all the Mule runtime engines in a cluster as if they were a single Mule runtime engine. -Note: CloudHub does not use this clustering configuration for provisioned workers, but it has other High Availability features to provide an equivalent experience, such as externalized state management via Anypoint Object Store (OSv2) or the persistent queues feature (which moves the VM queues external from the workers so they are shared and will survive re-provisioning). +Note: CloudHub does not use this clustering configuration for provisioned workers, but it has other High Availability features to provide an equivalent experience, such as externalized state management via Anypoint Object Store (OSv2) or the persistent queues feature (which moves the VM queues outside the workers so they can be shared and survive re-provisioning). All the nodes in a cluster share memory as illustrated below: From a63806fdc44300c3be882d097f2c7c5472ece37f Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:44:19 -0300 Subject: [PATCH 035/119] Update modules/ROOT/pages/mule-high-availability-ha-clusters.adoc --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 4b3c997245..71794e32aa 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -62,7 +62,7 @@ All Mule instances access the same Mule file folders concurrently, which can lea All Mule instances get the same TCP requests and then process duplicate messages. * JMS topics. + -All Mule instances connect to the same JMS topic, which might lead to the repeated processing of messages when scaling the non-clustered Mule instance horizontally. To the JMS broker, the instances appear as separate subscribers, all of which get a copy of each message. This behavior is rarely required, but a "shared subscriber" configuration is available to instruct the JMS broker to treat all instances as a combined subscriber and to give them each separate messages. +All Mule instances connect to the same JMS topic, which might lead to the repeated processing of messages when scaling the non-clustered Mule instance horizontally. To the JMS broker, the instances appear as separate subscribers, all of which get a copy of each message. This behavior is rarely required. To avoid this scenario, a "shared subscriber" configuration is available to instruct the JMS broker to treat all instances as a combined subscriber and to give them each separate messages. * JMS request-reply/request-response. + All Mule instances are listening for messages in the same response queue. This implies that a Mule instance might obtain a response that isn't correlated to the request it sent and might result in incorrect responses or make a flow fail with timeout. From 6ada2c77e7435f267b7cc9dae75bbdf8bd8d805a Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 25 Mar 2024 13:56:04 -0300 Subject: [PATCH 036/119] W-13983671-CH2parameterUpdate-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index a7f01d20ca..d2d6564a7e 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -206,7 +206,8 @@ Configuration example: [%header%autowidth.spread,cols=".^a,.^a"] |=== |Parameter | Description -| `enforceDeployingReplicasAcrossNodes` | Enforces the deployment of replicas across different nodes. The default value is `false`. +| `enforceDeployingReplicasAcrossNodes` | Enforces the deployment of replicas across different nodes. The default value is `false`. + +For high availability, set this value to `true`. Configuration example: [source,xml,linenums] From db550501bba7c90dde2e4864370b3dad5fff5ac3 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 12 Apr 2024 11:27:33 -0300 Subject: [PATCH 037/119] W-13196195-runningProfiler-44-dm --- modules/ROOT/pages/profiling-mule.adoc | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/modules/ROOT/pages/profiling-mule.adoc b/modules/ROOT/pages/profiling-mule.adoc index 5de05a0a0e..4e396d75d9 100644 --- a/modules/ROOT/pages/profiling-mule.adoc +++ b/modules/ROOT/pages/profiling-mule.adoc @@ -117,21 +117,5 @@ The agent is loaded and is listening on port 10001. You can connect to it from the profiler UI. ---- - -=== Running the Profiler - -Run the profiler by running Mule with the *-profile* switch, for example: - ----- -./mule -profile ----- - -You can add YourKit startup options by entering multiple parameters, separated by commas, for example: + ----- --profile onlylocal,onexit=memory ----- -This integration pack automatically resolves configuration differences for Java 1.4.x and Java 5.x/6.x. - - == See Also https://www.yourkit.com/[YourKit] From 45776267307b8130bf69dde8556cfd3add1049a1 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 12 Apr 2024 17:21:14 -0300 Subject: [PATCH 038/119] W-15480386-mmp-muledeploy-goal-44-dm --- modules/ROOT/pages/mmp-concept.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/mmp-concept.adoc b/modules/ROOT/pages/mmp-concept.adoc index c007ea8123..0a79b44211 100644 --- a/modules/ROOT/pages/mmp-concept.adoc +++ b/modules/ROOT/pages/mmp-concept.adoc @@ -101,6 +101,8 @@ For example: mvn mule:deploy -Dmule.artifact=myProject/myArtifact.jar ---- +This property is valid for CloudHub, standalone, or on-premises deployments. + === mule:undeploy Goal This goal removes an application from any of the application deployment targets. It uses the information from the plugin configuration to remove the application from the defined deployment target. From 66d56a1d4e1a52428a8cabf00d89177a6a236677 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 15 Apr 2024 16:06:30 -0300 Subject: [PATCH 039/119] W-15276130-addExampletoTarget-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index d2d6564a7e..3e871e05c9 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -145,7 +145,7 @@ Configuration example: ---- | No | `target` | The CloudHub 2.0 target name to deploy the app to. + -Specify either a shared space or a private space available in your Deployment Target values in CloudHub 2.0. See xref:cloudhub-2::ch2-features.adoc[Features of CloudHub 2.0] for a detailed description on shared and private spaces. Use a value from the xref:cloudhub-2::ch2-architecture.adoc#regions-and-dns-records[list of regions].| Yes +Specify either a shared space or a private space available in your Deployment Target values in CloudHub 2.0. See xref:cloudhub-2::ch2-features.adoc[Features of CloudHub 2.0] for a detailed description on shared and private spaces. Use a target name value from the xref:cloudhub-2::ch2-architecture.adoc#regions-and-dns-records[list of regions]. For example, `Cloudhub-US-East-1`. | Yes | `provider` | Set to `MC`, for CloudHub 2.0. | Yes | `environment` | Target Anypoint Platform environment. + This value must match an environment configured in your Anypoint Platform account, as shown here: + From 9c3cb2fb2adf8dd7f06bace7675468e24b1429f5 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 25 Apr 2024 17:06:56 -0300 Subject: [PATCH 040/119] W-15100389-flowDesigEOL-Mule44-dm --- .../ROOT/pages/about-classloading-isolation.adoc | 2 +- modules/ROOT/pages/about-components.adoc | 13 ++----------- modules/ROOT/pages/about-mule-configuration.adoc | 4 ++-- modules/ROOT/pages/build-application-from-api.adoc | 2 +- modules/ROOT/pages/flow-component.adoc | 2 +- modules/ROOT/pages/index.adoc | 2 +- .../ROOT/pages/migration-connectors-database.adoc | 2 +- modules/ROOT/pages/migration-connectors-xml.adoc | 2 +- modules/ROOT/pages/mule-app-dev.adoc | 7 ++----- modules/ROOT/pages/mule-app-tutorial.adoc | 2 +- 10 files changed, 13 insertions(+), 25 deletions(-) diff --git a/modules/ROOT/pages/about-classloading-isolation.adoc b/modules/ROOT/pages/about-classloading-isolation.adoc index 6582e88a8b..b8717a157d 100644 --- a/modules/ROOT/pages/about-classloading-isolation.adoc +++ b/modules/ROOT/pages/about-classloading-isolation.adoc @@ -124,7 +124,7 @@ All dependencies (JAR files, for example) declared in the application's `pom.xml Consider an application that uses Anypoint Connector for Java, and the connector needs to use a class that is part of a JAR dependency declared in the application's `pom.xml` file. However, this is not possible, because the connector's class loader is not able to find that class. To make this class visible to the connector, you must declare the dependency that contains the class as a shared library in the Mule Maven plugin configuration of your application's `pom.xml` file. -If you use Anypoint Studio or Flow Designer to configure a connector that uses external libraries, the dependencies are automatically added as shared libraries. For example, if you add Anypoint Connector for Database to your application and then configure the connection driver using Anypoint Studio, the driver is automatically added as a shared library in your project's `pom.xml` file. +If you use Anypoint Studio to configure a connector that uses external libraries, the dependencies are automatically added as shared libraries. For example, if you add Anypoint Connector for Database to your application and then configure the connection driver using Anypoint Studio, the driver is automatically added as a shared library in your project's `pom.xml` file. See xref:mmp-concept.adoc#configure-shared-libraries[Configure Shared Libraries] for configuration instructions. diff --git a/modules/ROOT/pages/about-components.adoc b/modules/ROOT/pages/about-components.adoc index 9df5524b8d..1d1cc2f22a 100644 --- a/modules/ROOT/pages/about-components.adoc +++ b/modules/ROOT/pages/about-components.adoc @@ -8,21 +8,12 @@ building blocks of flows in a Mule app. Core components provide the logic for processing a Mule event as it travels in a series of linked steps through the app. Examples include the Scheduler, For Each, and Logger components. -* In Studio, Mule components are accessible by clicking *Core* from the Mule palette. +In Studio, Mule components are accessible by clicking *Core* from the Mule palette. + image::components-core-studio.png[Core Components in Studio] + Notice that the components are subdivided into types, including Batch, Error Handling, and Flow Control. -+ -* In Design Center, when you are building a Mule app, you can find Mule -components listed among *Modules* in the *Select a Component* dialog. -+ -image::components-core-fd.png[Core Components in Design Center] -+ -Design Center provides many of the Core components described below. Though the -Design Center UI does not subdivide components into the types you see in the -Studio UI, it can help to conceptualize them by those types. == Batch @@ -55,7 +46,7 @@ data to a new output structure or format. == Endpoints -Endpoints (sometimes called Sources in Studio or Triggers in Design Center) include +Endpoints (sometimes called Sources in Studio) include components that initiate (or trigger) processing in a Mule flow. The xref:scheduler-concept.adoc[Scheduler] is an endpoint. It triggers a flow to start at a configurable interval. diff --git a/modules/ROOT/pages/about-mule-configuration.adoc b/modules/ROOT/pages/about-mule-configuration.adoc index 0318b74f4f..082f6ce24e 100644 --- a/modules/ROOT/pages/about-mule-configuration.adoc +++ b/modules/ROOT/pages/about-mule-configuration.adoc @@ -23,8 +23,8 @@ Global settings, such as the default transaction time-out, that apply to the ent Configuration Properties, message properties, and system properties. * xref:about-flows.adoc[Flows] + Combine components to define a message flow. -* xref:about-components#_endpoints[Sources (Endpoints or Triggers)] + -Trigger a flow. Sources are sometimes called Endpoints in Studio and Triggers in Flow Designer. +* xref:about-components#_endpoints[Sources (Endpoints)] + +Trigger a flow. Sources are sometimes called Endpoints in Studio. * xref:connectors::index.adoc[Connectors and Modules Configurations] + Declare configurations for any connectors and modules components used. * xref:about-components.adoc#_flow_control_routers[Routers] + diff --git a/modules/ROOT/pages/build-application-from-api.adoc b/modules/ROOT/pages/build-application-from-api.adoc index fe8989ab4b..0a39ca8678 100644 --- a/modules/ROOT/pages/build-application-from-api.adoc +++ b/modules/ROOT/pages/build-application-from-api.adoc @@ -76,7 +76,7 @@ Use this method if you want to start a project by either importing an existing R . In *API Implementation*, select *Specify API Definition File Location or URL*. . In *Location*, do one of the following: * If you created an `api.raml` file in Design Center, select *Design Center* . Login to Anypoint Platform if necessary, and select `api.raml`. -* If you didn’t create a RAML file in Design Center, select *Browse Files* and select the RAML or WSDL file that you created in a text editor. For a WSDL file, select a service and port from the drop-down menus or accept the defaults. +* If you didn't create a RAML file in Design Center, select *Browse Files* and select the RAML or WSDL file that you created in a text editor. For a WSDL file, select a service and port from the drop-down menus or accept the defaults. [start=6] . Accept the Location default options, and click *Finish*. diff --git a/modules/ROOT/pages/flow-component.adoc b/modules/ROOT/pages/flow-component.adoc index dd937a7d4c..6c6ba53f5b 100644 --- a/modules/ROOT/pages/flow-component.adoc +++ b/modules/ROOT/pages/flow-component.adoc @@ -14,7 +14,7 @@ Flow and Subflow scopes are components for grouping together a sequence of other Core components and operations (provided by connectors and modules) to help automate integration processes. The Flow component is fundamental to a Mule app. Because all Mule apps must contain at least one flow, Anypoint -Studio and Flow Designer automatically provide the first Flow component in +Studio automatically provides the first Flow component in your Mule app. A Mule app can contain additional flows and subflows, as this example shows: diff --git a/modules/ROOT/pages/index.adoc b/modules/ROOT/pages/index.adoc index 0cbe1fcc29..caf9f47999 100644 --- a/modules/ROOT/pages/index.adoc +++ b/modules/ROOT/pages/index.adoc @@ -16,7 +16,7 @@ connectivity instead of point-to-point integrations. Mule applications provide functionality for message routing, data mapping, orchestration, reliability, security, and scalability. -Anypoint Studio and Flow Designer support Mule application development. +Anypoint Studio supports Mule application development. == Mule Domains diff --git a/modules/ROOT/pages/migration-connectors-database.adoc b/modules/ROOT/pages/migration-connectors-database.adoc index 51cf136949..5ddc7a4a5f 100644 --- a/modules/ROOT/pages/migration-connectors-database.adoc +++ b/modules/ROOT/pages/migration-connectors-database.adoc @@ -221,7 +221,7 @@ Microsoft SQL Server, MySQL, Derby, Oracle configurations require a driver. ---- WARNING: Because of the new Mule 4 ClassLoading mechanism, this dependency must be declared as a Shared Library to be -exported to the DB Connector. Using Studio or Flow Designer, this will be automatically configured. +exported to the DB Connector. Using Studio, this will be automatically configured. //TODO LINK TO HOW TO ADD A SHARED LIBRARY OR THE USER WON'T NEVER REALIZE HOW TO DO IT diff --git a/modules/ROOT/pages/migration-connectors-xml.adoc b/modules/ROOT/pages/migration-connectors-xml.adoc index 2f943b68e1..f0a59e5f77 100644 --- a/modules/ROOT/pages/migration-connectors-xml.adoc +++ b/modules/ROOT/pages/migration-connectors-xml.adoc @@ -250,7 +250,7 @@ This validator will raise an `XML-MODULE:SCHEMA_NOT_HONOURED` error. == Installing the XML Module -To use the XML module, simply add it to your application using the Studio palette or Flow Designer card, or add the following dependency in your `pom.xml` file: +To use the XML module, simply add it to your application using the Studio palette, or add the following dependency in your `pom.xml` file: [source,xml,linenums] ---- diff --git a/modules/ROOT/pages/mule-app-dev.adoc b/modules/ROOT/pages/mule-app-dev.adoc index 831b612927..1e1421900d 100644 --- a/modules/ROOT/pages/mule-app-dev.adoc +++ b/modules/ROOT/pages/mule-app-dev.adoc @@ -158,10 +158,7 @@ providing cryptographic and other capabilities, such as FIPS compliance. == Development Environments You can develop a Mule application using -xref:studio::index.adoc[Anypoint Studio] (an Eclipse-based IDE), -xref:design-center::about-designing-a-mule-application.adoc[Flow Designer] -(a cloud-based application in Design Center, on Anypoint Platform), -or, if you are an advanced developer, in your own IDE. +xref:studio::index.adoc[Anypoint Studio] (an Eclipse-based IDE), or, if you are an advanced developer, in your own IDE. For example, in Studio, you build and design a Mule application in a project that contains one or more XML-based files. A Mule project supports all the @@ -169,7 +166,7 @@ dependencies required for development. The xref:studio::index.adoc#package-explorer[Package Explorer] view in Studio provides access to the project folders and files that make up a Mule project. Studio provides a design-time environment in which you can also build, run, and test -your Mule application. Flow Designer supports a cloud-based version of a Mule project. +your Mule application. [[version]] == Mule Versioning diff --git a/modules/ROOT/pages/mule-app-tutorial.adoc b/modules/ROOT/pages/mule-app-tutorial.adoc index f0f8cc99a9..ed9bdb258f 100644 --- a/modules/ROOT/pages/mule-app-tutorial.adoc +++ b/modules/ROOT/pages/mule-app-tutorial.adoc @@ -3,7 +3,7 @@ ifndef::env-site,env-github[] include::_attributes.adoc[] endif::[] -Most integrations require a change to the structure of data as it moves from source to destination. Within a Mule app, you can use the drag-n-drop interface of the Transform Message component to map data from one field or format to another, or you can write mappings by hand within DataWeave scripts. You typically build Mule apps in Studio or Design Center, but you can even write Mule app configurations by hand in XML. This tutorial uses Studio. +Most integrations require a change to the structure of data as it moves from source to destination. Within a Mule app, you can use the drag-n-drop interface of the Transform Message component to map data from one field or format to another, or you can write mappings by hand within DataWeave scripts. You typically build Mule apps in Studio, but you can even write Mule app configurations by hand in XML. This tutorial uses Studio. Using a small data set and a training API available on Exchange, you'll create a project and define the transformation mapping from the API into a different structure and protocol. You'll use the drag-n-drop and also see the xref:dataweave.adoc[DataWeave] code that defines the transformation. After completing this tutorial, you'll be ready to create your own data mappings. From f45f571ead04b292682a27183fc50e38607d95f1 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Thu, 25 Apr 2024 17:19:18 -0300 Subject: [PATCH 041/119] Update flow-component.adoc Adding modifications --- modules/ROOT/pages/flow-component.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/flow-component.adoc b/modules/ROOT/pages/flow-component.adoc index 6c6ba53f5b..719fb7d1ee 100644 --- a/modules/ROOT/pages/flow-component.adoc +++ b/modules/ROOT/pages/flow-component.adoc @@ -8,7 +8,7 @@ endif::[] toc::[] -//Anypoint Studio, Design Center connector + [[short_description]] Flow and Subflow scopes are components for grouping together a sequence of other Core components and operations (provided by connectors and modules) to help From 4d7abdd4b4355f1a83871914b41e2b0472eaaae5 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 25 Apr 2024 17:48:42 -0300 Subject: [PATCH 042/119] W-15610491-update-initialBufferSize-size-44-dm --- modules/ROOT/pages/streaming-strategies-reference.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/streaming-strategies-reference.adoc b/modules/ROOT/pages/streaming-strategies-reference.adoc index bd560cab04..44a98f9e32 100644 --- a/modules/ROOT/pages/streaming-strategies-reference.adoc +++ b/modules/ROOT/pages/streaming-strategies-reference.adoc @@ -15,7 +15,7 @@ on these strategies. | `initialBufferSize` | No | No -| 256 +| 512 | Amount of memory allocated to consume the stream and provide random access to it. If the stream contains more data than fits into this buffer, the memory expands according to the `bufferSizeIncrement` attribute, with an @@ -24,7 +24,7 @@ upper limit of `maxInMemorySize`. | `bufferSizeIncrement` | No | No -| 256 +| 512 | Amount to expand the buffer size if the size of the stream exceeds the initial buffer size. Setting a value of zero or lower indicates that the buffer does not expand and that a STREAM_MAXIMUM_SIZE_EXCEEDED error is raised when the From 5df7534446cc3d5b32e532f7c528f2acc071275c Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 3 May 2024 16:08:58 -0300 Subject: [PATCH 043/119] W-15439651-adaptTutorialTitles-44-dm --- modules/ROOT/pages/_partials/nav-app-dev.adoc | 4 ++-- modules/ROOT/pages/mule-app-dev-hellomule.adoc | 4 ++-- modules/ROOT/pages/mule-app-dev.adoc | 4 ++-- modules/ROOT/pages/mule-app-tutorial.adoc | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/ROOT/pages/_partials/nav-app-dev.adoc b/modules/ROOT/pages/_partials/nav-app-dev.adoc index 8ec47a8827..16e98a20c5 100644 --- a/modules/ROOT/pages/_partials/nav-app-dev.adoc +++ b/modules/ROOT/pages/_partials/nav-app-dev.adoc @@ -1,6 +1,6 @@ * xref:mule-app-dev.adoc[Develop Mule Applications] -** xref:mule-app-dev-hellomule.adoc[Hello Mule Tutorial] -** xref:mule-app-tutorial.adoc[Mule App Development Tutorial] +** xref:mule-app-dev-hellomule.adoc[Tutorial: Create a "Hello World" Mule app] +** xref:mule-app-tutorial.adoc[Tutorial: Create a Mule app that uses the Database Connector and DataWeave] ** xref:about-components.adoc[Core Components] *** xref:async-scope-reference.adoc[Async Scope] *** xref:batch-processing-concept.adoc[] diff --git a/modules/ROOT/pages/mule-app-dev-hellomule.adoc b/modules/ROOT/pages/mule-app-dev-hellomule.adoc index 3a5e28a974..cbf4579e3b 100644 --- a/modules/ROOT/pages/mule-app-dev-hellomule.adoc +++ b/modules/ROOT/pages/mule-app-dev-hellomule.adoc @@ -1,4 +1,4 @@ -= Hello Mule Tutorial += Tutorial: Create a "Hello World" Mule app ifndef::env-site,env-github[] include::_attributes.adoc[] endif::[] @@ -220,5 +220,5 @@ image::mruntime-hellomule-xml.png[Hello Mule XML Configuration] == See Also -* xref:mule-app-tutorial.adoc[Mule App Development Tutorial] +* xref:mule-app-tutorial.adoc[] * xref:dataweave::dataweave-quickstart.adoc[DataWeave Quickstart] diff --git a/modules/ROOT/pages/mule-app-dev.adoc b/modules/ROOT/pages/mule-app-dev.adoc index 1e1421900d..6ecd0f5aa7 100644 --- a/modules/ROOT/pages/mule-app-dev.adoc +++ b/modules/ROOT/pages/mule-app-dev.adoc @@ -18,12 +18,12 @@ event and to pass it to either single or multiple threads. To get started with Mule application development, you can follow the steps in these tutorials: -* xref:mule-app-dev-hellomule.adoc[Hello Mule Tutorial] +* xref:mule-app-dev-hellomule.adoc[Create a "Hello World" Mule app] + Build a Mule application that interacts with a user in a simple HTTP request-response flow. + -* xref:mule-app-tutorial.adoc[Mule Application Development Tutorial] +* xref:mule-app-tutorial.adoc[Create a Mule app that uses the Database Connector and DataWeave] + Build a Mule application that retrieves data from a database and transforms it to a new structure. diff --git a/modules/ROOT/pages/mule-app-tutorial.adoc b/modules/ROOT/pages/mule-app-tutorial.adoc index ed9bdb258f..22d10e3038 100644 --- a/modules/ROOT/pages/mule-app-tutorial.adoc +++ b/modules/ROOT/pages/mule-app-tutorial.adoc @@ -1,4 +1,4 @@ -= Mule App Development Tutorial += Tutorial: Create a Mule app that uses the Database Connector and DataWeave ifndef::env-site,env-github[] include::_attributes.adoc[] endif::[] From aed3e78129750cd3f7d22589fcbf00631c88adb8 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 7 May 2024 13:27:48 -0300 Subject: [PATCH 044/119] W-15439586-upgradeToolDownload-44-dm --- modules/ROOT/pages/_partials/upgrade-tool.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/_partials/upgrade-tool.adoc b/modules/ROOT/pages/_partials/upgrade-tool.adoc index 64c476f375..7cde1621d8 100644 --- a/modules/ROOT/pages/_partials/upgrade-tool.adoc +++ b/modules/ROOT/pages/_partials/upgrade-tool.adoc @@ -5,6 +5,8 @@ // tag::BeforeYouBegin[] * xref:release-notes::mule-upgrade-tool/mule-upgrade-tool.adoc[The latest available version of Mule upgrade tool] so that the tool runs with the latest fixes and security enhancements. ++ +Download the Mule upgrade tool from the https://help.mulesoft.com/s/[Help Center^]. * A currently operational Mule 4 instance in _stopped_ status to prepare for the upgrade. + For upgrades of Mule versions between 4.1.1 and 4.1.4 with the Mule upgrade tool, you must upgrade from any patch update released after January 20, 2022. Releases of versions 4.1.1 through 4.1.4 _before_ January 20, 2022 are not supported by the tool, and attempts to upgrade them produce an error message stating that the Mule version cannot be upgraded without first upgrading to a supported version (see xref:release-notes::mule-runtime/upgrade-update-mule.adoc[]). From 853ff4729f2a2a354eaa3980a2307e5f86a3b116 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 8 May 2024 13:08:22 -0300 Subject: [PATCH 045/119] W-15712935-MMPdependencyVersionNote-44-dm --- modules/ROOT/pages/package-a-mule-application.adoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/package-a-mule-application.adoc b/modules/ROOT/pages/package-a-mule-application.adoc index 47717ff402..5ee71fae61 100644 --- a/modules/ROOT/pages/package-a-mule-application.adoc +++ b/modules/ROOT/pages/package-a-mule-application.adoc @@ -118,7 +118,10 @@ From the command line in your project's folder, execute the package goal: mvn clean package ---- -The plugin packages your application and creates the deployable JAR file into the target directory within your project's folder. + +The plugin packages your application and creates the deployable JAR file into the target directory within your project's folder. + +[NOTE] +If there is a dependency version conflict in your `pom.xml`, the latest version is used. == Create an Application Package to Import into Anypoint Studio From a08ba54b087a2084a7e757d33990ef402fbc87a7 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 8 May 2024 13:09:17 -0300 Subject: [PATCH 046/119] W-15712935-typo --- modules/ROOT/pages/package-a-mule-application.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/package-a-mule-application.adoc b/modules/ROOT/pages/package-a-mule-application.adoc index 5ee71fae61..e61a9ab074 100644 --- a/modules/ROOT/pages/package-a-mule-application.adoc +++ b/modules/ROOT/pages/package-a-mule-application.adoc @@ -121,7 +121,7 @@ mvn clean package The plugin packages your application and creates the deployable JAR file into the target directory within your project's folder. [NOTE] -If there is a dependency version conflict in your `pom.xml`, the latest version is used. +If there is a dependency version conflict in your `pom.xml`, the latest version is used. == Create an Application Package to Import into Anypoint Studio From 20aa926a05cb26d98687786535c9e3c48a8a9204 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 8 May 2024 15:33:38 -0300 Subject: [PATCH 047/119] W-15715656-deleteFlowDesigner-44-dm --- modules/ROOT/pages/tls-configuration.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/tls-configuration.adoc b/modules/ROOT/pages/tls-configuration.adoc index 848abfe469..63282b8fe3 100644 --- a/modules/ROOT/pages/tls-configuration.adoc +++ b/modules/ROOT/pages/tls-configuration.adoc @@ -241,7 +241,7 @@ To enable TLS for Mule apps, configure the `tls:context` element in the Mule XML * <> * <> -* <> +* <> Whichever method you use, we recommend you review the information in <> to understand how the attributes of `tls:context` function. From 7b02459f9bee39afe2892e7e247dd61a3fc6b17b Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 16 May 2024 15:19:38 -0300 Subject: [PATCH 048/119] W-15783192-javaUpdate-inClusters-4.4-dm --- .../pages/creating-and-managing-a-cluster-manually.adoc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc b/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc index 2a079c7fb5..29b92c9fa0 100644 --- a/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc +++ b/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc @@ -4,7 +4,7 @@ include::_attributes.adoc[] endif::[] :keywords: cluster, deploy -This page describes manual creation and configuration of a cluster. There are two ways to create and manage clusters: +There are two ways to create and manage clusters: * Using Runtime Manager + @@ -16,7 +16,12 @@ See xref:runtime-manager::cluster-about.adoc[Clusters] for configuration instruc * Do not mix cluster management tools. + Manual cluster configuration is not synced to Anypoint Runtime Manager, so any change you make in the platform overrides the cluster configuration files. To avoid this scenario, use only one method for creating and managing your clusters: either manual configuration or configuration using Anypoint Runtime Manager. -* All nodes in a cluster must have the same Mule runtime engine and Runtime Manager agent version. If you are using a cumulative patch release, such as 4.3.0-20210322, all instances of Mule must be the same cumulative patch version. +* All nodes in a cluster must have the same versions of: +** Mule runtime engine ++ +If you are using a cumulative patch release, such as 4.3.0-20210322, all instances of Mule must be the same cumulative patch version. +** Runtime Manager agent version +** Java == Creating a Cluster Manually From 3b7d1edc36aaab5e1a9da2dcfdd817b2b3d20c69 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 17 May 2024 17:25:59 -0300 Subject: [PATCH 049/119] W-15794111-hostingOptions-44-dm --- modules/ROOT/pages/index.adoc | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/modules/ROOT/pages/index.adoc b/modules/ROOT/pages/index.adoc index caf9f47999..1dd3d271c6 100644 --- a/modules/ROOT/pages/index.adoc +++ b/modules/ROOT/pages/index.adoc @@ -61,31 +61,7 @@ Mule is packaged within the xref:studio::index.adoc[Studio] IDE and with xref:design-center::index.adoc[Design Center] on Anypoint Platform so that you can run a Mule app as you design it. -For production and pre-production deployments of Mule apps, you can use -xref:runtime-manager::index.adoc[Runtime Manager] to deploy Mule apps -to runtimes within CloudHub and other supported platform as a service (PaaS) -solutions. - -* xref:runtime-manager::cloudhub.adoc[CloudHub] is a fully managed, cloud-based -integration platform as a service (iPaaS) for Anypoint Platform that enables you -to run your Mule apps without requiring you to provide Mule runtime engines or the -infrastructure on which your apps run. You use Runtime Manager to deploy Mule -apps to CloudHub, select the Mule version, set the number of vCores -needed to run the app, and so on. -* Hybrid deployment models manage Mule apps and runtimes from the Cloud while -running them in a datacenter that is managed by your company: -** For remote Mule runtimes (also called standalone or "naked" Mules), you -start Mule runtimes from your datacenter, but you can deploy and manage -Mule apps from the Cloud, through Runtime Manager. In this deployment model, you -provide the infrastructure and Mule runtime (see -xref:mule-standalone.adoc[Run Mule Runtime Engine On-Premises]). -** For a hybrid PaaS deployment, you set up and run the PaaS on your company's -datacenter and use Runtime Manager to manage Mule apps within the PaaS. In this -case, you provision the infrastructure in which the apps run. To guarantee the -high availability of Mule apps, you use Runtime Manager to handle Mule runtimes. -MuleSoft also provides the built-in PaaS -solution, xref:runtime-fabric::index.adoc[Runtime Fabric], which runs Mule -runtime engines in a "containerized" environment. +include::cloudhub-2::partial$index-runtime-plane-hosting-options.adoc[tag=runtimePlaneHostingOptions] In addition to using Runtime Manager, you can perform deployments and manage Mule apps with From 5236e0affd962499da011efc7e236e73a75b550b Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 20 May 2024 16:31:42 -0300 Subject: [PATCH 050/119] W-14129261-HAoptions-4.4-dm --- .../mule-high-availability-ha-clusters.adoc | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 71794e32aa..ba66e27b0e 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -106,13 +106,14 @@ A Mule Cluster consists of two or more Mule runtime engines, or nodes, grouped t With Anypoint Runtime Manager, you can deploy, monitor, or stop all the Mule runtime engines in a cluster as if they were a single Mule runtime engine. -Note: CloudHub does not use this clustering configuration for provisioned workers, but it has other High Availability features to provide an equivalent experience, such as externalized state management via Anypoint Object Store (OSv2) or the persistent queues feature (which moves the VM queues outside the workers so they can be shared and survive re-provisioning). +Note: CloudHub doesn't use this clustering configuration for provisioned workers, but it has other High Availability features to provide an equivalent experience, such as externalized state management via Anypoint Object Store (OSv2) or the persistent queues feature (which moves the VM queues outside the workers so they can be shared and survive re-provisioning). All the nodes in a cluster share memory as illustrated below: image::topology-4-cluster.png[topology_4-cluster] -Mule uses an active-active model to cluster Mule runtime engines. The benefit of this model over an active-passive approach is that your application runs in all nodes, splitting message processing with the other nodes in your cluster, which expedites processing. +[NOTE] +To ensure operational performance, Mule uses an active-active model to cluster Mule runtime engines. The benefit of this model over an active-passive approach is that your application runs in all nodes, splitting message processing with the other nodes in your cluster, which expedites processing. === Primary Node Difference @@ -132,7 +133,7 @@ This feature works differently depending on the source type: ---- -This example might be for a use case where the application is receiving messages from JMS where serial/single message at a time processing is critical. The default configuration of the JMS Connector's On New Message source has "primary node only" selected by default, but most connector sources do not have "primary node only" selected. The decision on the default configuration lies with the developers of the connector. For a use case where all nodes should perform processing the developer would de-select the primaryNodeOnly value so that all cluster nodes enable the source. +This example might be for a use case where the application is receiving messages from JMS where serial/single message at a time processing is critical. The default configuration of the JMS Connector's On New Message source has "primary node only" selected by default, but most connector sources don't have "primary node only" selected. The decision on the default configuration lies with the developers of the connector. For a use case where all nodes should perform processing the developer would de-select the primaryNodeOnly value so that all cluster nodes enable the source. == Queues @@ -155,7 +156,7 @@ Connectors such as JMS, VM, and JDBC provide built-in transactional support, thu You must use XA transactions to move messages between dissimilar connectors that support transactions. This ensures that the Mule runtime engine commits associated transactions from all the dissimilar connectors as a single unit. [NOTE] -Transactions cannot span interactions or operations with systems that the connector does not support transactions, so if any of the involved operations cannot be included in the transaction an alternative pattern such as https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf[Sagas] would be an alternative. +Transactions can't span interactions or operations with systems that the connector doesn't support transactions, so if any of the involved operations can't be included in the transaction an alternative pattern such as https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf[Sagas] would be an alternative. == Cluster Support for Connectors @@ -181,7 +182,7 @@ Listener-based connectors are supported in clusters as described below: === Resource-based Connectors -Resource-based connectors read data from a resource that allows multiple concurrent accessors, but does not natively coordinate their use of the resource. Examples of resource-based connectors include File, FTP, SFTP, E-mail, and JDBC. +Resource-based connectors read data from a resource that allows multiple concurrent accessors, but doesn't natively coordinate their use of the resource. Examples of resource-based connectors include File, FTP, SFTP, E-mail, and JDBC. Resource-based connectors are supported in clusters as described below: @@ -225,16 +226,16 @@ Note that it is possible to use nodes of a cluster located in different data cen To prevent this "split brain" processing behavior, it is necessary to enable the Quorum Protocol. This protocol is used to allow one set of nodes to continue processing data while other sets do nothing with the shared data until they reconnect. Basically, when a disconnection occurs, only the portion with the most nodes will continue to function. For instance, assume two data centers, one with three nodes and another with two nodes. If a connectivity problem occurs in the data center with two nodes, then the data center with three nodes will continue to function, and the second data center will not. If the three-node data center goes offline, none of your nodes will function. To prevent this outage, you must create the cluster in at least three data centers with the same number of nodes. It is unlikely for two data centers to crash, so if just one data center goes offline or is separated from the others by a network fault, the cluster will always be functional. -IMPORTANT: A cluster partition that does not have enough nodes to function will continue reacting to external system calls, but all operations over the object stores will fail, preventing data generation. +IMPORTANT: A cluster partition that doesn't have enough nodes to function will continue reacting to external system calls, but all operations over the object stores will fail, preventing data generation. ==== Limitations * Quorum is only supported in Object Store-related operations. -* Distributed locking is not supported, which affects: +* Distributed locking isn't supported, which affects: - File/FTP connector polling for files concurrent - Idempotent Redelivery Policy component - Idempotent Message Filter component -* In-memory messaging is not supported, which affects: +* In-memory messaging isn't supported, which affects: - VM connector * The Quorum feature can only be configured manually. @@ -266,7 +267,7 @@ Setting the performance profile has two effects: [WARNING] When one node goes down, the data associated to it is lost. -Setting the performance profile does not affect memory sharing. In cluster mode, Mule always distributes and shares the object stores between nodes. +Setting the performance profile doesn't affect memory sharing. In cluster mode, Mule always distributes and shares the object stores between nodes. === Configure the Performance Profile @@ -306,7 +307,7 @@ Remember that an application-level configuration overrides a container-level con [WARNING] ==== -In cases of high load with endpoints that do not support load balancing, applying the performance profile might degrade performance. If you are using a File-based connector with an asynchronous processing strategy, JMS topics, multicasting, or HTTP connectors without a load balancer, the high volume of messages entering a single node can cause bottlenecks, and thus it can be better for performance to turn off the performance profile for these applications. +In cases of high load with endpoints that don't support load balancing, applying the performance profile might degrade performance. If you are using a File-based connector with an asynchronous processing strategy, JMS topics, multicasting, or HTTP connectors without a load balancer, the high volume of messages entering a single node can cause bottlenecks, and thus it can be better for performance to turn off the performance profile for these applications. ==== You can also choose to define the minimum number of machines that a cluster requires to remain in an operational state. This configuration grants you a consistency improvement in the overall performance. From 30af3b80a29cac3ca202edf590c2cc2ee9b86fd5 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 6 Jun 2024 17:57:15 -0300 Subject: [PATCH 051/119] W-15953447-deleteExtension-44-dm --- modules/ROOT/pages/notifications-configuration-reference.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ROOT/pages/notifications-configuration-reference.adoc b/modules/ROOT/pages/notifications-configuration-reference.adoc index d69376c0f1..647732881e 100644 --- a/modules/ROOT/pages/notifications-configuration-reference.adoc +++ b/modules/ROOT/pages/notifications-configuration-reference.adoc @@ -104,7 +104,6 @@ You can specify the following types of notifications using the `event` attribute * CUSTOM * EXCEPTION * EXCEPTION-STRATEGY -* EXTENSION * MANAGEMENT * MESSAGE-PROCESSOR * PIPELINE-MESSAGE From 5ff4afc630398c0863ee7f009d4d175061ac1632 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 6 Jun 2024 18:19:32 -0300 Subject: [PATCH 052/119] W-15953109-limitation-batchJobs-44-dm --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index ba66e27b0e..2493ab96bc 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -238,6 +238,7 @@ IMPORTANT: A cluster partition that doesn't have enough nodes to function will c * In-memory messaging isn't supported, which affects: - VM connector * The Quorum feature can only be configured manually. +* Batch jobs don't use high availability features. == Clustering and Load Balancing From 3dee465dea6417d72246550b1c909a2471670e35 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 12 Jun 2024 16:45:05 -0300 Subject: [PATCH 053/119] W-15991837-hardware&Software-requirements-44-dm --- modules/ROOT/pages/hardware-and-software-requirements.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/hardware-and-software-requirements.adoc b/modules/ROOT/pages/hardware-and-software-requirements.adoc index 4c0e3839fa..806bb8ba9f 100644 --- a/modules/ROOT/pages/hardware-and-software-requirements.adoc +++ b/modules/ROOT/pages/hardware-and-software-requirements.adoc @@ -26,6 +26,8 @@ Verify that you use a supported version of Java before you install Mule. | JDK | JDK 1.8.0 or JDK 11 |=== +[NOTE] +Though you can run a different JDK of choice, MuleSoft doesn't support or take action to fix issues if they are traced back to the JDK. == Supported Software @@ -39,7 +41,7 @@ The Mule runtime engine passed functional testing against the following software |=== |Software |Version | OS | MacOS 10.15, HP-UX 11i V3, AIX 7.2, Windows Server 2019, Windows 10, Solaris 11.3, Red Hat Enterprise Linux 8.8, Ubuntu Server 20.04 -| JDK | JDK 1.8.0, JDK 11 +| JDK | Adoptium OpenJDK distribution |=== This version of Mule runtime engine is bundled with the Runtime Manager agent plugin version 2.4.21. For Runtime Manager Agent compatibility, see xref:release-notes::runtime-manager-agent/runtime-manager-agent-release-notes.adoc[Runtime Manager Agent Release Notes]. From 62ea34d03cdd584fc4fec7f61920958a28ee095a Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 12 Jun 2024 17:49:59 -0300 Subject: [PATCH 054/119] W-15993176-MMP-snapshotAssets-44-dm --- .../pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 14 ++++++++++++++ .../ROOT/pages/_partials/mmp-deploy-to-rtf.adoc | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 3e871e05c9..13a03fb9fb 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -87,6 +87,20 @@ From the command line in your project's folder, package the application and exec mvn clean deploy -DmuleDeploy ---- +=== Exchange Snapshot Assets + +You can also deploy Exchange snapshot assets into CloudHub 2.0. + +By using `SNAPSHOT` version assets in Anypoint Exchange during the development and testing phase, you can avoid incrementing your application's version number for small changes. After your `SNAPSHOT` version application has been overwritten in Anypoint Exchange, you can redeploy your `SNAPSHOT` version application to CloudHub 2.0 via the Mule Maven plugin to deploy the latest changes. + +To learn more about publishing snapshot assets to Anypoint Exchange, see xref:exchange::to-publish-assets-maven.adoc#asset-lifecycle-state[Asset Lifecycle State]. + +[NOTE] +==== +Each time you update your application's snapshot, redeploy the application to refresh it with the latest snapshot binaries. +Because snapshot assets can change after deployment, avoid deploying them into your production environment. +==== + == Redeploy to CloudHub 2.0 To redeploy the application, run the same command as you did to deploy. + diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc index 114a67ae34..9ccff7f262 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc @@ -99,6 +99,20 @@ From the command line in your project's folder, package the application and exec mvn clean deploy -DmuleDeploy ---- +=== Exchange Snapshot Assets + +You can also deploy Exchange snapshot assets into Runtime Fabric. + +By using `SNAPSHOT` version assets in Anypoint Exchange during the development and testing phase, you can avoid incrementing your application's version number for small changes. After your `SNAPSHOT` version application has been overwritten in Anypoint Exchange, you can redeploy your `SNAPSHOT` version application to Runtime Fabric via the Mule Maven plugin to deploy the latest changes. + +To learn more about publishing snapshot assets to Anypoint Exchange, see xref:exchange::to-publish-assets-maven.adoc#asset-lifecycle-state[Asset Lifecycle State]. + +[NOTE] +==== +Each time you update your application's snapshot, redeploy the application to refresh it with the latest snapshot binaries. +Because snapshot assets can change after deployment, avoid deploying them into your production environment. +==== + == Redeploy to Runtime Fabric To redeploy the application, run the same command as you did to deploy. + From b380686ecc6af6f6b309fb7956189838f7889365 Mon Sep 17 00:00:00 2001 From: Hanna Nelson Date: Tue, 18 Jun 2024 11:04:41 -0700 Subject: [PATCH 055/119] W-16038114-CS-Fix-out-of-sequence 4.4 --- modules/ROOT/pages/for-each-scope-concept.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/for-each-scope-concept.adoc b/modules/ROOT/pages/for-each-scope-concept.adoc index 22f0c66d39..1ed2481139 100644 --- a/modules/ROOT/pages/for-each-scope-concept.adoc +++ b/modules/ROOT/pages/for-each-scope-concept.adoc @@ -31,7 +31,7 @@ Note that if the input contains information outside the collection you tell it t You can also split an array into batches to enable quicker processing. Each batch is treated as a separate Mule message. For example, if a collection has 200 elements and you set *Batch Size* to `50`, the For Each scope iteratively processes 4 batches of 50 elements, each as a separate Mule message. -=== Example XML +== Example XML This is an example XML based on the For Each scope configuration detailed above: [source,xml,linenums] From cb9b2526ef7c012de098260cd076a6ec23401a8b Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 5 Jul 2024 15:35:14 -0300 Subject: [PATCH 056/119] W-15950750-modify-variableName-description-44-dm --- modules/ROOT/pages/variable-transformer-reference.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/variable-transformer-reference.adoc b/modules/ROOT/pages/variable-transformer-reference.adoc index 9cf7169cda..dfd3ad7f69 100644 --- a/modules/ROOT/pages/variable-transformer-reference.adoc +++ b/modules/ROOT/pages/variable-transformer-reference.adoc @@ -19,7 +19,7 @@ Set Variable provides a way to set the name and value of Mule variable, along wi | Variable Name (`variableName`) | Required -| Name of the variable, which can be a string or a DataWeave expression. Variable names can include only numbers, characters, and underscores. For example, hyphens are not allowed in the name. +| Name of the variable, which must be a string. Variable names can include only numbers, characters, and underscores. For example, hyphens are not allowed in the name. | Value (`value`) | Required From c068048265eb405dfbb42e8fd3180a758d3e939e Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 18 Jul 2024 17:40:41 -0300 Subject: [PATCH 057/119] W-16273373-buildLogErrors-Mule44-dm --- modules/ROOT/pages/about-flows.adoc | 3 ++- modules/ROOT/pages/business-events.adoc | 2 +- modules/ROOT/pages/consume-data-from-an-api.adoc | 2 +- modules/ROOT/pages/migration-connectors-database.adoc | 3 +-- modules/ROOT/pages/migration-munit-test-structure.adoc | 2 +- modules/ROOT/pages/migration-transports.adoc | 2 +- modules/ROOT/pages/on-error-scope-concept.adoc | 2 +- modules/ROOT/pages/transform-dataweave-xml-reference.adoc | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/ROOT/pages/about-flows.adoc b/modules/ROOT/pages/about-flows.adoc index 261262a06f..e1d8f721a1 100644 --- a/modules/ROOT/pages/about-flows.adoc +++ b/modules/ROOT/pages/about-flows.adoc @@ -12,7 +12,7 @@ An app can consist of a single flow, or it can break up processing into discrete flows and subflows that you add to the app and connect together. Mule apps in production environments typically use multiple flows and subflows to divide the app into functional modules or for -<> purposes. For example, one flow might +<> purposes. For example, one flow might receive a record and transform data into a given format that another flow processes in some special way. @@ -51,6 +51,7 @@ Because the contents of a subflow replace each Flow Reference component that ref For example, configuring a batch job inside a subflow causes the application to fail during deployment if the subflow is referenced from more than one Flow Reference component. The application fails to deploy because multiple instances of a batch job with the same job instance ID exist, which is not allowed. +[[error_handling]] == Error Handling Each flow (but not subflow) can have its own error handling. One reason for diff --git a/modules/ROOT/pages/business-events.adoc b/modules/ROOT/pages/business-events.adoc index 352a503004..1392a9ccbe 100644 --- a/modules/ROOT/pages/business-events.adoc +++ b/modules/ROOT/pages/business-events.adoc @@ -40,5 +40,5 @@ This practice makes analysis and debugging easier and more intuitive at runtime. * xref:about-mule-event.adoc[Mule Events] * xref:transaction-management.adoc[Transaction Management] -* xref:business-events-in-components[Configure Default Events Tracking] +* xref:business-events-in-components.adoc[Configure Default Events Tracking] * xref:business-events-custom.adoc[Custom Business Event Component] diff --git a/modules/ROOT/pages/consume-data-from-an-api.adoc b/modules/ROOT/pages/consume-data-from-an-api.adoc index 98d3064a16..2bd87a2b0a 100644 --- a/modules/ROOT/pages/consume-data-from-an-api.adoc +++ b/modules/ROOT/pages/consume-data-from-an-api.adoc @@ -79,7 +79,7 @@ POST, PUT, and DELETE requests almost always require headers. * URI and Query Parameters * Error handling -See xref:connectors::http-connector[HTTP Connector documentation] for more information about how to configure the request operation. +See xref:http-connector::index.adoc#input-sources[HTTP Connector documentation] for more information about how to configure the request operation. === Consume REST API Example diff --git a/modules/ROOT/pages/migration-connectors-database.adoc b/modules/ROOT/pages/migration-connectors-database.adoc index 5ddc7a4a5f..3e5a449919 100644 --- a/modules/ROOT/pages/migration-connectors-database.adoc +++ b/modules/ROOT/pages/migration-connectors-database.adoc @@ -238,7 +238,6 @@ In Mule 4, you can add child elements for these settings under the database conn * <> * <> * <> -* <> [[db_transactions]] ==== Database Transactions @@ -369,7 +368,7 @@ The examples below show changes to the XML for these settings: [[database_operations_overview]] == Database Connector Operations -* Query for SQL query text and input parameters (as shown here in <>). +* Query for SQL query text and input parameters * Streaming strategy settings (as shown here in <>) * <> * Query settings diff --git a/modules/ROOT/pages/migration-munit-test-structure.adoc b/modules/ROOT/pages/migration-munit-test-structure.adoc index 89b203bc9a..3786f49891 100644 --- a/modules/ROOT/pages/migration-munit-test-structure.adoc +++ b/modules/ROOT/pages/migration-munit-test-structure.adoc @@ -58,4 +58,4 @@ The following examples compare MUnit tests in 1.x to 2.x. == See Also -* xref:https://docs.mulesoft.com/munit/2.2/munit-test-concept[MUnit 2 Test structure] +* xref:2.2@munit::munit-test-concept.adoc[MUnit 2 Test structure] diff --git a/modules/ROOT/pages/migration-transports.adoc b/modules/ROOT/pages/migration-transports.adoc index 3b0ae63b1b..c073343e81 100644 --- a/modules/ROOT/pages/migration-transports.adoc +++ b/modules/ROOT/pages/migration-transports.adoc @@ -100,6 +100,6 @@ requests. xref:migration-connectors.adoc[Migrating Connectors and Modules to Mule 4] -xref:intro-java-integration[Java Integration] +xref:intro-java-integration.adoc[Java Integration] xref:1.1@mule-sdk::index.adoc[Mule SDK] diff --git a/modules/ROOT/pages/on-error-scope-concept.adoc b/modules/ROOT/pages/on-error-scope-concept.adoc index b293fad7a2..a6fbce6e97 100644 --- a/modules/ROOT/pages/on-error-scope-concept.adoc +++ b/modules/ROOT/pages/on-error-scope-concept.adoc @@ -240,4 +240,4 @@ output application/json * xref:mule-error-concept.adoc[Mule Errors] * xref:try-scope-concept.adoc[Try Scope] -* xref:mule-server-notifications[Mule Runtime Engine Notifications] +* xref:mule-server-notifications.adoc[Mule Runtime Engine Notifications] diff --git a/modules/ROOT/pages/transform-dataweave-xml-reference.adoc b/modules/ROOT/pages/transform-dataweave-xml-reference.adoc index 005346de47..e0fe31552f 100644 --- a/modules/ROOT/pages/transform-dataweave-xml-reference.adoc +++ b/modules/ROOT/pages/transform-dataweave-xml-reference.adoc @@ -38,7 +38,7 @@ The `` element is the top-level XML tag for the Transform componen == Adding DataWeave Scripts to the Transform Component -You can either type your DataWeave code into your XML using `CDATA` within a <> element, or you can reference an external `.dwl` file. +You can either type your DataWeave code into your XML using `CDATA` within a <> element, or you can reference an external `.dwl` file. This example that writes a DataWeave script inline within a `` transformation element: From cedece507998c19604a5861d08d96197ae825955 Mon Sep 17 00:00:00 2001 From: damiancinich Date: Wed, 7 Aug 2024 12:08:08 -0300 Subject: [PATCH 058/119] W-16437507 | AM Agent not supported by Upgrade Tool --- modules/ROOT/pages/mule-upgrade-tool.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-upgrade-tool.adoc b/modules/ROOT/pages/mule-upgrade-tool.adoc index a31c52c910..c423f94e3b 100644 --- a/modules/ROOT/pages/mule-upgrade-tool.adoc +++ b/modules/ROOT/pages/mule-upgrade-tool.adoc @@ -4,7 +4,7 @@ include::release-notes::partial$mule-upgrade-tool/mule-upgrade-tool-1.1.0.adoc[t If the Runtime Manager agent is installed in your current Mule instance, the upgrade tool also updates the agent version as part of the upgrade process. -After successfully upgrading your Mule instance, if the Anypoint Monitoring agent is installed in the Mule instance that is upgraded, reinstall the agent as the update of the agent is not supported. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. +Upgrading Anypoint Monitoring Agent is not supported, in order to proceed with an upgrade in cases where that Agent is installed, it is needed to uninstall the Agent prior to upgrade, and reinstall it after upgrading. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. The Mule upgrade tool supports upgrading clustered Mule instances by manually upgrading each node using the tool. For additional information on how to proceed with the upgrade, see <>. Though highly recommended, using the tool is not strictly necessary to upgrade your current Mule instance. For a completely manual upgrade, see xref:release-notes::mule-runtime/updating-mule-4-versions.adoc#mulerunvers[Upgrading an On-Premises Mule Instance Managed Through Runtime Manager]. From aad91eb43be00683ae4d280b07ce3729a5b1ee03 Mon Sep 17 00:00:00 2001 From: Damian Cinich <30634297+damiancinich@users.noreply.github.com> Date: Wed, 7 Aug 2024 14:01:29 -0300 Subject: [PATCH 059/119] Update modules/ROOT/pages/mule-upgrade-tool.adoc Co-authored-by: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> --- modules/ROOT/pages/mule-upgrade-tool.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-upgrade-tool.adoc b/modules/ROOT/pages/mule-upgrade-tool.adoc index c423f94e3b..c25a38cab4 100644 --- a/modules/ROOT/pages/mule-upgrade-tool.adoc +++ b/modules/ROOT/pages/mule-upgrade-tool.adoc @@ -4,7 +4,7 @@ include::release-notes::partial$mule-upgrade-tool/mule-upgrade-tool-1.1.0.adoc[t If the Runtime Manager agent is installed in your current Mule instance, the upgrade tool also updates the agent version as part of the upgrade process. -Upgrading Anypoint Monitoring Agent is not supported, in order to proceed with an upgrade in cases where that Agent is installed, it is needed to uninstall the Agent prior to upgrade, and reinstall it after upgrading. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. +Upgrading the Anypoint Monitoring agent isn't supported. To proceed with an upgrade, you must first uninstall the agent, and reinstall it after the Mule instance upgrade is complete. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. The Mule upgrade tool supports upgrading clustered Mule instances by manually upgrading each node using the tool. For additional information on how to proceed with the upgrade, see <>. Though highly recommended, using the tool is not strictly necessary to upgrade your current Mule instance. For a completely manual upgrade, see xref:release-notes::mule-runtime/updating-mule-4-versions.adoc#mulerunvers[Upgrading an On-Premises Mule Instance Managed Through Runtime Manager]. From 1df35884a1e0642e1246f02314d8bff2c838aecc Mon Sep 17 00:00:00 2001 From: damiancinich Date: Fri, 9 Aug 2024 11:34:30 -0300 Subject: [PATCH 060/119] W-16437507 | Added prerequisite to run Upgrade Tool --- modules/ROOT/pages/_partials/upgrade-tool.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/pages/_partials/upgrade-tool.adoc b/modules/ROOT/pages/_partials/upgrade-tool.adoc index 7cde1621d8..9acfe14769 100644 --- a/modules/ROOT/pages/_partials/upgrade-tool.adoc +++ b/modules/ROOT/pages/_partials/upgrade-tool.adoc @@ -17,6 +17,7 @@ The Mule upgrade tool requires the full distribution of the Mule runtime. Ensure Download Mule runtime distributions from the https://help.mulesoft.com/s/[Help Center^]. * At least 2 GB of available disk space on the file system and access privileges to install the new Mule distribution. * (For Windows environments) The execution policy for Powershell scripts set to *Unrestricted*. +* If Anypoint Monitoring agent is installed, uninstall it prior to upgrade // end::BeforeYouBegin[] // Upgrade Or Update Mule From 2e61a3809a1e994e697474bb9ba9363ffbd5e12b Mon Sep 17 00:00:00 2001 From: Damian Cinich <30634297+damiancinich@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:06:05 -0300 Subject: [PATCH 061/119] Update modules/ROOT/pages/_partials/upgrade-tool.adoc Co-authored-by: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> --- modules/ROOT/pages/_partials/upgrade-tool.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/_partials/upgrade-tool.adoc b/modules/ROOT/pages/_partials/upgrade-tool.adoc index 9acfe14769..fc2e2bc1bf 100644 --- a/modules/ROOT/pages/_partials/upgrade-tool.adoc +++ b/modules/ROOT/pages/_partials/upgrade-tool.adoc @@ -17,7 +17,7 @@ The Mule upgrade tool requires the full distribution of the Mule runtime. Ensure Download Mule runtime distributions from the https://help.mulesoft.com/s/[Help Center^]. * At least 2 GB of available disk space on the file system and access privileges to install the new Mule distribution. * (For Windows environments) The execution policy for Powershell scripts set to *Unrestricted*. -* If Anypoint Monitoring agent is installed, uninstall it prior to upgrade +* If Anypoint Monitoring agent is installed, uninstall it prior to the upgrade. // end::BeforeYouBegin[] // Upgrade Or Update Mule From 1f619708c50b990671d2602e6ed65e418869b828 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 23 Aug 2024 15:44:13 -0300 Subject: [PATCH 062/119] W-16452838-MMP-feedback-44-dm --- modules/ROOT/pages/maven-reference.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/maven-reference.adoc b/modules/ROOT/pages/maven-reference.adoc index 36c0a9ed87..01aa1ff63a 100644 --- a/modules/ROOT/pages/maven-reference.adoc +++ b/modules/ROOT/pages/maven-reference.adoc @@ -62,7 +62,7 @@ To configure the public MuleSoft repositories, add the following to your project anypoint-exchange Anypoint Exchange - https://maven.anypoint.mulesoft.com/api/v1/maven + https://maven.anypoint.mulesoft.com/api/v3/maven default From 0b542aaf8e07aafdd043f0ab24d87cfb8a3fd997 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 3 Sep 2024 12:32:29 -0300 Subject: [PATCH 063/119] W-15595263-sharedResources-44-dm --- modules/ROOT/pages/shared-resources.adoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ROOT/pages/shared-resources.adoc b/modules/ROOT/pages/shared-resources.adoc index 906b46af8b..b6e8288204 100644 --- a/modules/ROOT/pages/shared-resources.adoc +++ b/modules/ROOT/pages/shared-resources.adoc @@ -5,7 +5,7 @@ endif::[] :keywords: anypoint studio, shared resources, domains, multiple applications, share ports, domain project :page-aliases: tuning-domains.adoc -When you deploy Mule on premises, you can define global configurations such as default error handlers, shared properties, scheduler pools, and connector configurations to be shared among all applications deployed under the same domain. To do so, create a Mule domain and then reference it from each application. As a result, each app now associated with the Mule domain can access shared resources in the domain. + +When you deploy Mule on premises, you can define global configurations such as shared properties, scheduler pools, and connector configurations to be shared among all applications deployed under the same domain. To do so, create a Mule domain and then reference it from each application. As a result, each app now associated with the Mule domain can access shared resources in the domain. + Note that Mule apps are associated with only one domain at a time. Using domains greatly enhances performance when you deploy multiple services on the same on-premises Mule runtime engine (Mule). By providing a centralized point for all the shared resources, domains make the class-loading process (and, therefore, metaspace memory usage) more efficient, especially because domain dependencies declared in the `pom.xml` file are also shared in the domain apps. @@ -292,4 +292,3 @@ Imagine that you have a set of HTTP Proxy applications that also apply one API G You can greatly improve this outcome by using a domain that shares the backend server configuration, increasing the number of applications to beyond 100 while also experiencing a balanced use of machine resources and consistent good performance. Note that despite the clear performance advantage in using domains, each deployed application adds its own unique complexity to the shared infrastructure resources. To avoid performance impact, before adding an application, identify the overhead by testing each application individually and then test it coexisting with other applications. - From fe0802c5a6e49db6fed410d91124cc83b934fdd0 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 5 Sep 2024 16:21:58 -0300 Subject: [PATCH 064/119] W-15256317-noteInCronExpressions44-dm --- modules/ROOT/pages/scheduler-concept.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/scheduler-concept.adoc b/modules/ROOT/pages/scheduler-concept.adoc index 1b2c83a5ec..7c5209f402 100644 --- a/modules/ROOT/pages/scheduler-concept.adoc +++ b/modules/ROOT/pages/scheduler-concept.adoc @@ -238,6 +238,8 @@ The Scheduler component also supports Quartz Scheduler special characters: //source info: +http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html+ +See https://www.quartz-scheduler.org/api/2.3.0/org/quartz/CronExpression.html[CronExpression] for more information. + This example logs the message "hello" every second: [source,XML,linenums] From aead8ce2795524fae2cae22787e8121c28e50bc2 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 10 Sep 2024 13:15:04 -0300 Subject: [PATCH 065/119] W-16710688-custom Properties-44-dm --- .../custom-configuration-properties-provider.adoc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/modules/ROOT/pages/custom-configuration-properties-provider.adoc b/modules/ROOT/pages/custom-configuration-properties-provider.adoc index a55fb597b6..7c28aa8f1e 100644 --- a/modules/ROOT/pages/custom-configuration-properties-provider.adoc +++ b/modules/ROOT/pages/custom-configuration-properties-provider.adoc @@ -184,20 +184,17 @@ Follow these steps to customize the Mule SDK Module: . Open the `pom.xml` file: .. Define the GAV (`groupId`, `artifactId`, and `version`) of your module. .. Define the `name` of your module. +.. Review the minimum Mule version you want your properties provider to require. This example is compatible with Mule 4.1.1 and later to cover all possible scenarios. See xref:mule-sdk::choosing-version.adoc[Choosing the SDK Version]. . Change the package name (`com.my.company.custom.provider.api`) of your code. -. Open `resources/META-INF/mule-artifact/mule-artifact.json`: -.. Set the `type` field with value `com.my.company.custom.provider.api.CustomConfigurationPropertiesExtensionLoadingDelegate`, replacing `com.my.company.custom.provider.api` to match the package name you changed previously. -.. Set the `name` field using the name you want to define for the module. -.. Set the `exportedPackages` field to match the package name you changed previously. . Open `resources/META-INF/services/org.mule.runtime.config.api.dsl.model.properties.ConfigurationPropertiesProviderFactory`, and change the content to match the package name you changed previously. -. Open the `CustomConfigurationPropertiesExtensionLoadingDelegate` class: +. Open the `CustomConfigurationPropertiesExtension` class: .. Change the `EXTENSION_NAME` constant to the name of your module. -.. Change the `fromVendor` method parameter to your company name. +.. Change the `vendor` method parameter on the `@Extension` annotation to your company name. .. Customize the section at the end to define the parameters that can be configured in the `config` element of your module. . Open the `CustomConfigurationPropertiesProviderFactory` class: .. Change the `CUSTOM_PROPERTIES_PREFIX` value to a meaningful prefix for the configuration properties that your module must resolve. .. Change the class implementation to look up the properties from your custom source. -. Update `CustomPropertiesProviderOperationsTestCase` with more test cases to cover your new module functionality. +. Update the MUnit test cases in `test/munit` with more test cases to cover your new module functionality. Once your module is ready, you can install it locally using `mvn clean install` to make the module accessible from Studio. From f777ea8c89fbef6e39f40d76aa4517203237c100 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 11 Sep 2024 18:33:40 -0300 Subject: [PATCH 066/119] W-16727759-ConnectionProvidersNote-44-dm --- .../ROOT/pages/custom-configuration-properties-provider.adoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/custom-configuration-properties-provider.adoc b/modules/ROOT/pages/custom-configuration-properties-provider.adoc index 7c28aa8f1e..404e115a2a 100644 --- a/modules/ROOT/pages/custom-configuration-properties-provider.adoc +++ b/modules/ROOT/pages/custom-configuration-properties-provider.adoc @@ -217,4 +217,7 @@ You can now configure your new component and start using properties with the pre == Using Custom Configuration Properties Provider versus a Connector -For static properties, use the properties provider approach, because static properties do not change during runtime. If your properties might change during runtime, create a connector that can provide the value as one of its operations. +For static properties, use the properties provider approach, because static properties don't change during runtime. If your properties might change during runtime, create a connector that can provide the value as one of its operations. + +[NOTE] +Although the xref:mule-sdk::getting-started.adoc[Mule SDK for Java] is used to implement a custom configuration properties provider, you can't use xref:mule-sdk::connections.adoc[ConnectionProviders] to connect to external sources. This is because `ConnectionProviders` are managed by Mule runtime and are initialized at a later stage, after the static properties are resolved. Consequently, connectivity testing isn't supported for custom properties providers. \ No newline at end of file From 0c6d51594e29540fedd7ee343ed6a6bd60cd4994 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 17 Sep 2024 13:21:05 -0300 Subject: [PATCH 067/119] W-16769013-ARMarchitectureSupported-44-dm --- modules/ROOT/pages/hardware-and-software-requirements.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/hardware-and-software-requirements.adoc b/modules/ROOT/pages/hardware-and-software-requirements.adoc index 806bb8ba9f..74f64d1821 100644 --- a/modules/ROOT/pages/hardware-and-software-requirements.adoc +++ b/modules/ROOT/pages/hardware-and-software-requirements.adoc @@ -14,7 +14,7 @@ If you plan to install Mule and run it on premises, review these minimum hardwar Adjust RAM to match your latency requirements and the size and number of simultaneous messages that applications process. -Mule supports the x86 and x64 architectures but does not yet support the ARM architecture. +Mule supports the x86, x64, and ARM architectures. == Required Software From e7499401f5674df0dc2cdc202de4e1dab425cfd3 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 17 Sep 2024 17:07:31 -0300 Subject: [PATCH 068/119] W-13521538-GCMnotSupported-44-dm --- modules/ROOT/pages/cryptography-jce.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/cryptography-jce.adoc b/modules/ROOT/pages/cryptography-jce.adoc index 669dbe9d58..b3f40b5b97 100644 --- a/modules/ROOT/pages/cryptography-jce.adoc +++ b/modules/ROOT/pages/cryptography-jce.adoc @@ -210,7 +210,7 @@ For example, you can set Content to `#[payload.name]` to decrypt only an encrypt | Streaming Strategy a| * <> * <> * non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Cipher a| String | A raw cipher string in the form "algorithm/mode/padding" according to the Java crypto documentation, for example `AES/CBC/PKCS5Padding`. Note that not all combinations are valid. | | {nbsp} +| Cipher a| String | A raw cipher string in the form "algorithm/mode/padding" according to the Java crypto documentation, for example `AES/CBC/PKCS5Padding`. Note that GCM mode is currently not supported, and not all algorithm/mode/padding combinations are valid. | | {nbsp} | Algorithm a| Enumeration, one of: ** `AES` @@ -273,7 +273,7 @@ For example, you can set Content to `#[payload.name]` to encrypt only a variable | Streaming Strategy a| * <> * <> * non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Cipher a| String | A raw cipher string in the form "algorithm/mode/padding" according to the Java crypto documentation, for example `AES/CBC/PKCS5Padding`. Note that not all combinations are valid. | | {nbsp} +| Cipher a| String | A raw cipher string in the form "algorithm/mode/padding" according to the Java crypto documentation, for example `AES/CBC/PKCS5Padding`. Note that GCM mode is currently not supported, and not all algorithm/mode/padding combinations are valid. | | {nbsp} | Algorithm a| Enumeration, one of: ** `AES` From 98730fec2cb4cc2532fba86ab927bccf23d0c52f Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 1 Oct 2024 16:50:33 -0300 Subject: [PATCH 069/119] W-16762264-extendedSupport-44-dm --- antora.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/antora.yml b/antora.yml index 51ebc744b1..86319309cb 100644 --- a/antora.yml +++ b/antora.yml @@ -4,3 +4,6 @@ version: '4.4' display_version: '4.4' nav: - modules/ROOT/nav.adoc +asciidoc: + attributes: + supportStatus: extendedSupportVersion From 54008fb4ff90a9c1de273c8040b355f43d8c16b9 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 6 Nov 2024 17:08:36 -0300 Subject: [PATCH 070/119] W-17150205-mmp-memoryLimit-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc index 9ccff7f262..f1ae233885 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc @@ -244,6 +244,7 @@ Configuration example: If a `reserved` configuration is present, ensure that this value is equal or higher. .2+! `memory` ! `reserved` ! Specifies the amount of memory to allocate for each application replica. The default value is 700 MB. + ! `limit` ! Specifies the maximum memory allocated per application replica. If a `reserved` configuration is present, ensure that this value is equal or higher. !=== Configuration example: [source,xml,linenums] From 1dbc4adf85bb2b0b180d08465b41be164f8f1897 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 22 Nov 2024 15:38:13 -0300 Subject: [PATCH 071/119] W-17298080-ARMarchitectureNOTsupported-44-dm --- modules/ROOT/pages/hardware-and-software-requirements.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/hardware-and-software-requirements.adoc b/modules/ROOT/pages/hardware-and-software-requirements.adoc index 74f64d1821..db8e693a5a 100644 --- a/modules/ROOT/pages/hardware-and-software-requirements.adoc +++ b/modules/ROOT/pages/hardware-and-software-requirements.adoc @@ -14,7 +14,7 @@ If you plan to install Mule and run it on premises, review these minimum hardwar Adjust RAM to match your latency requirements and the size and number of simultaneous messages that applications process. -Mule supports the x86, x64, and ARM architectures. +Mule supports the x86 and x64 architectures. == Required Software From 7355843b6e142dd0a3fe7c1a85bfe1098ce2be71 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 26 Nov 2024 13:07:44 -0300 Subject: [PATCH 072/119] W-17313080-scopeLoggingConfigurations-logLevel-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 13a03fb9fb..ee0413ec7e 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -140,7 +140,7 @@ Example values: `4.3.0`, `4.2.2-hf4` | Yes !=== .2+! `scopeLoggingConfiguration` ! `scope` ! The package of the logging library to use. -! `logLevel` ! The log level. Accepted values: `NONE`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`. +! `logLevel` ! The log level. Accepted values: `INFO`, `DEBUG`, `WARN`, `ERROR`, `FATAL`. !=== Configuration example: From f263e676559e90a8296e280b97c8e5383920d9bd Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 29 Nov 2024 15:20:58 -0300 Subject: [PATCH 073/119] W-16648686-storeprofile-property-44-dm --- modules/ROOT/pages/migration-cheat-sheet.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/migration-cheat-sheet.adoc b/modules/ROOT/pages/migration-cheat-sheet.adoc index fc79555801..018a1b40c9 100644 --- a/modules/ROOT/pages/migration-cheat-sheet.adoc +++ b/modules/ROOT/pages/migration-cheat-sheet.adoc @@ -30,4 +30,4 @@ To help you move from Mule 3 to Mule 4, we built this index to help you find the * Migrating custom components: You can use the xref:mule-sdk::index.adoc[Mule SDK] to create your own reusable components * Migrating DevKit based components: There's a xref:mule-sdk::dmt.adoc[DevKit Migration Tool] that helps to migrate DevKit projects for Mule 3 into Mule SDK ones. * xref:migration-transports.adoc[Transport service overrides]: Covers how to migrate from generic transports. - +* xref:mule-high-availability-ha-clusters.adoc#configure-the-performance-profile[]: At a container level, change the property from `mule.clusterPartitioningMode=OPTIMIZE_PERFORMANCE` to `mule.cluster.storeprofile=performance`. At an individual application level, you can configure the store profile for a specific Mule application. \ No newline at end of file From 4c4f5d77fda159ea9e9343d787c215961efe9881 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Wed, 11 Dec 2024 17:41:30 -0300 Subject: [PATCH 074/119] W-17413964-mention-on-prem-44-dm --- modules/ROOT/pages/choosing-the-right-clustering-topology.adoc | 2 +- .../ROOT/pages/creating-and-managing-a-cluster-manually.adoc | 2 +- modules/ROOT/pages/hadr-guide.adoc | 2 +- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc b/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc index 5e705af124..e65c0d87d2 100644 --- a/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc +++ b/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc @@ -4,7 +4,7 @@ include::_attributes.adoc[] endif::[] :keywords: deploy, cloudhub, on premises, on premise, clusters -You can deploy Mule in many different topologies. As you build your Mule application, it is important to think critically about how best to architect your application to achieve the desired availability, fault tolerance, and performance characteristics. This page outlines some of the solutions for achieving the right blend of these characteristics through clustering. There is no one correct approach for everyone, and designing your system is both an art and a science. If you need more assistance, MuleSoft Professional Services can help you by reviewing your architecture plan or designing it for you. For more information, http://www.mulesoft.com/contact[contact us]. +You can deploy Mule in many different topologies. As you build your Mule application, it is important to think critically about how best to architect your application to achieve the desired availability, fault tolerance, and performance characteristics. This page outlines some of the solutions for achieving the right blend of these characteristics through clustering when you deploy applications on-premises. There is no one correct approach for everyone, and designing your system is both an art and a science. If you need more assistance, MuleSoft Professional Services can help you by reviewing your architecture plan or designing it for you. For more information, http://www.mulesoft.com/contact[contact us]. == About Clustering diff --git a/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc b/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc index 29b92c9fa0..8b3e01be34 100644 --- a/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc +++ b/modules/ROOT/pages/creating-and-managing-a-cluster-manually.adoc @@ -4,7 +4,7 @@ include::_attributes.adoc[] endif::[] :keywords: cluster, deploy -There are two ways to create and manage clusters: +There are two ways to create and manage clusters for on-premises deployments: * Using Runtime Manager + diff --git a/modules/ROOT/pages/hadr-guide.adoc b/modules/ROOT/pages/hadr-guide.adoc index 9cc6300149..f9d2059751 100644 --- a/modules/ROOT/pages/hadr-guide.adoc +++ b/modules/ROOT/pages/hadr-guide.adoc @@ -122,7 +122,7 @@ There are two or more Mule environments, however they are part of the same clust |None - There is no service downtime. |=== -== High-Availability Deployment Models +== High-Availability for On-Premises Deployment Models * <> * <> diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 2493ab96bc..33ca24c462 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -7,7 +7,7 @@ endif::[] [IMPORTANT] For an equivalent to clustering in CloudHub, see xref:runtime-manager::cloudhub-fabric.adoc[CloudHub HA] for details about how workers can be shared or doubled to scale your application and provide high availability. -Mule Enterprise Edition supports scalable clustering to provide high availability (HA) for applications. +Mule Enterprise Edition supports scalable clustering to provide high availability (HA) for on-premises applications. A cluster is a set of Mule runtime engines that acts as a unit. In other words, a cluster is a virtual server composed of multiple nodes (Mule runtime engines). The nodes in a cluster communicate and share Object Store and VM queue data through a distributed shared memory grid. This means that the data is replicated across memory in different machines. From 7a3d6203b7831f738328a42ef69ed740b2348abb Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Wed, 11 Dec 2024 17:55:31 -0300 Subject: [PATCH 075/119] Update modules/ROOT/pages/choosing-the-right-clustering-topology.adoc Co-authored-by: Duke --- modules/ROOT/pages/choosing-the-right-clustering-topology.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc b/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc index e65c0d87d2..fe6e59d4d7 100644 --- a/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc +++ b/modules/ROOT/pages/choosing-the-right-clustering-topology.adoc @@ -4,7 +4,7 @@ include::_attributes.adoc[] endif::[] :keywords: deploy, cloudhub, on premises, on premise, clusters -You can deploy Mule in many different topologies. As you build your Mule application, it is important to think critically about how best to architect your application to achieve the desired availability, fault tolerance, and performance characteristics. This page outlines some of the solutions for achieving the right blend of these characteristics through clustering when you deploy applications on-premises. There is no one correct approach for everyone, and designing your system is both an art and a science. If you need more assistance, MuleSoft Professional Services can help you by reviewing your architecture plan or designing it for you. For more information, http://www.mulesoft.com/contact[contact us]. +You can deploy Mule in many different topologies. As you build your Mule application, it is important to think critically about how best to architect your application to achieve the desired availability, fault tolerance, and performance characteristics. This page outlines some of the solutions for achieving the right blend of these characteristics through clustering when you deploy applications on premises. There is no one correct approach for everyone, and designing your system is both an art and a science. If you need more assistance, MuleSoft Professional Services can help you by reviewing your architecture plan or designing it for you. For more information, http://www.mulesoft.com/contact[contact us]. == About Clustering From e82830bb01f7bd9b65a5b73fb06c2b4b99fc22d8 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 23 Dec 2024 16:49:06 -0300 Subject: [PATCH 076/119] W-14654664-FIPS-OSnotSupported-44-dm # Writer's Quality Checklist Before merging your PR, did you: - [ ] Run spell checker - [ ] Run link checker to check for broken xrefs - [ ] Check for orphan files - [ ] Perform a local build and do a final visual check of your content, including checking for: - Broken images - Dead links - Correct rendering of partials if they are used in your content - Formatting issues, such as: - Misnumbered ordered lists (steps) or incorrectly nested unordered lists - Messed up tables - Proper indentation - Correct header levels - [ ] Receive final review and signoff from: - Technical SME - Product Manager - Editor or peer reviewer - Reporter, if this content is in response to a reported issue (internal or external feedback) - [ ] If applicable, verify that the software actually got released --- .vscode/settings.json | 18 ++++++++++++++++++ .../pages/fips-140-2-compliance-support.adoc | 18 +++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..94b55862b9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + "**/.apivcs": true, + "**/.gitignore": true, + "**/.designer.json": true, + "**/.exchange.xml": true, + "**/.vscode": true, + "**/.mvn": true, + "**/.exchange_modules_tmp": true, + ".mule": true + } +} \ No newline at end of file diff --git a/modules/ROOT/pages/fips-140-2-compliance-support.adoc b/modules/ROOT/pages/fips-140-2-compliance-support.adoc index c81bb59363..72e5541a46 100644 --- a/modules/ROOT/pages/fips-140-2-compliance-support.adoc +++ b/modules/ROOT/pages/fips-140-2-compliance-support.adoc @@ -4,14 +4,14 @@ include::_attributes.adoc[] endif::[] :keywords: fips, certifications, security -The Mule 4 Runtime can be configured to run in a FIPS 140-2 certified environment. This includes all Runtime connectors, such as HTTP connector. Note that Mule does not run in FIPS security mode by default. There are two requirements: +The Mule 4 Runtime can be configured to run in a FIPS 140-2 certified environment. This includes all Runtime connectors, such as HTTP connector. Note that Mule doesn't run in FIPS security mode by default. There are two requirements: * Have a certified cryptography module installed in your Java environment * Adjust Mule Runtime settings to run in FIPS security mode [NOTE] -- -By default, Government Cloud is configured for FIPS 140-2, so you do not need to perform the following steps if you are using Government Cloud. +By default, Government Cloud is configured for FIPS 140-2, so you don't need to perform the following steps if you are using Government Cloud. If you are using Runtime Fabric, see xref:runtime-fabric::enable-fips-140-2-compliance.adoc[Enabling FIPS 140-2 Compliance Mode for Runtime Fabric] instead of performing these steps. -- @@ -23,7 +23,7 @@ This document assumes that you are familiar with http://csrc.nist.gov/publicatio [[set_up_environment]] == Setting Up a FIPS 140-2 Java Environment -Mule relies on the Java runtime to provide a FIPS-compliant security module, which is why the first requirement is to have a FIPS 140-2 Java environment properly set up. If you are setting up your system for FIPS compliance for the first time and you have not already configured a certified security provider, you must first https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules[select and obtain one], then set up your Java environment following the instructions specific to your selected provider. +Mule relies on the Java runtime to provide a FIPS-compliant security module, which is why the first requirement is to have a FIPS 140-2 Java environment properly set up. If you are setting up your system for FIPS compliance for the first time and you haven't already configured a certified security provider, you must first https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules[select and obtain one], then set up your Java environment following the instructions specific to your selected provider. Details for this process vary according to your selected security provider. Please refer to the documentation for your security provider for complete instructions. @@ -93,24 +93,24 @@ To configure the cipher suite used by on-prem Mule installations, see <'. You are running in FIPS mode, so please verify that the algorithm is compliant with FIPS. .... * Keep in mind that your different environments might have different security configurations, including different encryption schemes and algorithm selections. So you might see this error in certain environments (but not others), depending on how they are set up. +* Similarly, enabling FIPS at the OS level, such as in Red Hat, causes compatibility issues and isn't supported. == See Also -https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules[Validated FIPS-2 Cryptographic Modules] - -http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf[Approved Cryptographic Algorithms] +* https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules[Validated FIPS-2 Cryptographic Modules] +* http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf[Approved Cryptographic Algorithms] From c596bbaa5de0572411e3e60a9b1e2094661fa92b Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 23 Dec 2024 16:56:16 -0300 Subject: [PATCH 077/119] Update modules/ROOT/pages/fips-140-2-compliance-support.adoc --- modules/ROOT/pages/fips-140-2-compliance-support.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/fips-140-2-compliance-support.adoc b/modules/ROOT/pages/fips-140-2-compliance-support.adoc index 72e5541a46..41155b0a69 100644 --- a/modules/ROOT/pages/fips-140-2-compliance-support.adoc +++ b/modules/ROOT/pages/fips-140-2-compliance-support.adoc @@ -108,7 +108,7 @@ Open the relevant file and comment or uncomment items in the lists to manually c the algorithm is compliant with FIPS. .... * Keep in mind that your different environments might have different security configurations, including different encryption schemes and algorithm selections. So you might see this error in certain environments (but not others), depending on how they are set up. -* Similarly, enabling FIPS at the OS level, such as in Red Hat, causes compatibility issues and isn't supported. +* Similarly, enabling FIPS at the OS level, such as on Red Hat, isn't supported as it causes cipher suite errors during license validation. == See Also From 0a59502e13472a497c18a4b2067fb038404b82e3 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 23 Dec 2024 17:20:20 -0300 Subject: [PATCH 078/119] Delete .vscode/settings.json --- .vscode/settings.json | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 94b55862b9..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "**/Thumbs.db": true, - "**/.apivcs": true, - "**/.gitignore": true, - "**/.designer.json": true, - "**/.exchange.xml": true, - "**/.vscode": true, - "**/.mvn": true, - "**/.exchange_modules_tmp": true, - ".mule": true - } -} \ No newline at end of file From cd98447960d0ad48831c70ff494659184bbe1da5 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 17 Jan 2025 17:55:15 -0300 Subject: [PATCH 079/119] W-17550211-providerParameterDescription-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 2 +- modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index ee0413ec7e..6aaa38076b 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -160,7 +160,7 @@ Configuration example: | No | `target` | The CloudHub 2.0 target name to deploy the app to. + Specify either a shared space or a private space available in your Deployment Target values in CloudHub 2.0. See xref:cloudhub-2::ch2-features.adoc[Features of CloudHub 2.0] for a detailed description on shared and private spaces. Use a target name value from the xref:cloudhub-2::ch2-architecture.adoc#regions-and-dns-records[list of regions]. For example, `Cloudhub-US-East-1`. | Yes -| `provider` | Set to `MC`, for CloudHub 2.0. | Yes +| `provider` | Provider MC (MuleSoft Control Plane) indicates that the deployment is managed through Anypoint Runtime Manager. Set to `MC`, for CloudHub 2.0. | Yes | `environment` | Target Anypoint Platform environment. + This value must match an environment configured in your Anypoint Platform account, as shown here: + [source,xml,linenums] diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc index f1ae233885..4637f2f451 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc @@ -147,7 +147,7 @@ Example values: `4.3.0`, `4.2.2-hf4` | Yes | `password` | Your Anypoint Platform password | Only when using Anypoint Platform credentials to login. | `applicationName` | The application name displayed in Runtime Manager after the app deploys. | Yes | `target` | The Runtime Fabric target name where to deploy the app. | Yes -| `provider` | Set to `MC`, for Runtime Fabric. | Yes +| `provider` | Provider MC (MuleSoft Control Plane) indicates that the deployment is managed through Anypoint Runtime Manager. Set to `MC`, for Runtime Fabric. | Yes | `environment` | Target Anypoint Platform environment. + This value must match an environment configured in your Anypoint Platform account, as shown here: + [source,xml,linenums] From 33ee3407a32aef12012379cb4fc069dd2cf629be Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 17 Jan 2025 18:08:20 -0300 Subject: [PATCH 080/119] w-17550211-typo --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 2 +- modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 6aaa38076b..6de6f2d0a5 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -160,7 +160,7 @@ Configuration example: | No | `target` | The CloudHub 2.0 target name to deploy the app to. + Specify either a shared space or a private space available in your Deployment Target values in CloudHub 2.0. See xref:cloudhub-2::ch2-features.adoc[Features of CloudHub 2.0] for a detailed description on shared and private spaces. Use a target name value from the xref:cloudhub-2::ch2-architecture.adoc#regions-and-dns-records[list of regions]. For example, `Cloudhub-US-East-1`. | Yes -| `provider` | Provider MC (MuleSoft Control Plane) indicates that the deployment is managed through Anypoint Runtime Manager. Set to `MC`, for CloudHub 2.0. | Yes +| `provider` | Provider MC (MuleSoft Control Plane) indicates that the deployment is managed through Anypoint Runtime Manager. Set to `MC` for CloudHub 2.0. | Yes | `environment` | Target Anypoint Platform environment. + This value must match an environment configured in your Anypoint Platform account, as shown here: + [source,xml,linenums] diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc index 4637f2f451..4273bcc664 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc @@ -147,7 +147,7 @@ Example values: `4.3.0`, `4.2.2-hf4` | Yes | `password` | Your Anypoint Platform password | Only when using Anypoint Platform credentials to login. | `applicationName` | The application name displayed in Runtime Manager after the app deploys. | Yes | `target` | The Runtime Fabric target name where to deploy the app. | Yes -| `provider` | Provider MC (MuleSoft Control Plane) indicates that the deployment is managed through Anypoint Runtime Manager. Set to `MC`, for Runtime Fabric. | Yes +| `provider` | Provider MC (MuleSoft Control Plane) indicates that the deployment is managed through Anypoint Runtime Manager. Set to `MC` for Runtime Fabric. | Yes | `environment` | Target Anypoint Platform environment. + This value must match an environment configured in your Anypoint Platform account, as shown here: + [source,xml,linenums] From e2280815faa103de3274df95f89a6a0c2577b5e3 Mon Sep 17 00:00:00 2001 From: Kevin Troller Date: Wed, 5 Feb 2025 09:59:22 -0300 Subject: [PATCH 081/119] W-17732216-crypto-4.4-kt --- modules/ROOT/pages/cryptography-jce.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/cryptography-jce.adoc b/modules/ROOT/pages/cryptography-jce.adoc index b3f40b5b97..877e667dad 100644 --- a/modules/ROOT/pages/cryptography-jce.adoc +++ b/modules/ROOT/pages/cryptography-jce.adoc @@ -176,7 +176,7 @@ JCE configuration for Java keystores and inline keys. |=== | Name | Type | Description | Default Value | Required |Name | String | The name for this configuration. Connectors reference the configuration with this name. | | *x*{nbsp} -| Keystore a| String | +++Path to the keystore file.+++ | | {nbsp} +| Keystore a| String | +++Path to the keystore file.+++ | | X | Type a| Enumeration, one of: ** `JKS` From b250befdf965b9902eff9cee441b2545b900210a Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 17 Feb 2025 14:12:50 -0300 Subject: [PATCH 082/119] W-17844559-chNOTEinDeployment-44-dm --- modules/ROOT/pages/deploying.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/ROOT/pages/deploying.adoc b/modules/ROOT/pages/deploying.adoc index 5e0ae1cf61..c35f271686 100644 --- a/modules/ROOT/pages/deploying.adoc +++ b/modules/ROOT/pages/deploying.adoc @@ -52,6 +52,9 @@ In addition, different tools are available to deploy applications to each of the |=== +[NOTE] +After End of Extended Support for Mule runtime 4.3 and 4.4, Mule applications deployed to CloudHub or CloudHub 2.0 environments are no longer accessible. + == See Also * xref:runtime-manager::cloudhub.adoc[CloudHub] From c7a08eaba8da75a2045398d7b17c59d2f80d86c9 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:23:43 -0300 Subject: [PATCH 083/119] Update modules/ROOT/pages/deploying.adoc --- modules/ROOT/pages/deploying.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploying.adoc b/modules/ROOT/pages/deploying.adoc index c35f271686..23807d7cbf 100644 --- a/modules/ROOT/pages/deploying.adoc +++ b/modules/ROOT/pages/deploying.adoc @@ -53,7 +53,7 @@ In addition, different tools are available to deploy applications to each of the |=== [NOTE] -After End of Extended Support for Mule runtime 4.3 and 4.4, Mule applications deployed to CloudHub or CloudHub 2.0 environments are no longer accessible. +After End of Extended Support for Mule runtime 4.4, Mule applications deployed to CloudHub or CloudHub 2.0 environments are no longer accessible. == See Also From c511cc28a46711bab5cc4cd9d953331bf6555613 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Thu, 20 Feb 2025 13:50:29 -0300 Subject: [PATCH 084/119] W-17531509-addNOTE-44-dm --- modules/ROOT/pages/reconnection-strategy-about.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/ROOT/pages/reconnection-strategy-about.adoc b/modules/ROOT/pages/reconnection-strategy-about.adoc index e6e3d562fa..02e50cd937 100644 --- a/modules/ROOT/pages/reconnection-strategy-about.adoc +++ b/modules/ROOT/pages/reconnection-strategy-about.adoc @@ -11,6 +11,9 @@ For example, if an operation in Anypoint Connector for FTP (FTP Connector) fails You can modify this default behavior by configuring a reconnection strategy for the operation. +[NOTE] +Operation executions don't trigger the reconnection strategy configured at the FTP Connector when failing with connectivity errors. In this example, the reconnection strategy applies only to the connection that `ftp:listener` needs to establish with the FTP server to query for new or updated files. + == Configure an Operation Reconnection Strategy You can configure a reconnection strategy for an operation either by modifying the operation properties or by modifying the configuration of the global element for the operation. For example, you can configure a reconnection strategy in an FTP Connector configuration: From 0482a0cfadd8e6e014be68793ab2c278db96a52f Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 21 Feb 2025 16:37:46 -0300 Subject: [PATCH 085/119] W-17790344-addStudioTOdeployments-44-dm --- modules/ROOT/pages/deploying.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/pages/deploying.adoc b/modules/ROOT/pages/deploying.adoc index 23807d7cbf..2ad5a8b2b0 100644 --- a/modules/ROOT/pages/deploying.adoc +++ b/modules/ROOT/pages/deploying.adoc @@ -26,6 +26,7 @@ In addition, different tools are available to deploy applications to each of the * No installation of Mule runtime engine is required, because CloudHub workers start Mule instances as part of the deployment process. |CloudHub 2.0 | +* Anypoint Studio * Anypoint Runtime Manager * Anypoint Platform CLI * Mule Maven plugin From 4a3bf28e287f21256a29b369efc01d656f78de22 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 28 Feb 2025 12:55:52 -0300 Subject: [PATCH 086/119] W-17934734-CHnote-44-dm --- modules/ROOT/pages/deploying.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deploying.adoc b/modules/ROOT/pages/deploying.adoc index 2ad5a8b2b0..739322352e 100644 --- a/modules/ROOT/pages/deploying.adoc +++ b/modules/ROOT/pages/deploying.adoc @@ -54,7 +54,7 @@ In addition, different tools are available to deploy applications to each of the |=== [NOTE] -After End of Extended Support for Mule runtime 4.4, Mule applications deployed to CloudHub or CloudHub 2.0 environments are no longer accessible. +After End of Extended Support for Mule runtime 4.4, Mule applications deployed to CloudHub or CloudHub 2.0 environments are stopped. == See Also From c8a4fbed0f7dc69b5d850dc0fde65356936b9c8e Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 28 Feb 2025 14:08:28 -0300 Subject: [PATCH 087/119] W-17883108-Update-feature-flagging-44-dm --- modules/ROOT/pages/feature-flagging.adoc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/ROOT/pages/feature-flagging.adoc b/modules/ROOT/pages/feature-flagging.adoc index 81710c6c58..42825ebb4b 100644 --- a/modules/ROOT/pages/feature-flagging.adoc +++ b/modules/ROOT/pages/feature-flagging.adoc @@ -356,6 +356,22 @@ Suppressed errors are treated as underlying causes that can also be matched by O *Issue ID* * W-11855052 + +<.^|`mule.forkJoin.completeChildContextsOnTimeout` +|When enabled, the processors that perform fork and join work (currently, Scatter-Gather and Parallel For Each routers) complete the child event contexts when a timeout occurs. + +*Available Since* + +* 4.4.0-20250217 + +*Enabled by Default Since* + +* Not enabled by default in any Mule version + +*Issue ID* + +* W-16941297 + |=== == See Also From ad06f0af1b1de8ca9e2708c09e9863f0a1764f41 Mon Sep 17 00:00:00 2001 From: Gary Cheung Date: Wed, 5 Mar 2025 17:11:35 -0800 Subject: [PATCH 088/119] Update nav.adoc (#2949) --- modules/ROOT/nav.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 2b95581e36..3a8419e311 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -31,7 +31,7 @@ include::partial$nav-app-dev.adoc[] *** xref:tuning-backend-server.adoc[Backend Server Response Time] *** xref:tuning-caching.adoc[Caching] *** xref:tuning-pooling-profiles.adoc[Pooling Profiles] - *** xref:tuning-domains.adoc[Domains] + *** xref:shared-resources.adoc[Domains] *** xref:tuning-logging.adoc[Logging] *** xref:tuning-batch-processing.adoc[Batch Processing] *** xref:tuning-app-design.adoc[App Design] From 2ec3d59e660ba51dfdf2862d41606b059c542c11 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Mon, 10 Mar 2025 18:12:26 -0300 Subject: [PATCH 089/119] W-17980558-fixTypo-44-dm --- modules/ROOT/pages/mule-deployment-model.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/mule-deployment-model.adoc b/modules/ROOT/pages/mule-deployment-model.adoc index 9f3cf4b338..68ab92cafa 100644 --- a/modules/ROOT/pages/mule-deployment-model.adoc +++ b/modules/ROOT/pages/mule-deployment-model.adoc @@ -58,7 +58,7 @@ To reload an application, you can: For example, if you want to modify one of your custom classes, make your changes to the custom class, copy the updated class to the java directory, and then `touch` the anchor file. -== Communication Between Mule Instances and the Management Pane +== Communication Between Mule Instances and the Management Plane Mule instances run independently from the Management pane to execute integration logic and serve API requests. This architecture enables you to deploy Mule runtime engine strategically and ensures that it is not a bottleneck to communications. + When an event occurs that causes the Mule instances to become disconnected from the Management pane, the instances continue to run as designed to execute integration and serve APIs without interruption. However, new or updated policies are not pulled and updated until the connection is reestablished. From 2b6b2bca15f063ed034904e0c2e9c60b968d07fd Mon Sep 17 00:00:00 2001 From: dmerlo Date: Fri, 14 Mar 2025 14:40:40 -0300 Subject: [PATCH 090/119] W-18039883-MMPaddRepository-44-dm --- modules/ROOT/pages/maven-reference.adoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/ROOT/pages/maven-reference.adoc b/modules/ROOT/pages/maven-reference.adoc index 01aa1ff63a..e6975d38a5 100644 --- a/modules/ROOT/pages/maven-reference.adoc +++ b/modules/ROOT/pages/maven-reference.adoc @@ -71,6 +71,12 @@ To configure the public MuleSoft repositories, add the following to your project https://repository.mulesoft.org/releases/ default + + mulesoft-public + MuleSoft Public Repository + https://repository.mulesoft.org/nexus/content/repositories/public/ + default + From 0aa690912271e16cb1e6b43d7e3156977e08ee9f Mon Sep 17 00:00:00 2001 From: Sathya Gadhiraju Date: Tue, 18 Mar 2025 10:27:29 -0700 Subject: [PATCH 091/119] fix --- modules/ROOT/pages/about-classloading-isolation.adoc | 2 +- modules/ROOT/pages/distributed-locking.adoc | 2 +- modules/ROOT/pages/execution-engine.adoc | 2 +- modules/ROOT/pages/migration-transports.adoc | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/about-classloading-isolation.adoc b/modules/ROOT/pages/about-classloading-isolation.adoc index b8717a157d..1a32d05273 100644 --- a/modules/ROOT/pages/about-classloading-isolation.adoc +++ b/modules/ROOT/pages/about-classloading-isolation.adoc @@ -145,4 +145,4 @@ See xref:mmp-concept.adoc#configure-plugin-dependencies[Configure Plugin Depende == See Also * xref:3.9@mule-runtime::classloader-control-in-mule.adoc[Mule 3 Class-loading] -* xref:1.1@mule-sdk::isolation.adoc[Mule SDK - About Class-loading Isolation] +* xref:mule-sdk::isolation.adoc[Mule SDK - About Class-loading Isolation] diff --git a/modules/ROOT/pages/distributed-locking.adoc b/modules/ROOT/pages/distributed-locking.adoc index 0e44751d15..620eed32e2 100644 --- a/modules/ROOT/pages/distributed-locking.adoc +++ b/modules/ROOT/pages/distributed-locking.adoc @@ -4,7 +4,7 @@ include::_attributes.adoc[] endif::[] :keywords: distributed locking, cluster -Mule runtime engine provides the ability to create locks for synchronizing access to resources within Mule components. To manage concurrent access to resources, Mule provides a lock factory that you can access programmatically by scripts or in custom extensions built with the xref:1.1@mule-sdk::getting-started.adoc[Java SDK]. +Mule runtime engine provides the ability to create locks for synchronizing access to resources within Mule components. To manage concurrent access to resources, Mule provides a lock factory that you can access programmatically by scripts or in custom extensions built with the xref:mule-sdk::getting-started.adoc[Java SDK]. Any locks you create with the Mule lock factory work seamlessly on deployment models that use either a single server or a cluster of servers. This means that if you have a server running the same flow in multiple threads, or a cluster environment running the same app, you can guarantee resource synchronization with Mule locks. Additionally, the Mule locking system offers a simple API to access shared locks. diff --git a/modules/ROOT/pages/execution-engine.adoc b/modules/ROOT/pages/execution-engine.adoc index df13d91ccd..f3f10a87e3 100644 --- a/modules/ROOT/pages/execution-engine.adoc +++ b/modules/ROOT/pages/execution-engine.adoc @@ -27,7 +27,7 @@ See specific component or module documentation to learn the processing type it s For connectors created with the Mule SDK, the SDK determines the most appropriate processing type based on how the connector is implemented. For -details on that mechanism, refer to the xref:1.1@mule-sdk::index.adoc[Mule SDK documentation]. +details on that mechanism, refer to the xref:mule-sdk::index.adoc[Mule SDK documentation]. [[threading]] == Threading diff --git a/modules/ROOT/pages/migration-transports.adoc b/modules/ROOT/pages/migration-transports.adoc index c073343e81..9b7f9756be 100644 --- a/modules/ROOT/pages/migration-transports.adoc +++ b/modules/ROOT/pages/migration-transports.adoc @@ -84,7 +84,7 @@ code does, so you might: a xref:dataweave.adoc[DataWeave] transformation, a xref:connectors::java/java-module.adoc[Java Module], or a xref:connectors::scripting/scripting-module.adoc[Scripting Module]). -* Use the xref:1.1@mule-sdk::index.adoc[Mule SDK] to create a connector +* Use the xref:mule-sdk::index.adoc[Mule SDK] to create a connector that provides your customized transport functionality. As a starting point, you can use open-source connectors as dependencies (for example, https://github.com/mulesoft/mule-http-connector). @@ -102,4 +102,4 @@ xref:migration-connectors.adoc[Migrating Connectors and Modules to Mule 4] xref:intro-java-integration.adoc[Java Integration] -xref:1.1@mule-sdk::index.adoc[Mule SDK] +xref:mule-sdk::index.adoc[Mule SDK] From 4e1e7579eb5d830800a90cb2a3b3328c24528449 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 18 Mar 2025 14:58:26 -0300 Subject: [PATCH 092/119] W-18005669-EnterpriseLicense-44-dm --- .../installing-an-enterprise-license.adoc | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/installing-an-enterprise-license.adoc b/modules/ROOT/pages/installing-an-enterprise-license.adoc index 3b5e7d9e21..0461927a1e 100644 --- a/modules/ROOT/pages/installing-an-enterprise-license.adoc +++ b/modules/ROOT/pages/installing-an-enterprise-license.adoc @@ -28,16 +28,29 @@ On *Windows*, first copy the `license.lic` file into the `\bin` folder, then exe Make sure that the Mule Server is *stopped* and then open the terminal or command line on your system. -To verify that Mule successfully installed your Enterprise license, run the following command: - +* To verify that Mule successfully installed your Enterprise license, run the following command: ++ `mule -verifyLicense` ++ +The command outputs: ++ +[source,xml,linenums] +---- +License information Evaluation = false, Expiration Date = Tue May 19 00:00:00 UTC 2025, Contact Name = John Doe, Contact Email Address = john.doe@company.com, Contact Telephone = 00000000, Contact Company = Local Global Ltd, Contact Country = US, Entitlements = clustering,api-gateway +---- -To uninstall a previously installed license, run the following command: - +* To uninstall a previously installed license, run the following command: ++ `mule -unInstallLicense` - ++ Sometimes the license installation fails and it might be necessary to manually delete `$MULE_HOME/conf/muleLicenseKey.lic` +* To verify the license before installing it, run the following command: ++ +`mule -verifyLicenseDetails [path_to_license]` ++ +The command outputs the same information as in `mule -verifyLicense`. + == Download your License Key File . Log in to https://help.mulesoft.com[the Support portal] using your login information. If you do not have credentials to log in, please contact your Customer Success Manager. From 0532e9af121fd93e5402852c587692e7a9c08a45 Mon Sep 17 00:00:00 2001 From: dmerlo Date: Tue, 25 Mar 2025 12:53:26 -0300 Subject: [PATCH 093/119] W-18021825-FIPSkeystores-toBCFKS-44-dm --- .../pages/fips-140-2-compliance-support.adoc | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/modules/ROOT/pages/fips-140-2-compliance-support.adoc b/modules/ROOT/pages/fips-140-2-compliance-support.adoc index 41155b0a69..f077c4b61b 100644 --- a/modules/ROOT/pages/fips-140-2-compliance-support.adoc +++ b/modules/ROOT/pages/fips-140-2-compliance-support.adoc @@ -89,6 +89,46 @@ To configure the cipher suite used by on-prem Mule installations, see < + + + +---- + +[NOTE] +If the source keystore is `PKCS12`, set the parameter `-srcstoretype` to `PKCS12` in the `keytool` command. + == Fine-Tuning SSL Connectors The Mule conf folder includes two files that allow you to fine-tune the configuration of SSL connectors by manually setting which cipher suites Mule can use and which SSL protocols are allowed: From 96cc47d12236edba33199ad02da0502df8ff7f8d Mon Sep 17 00:00:00 2001 From: Kevin Meinrad Troller Date: Mon, 31 Mar 2025 14:27:40 -0300 Subject: [PATCH 094/119] W-18055431-pgp-encryption-4.4-kt --- modules/ROOT/pages/cryptography-pgp.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/cryptography-pgp.adoc b/modules/ROOT/pages/cryptography-pgp.adoc index 8d030d14d8..28c2a41253 100644 --- a/modules/ROOT/pages/cryptography-pgp.adoc +++ b/modules/ROOT/pages/cryptography-pgp.adoc @@ -235,7 +235,7 @@ Binary `` +++ -Encrypt a stream using PGP, giving an ASCII-armored stream output as a result. The encryption is done with the public key of the recipient, so the secret passphrase is not required. +Encrypt a stream using PGP, giving an ASCII-armored stream output as a result. The encryption is done with the public key of the recipient, so the private keyring and secret passphrase are not required. +++ === Parameters From 8d4323b4aa7eec0eb2d828aa6021decff264a931 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Wed, 30 Apr 2025 14:27:01 -0300 Subject: [PATCH 095/119] W-18366605-addParametersRTF-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc index 4273bcc664..05b0e2ab23 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-rtf.adoc @@ -143,6 +143,8 @@ If not set, defaults to +https://anypoint.mulesoft.com+. | No | `muleVersion` | The Mule runtime engine version to run in your Runtime Fabric instance. + Ensure that this value is equal to or higher than the earliest required Mule version of your application. + Example values: `4.3.0`, `4.2.2-hf4` | Yes +| `releaseChannel`| Set the name of the release channel used to select the Mule image. Supported values are `NONE`, `EDGE`, and `LTS`. By default, the value is set to `EDGE`. If the selected release channel doesn't exist, an error occurs. | No +| `javaVersion` | Set the Java version used in the deploy. Supported values are `8` and `17`. By default, the value is set to `8`. If the selected Java version doesn't exist, an error occurs. | No | `username` | Your Anypoint Platform username | Only when using Anypoint Platform credentials to login. | `password` | Your Anypoint Platform password | Only when using Anypoint Platform credentials to login. | `applicationName` | The application name displayed in Runtime Manager after the app deploys. | Yes From 0436c9e13aed9910d1b7f87cd9e4e7282c73ef49 Mon Sep 17 00:00:00 2001 From: Kevin Meinrad Troller Date: Tue, 6 May 2025 18:16:14 -0300 Subject: [PATCH 096/119] W-14980369-crypto-xml-sign-v4.4-kt --- modules/ROOT/pages/cryptography-xml.adoc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/ROOT/pages/cryptography-xml.adoc b/modules/ROOT/pages/cryptography-xml.adoc index cc9597dcd7..7237b2f87d 100644 --- a/modules/ROOT/pages/cryptography-xml.adoc +++ b/modules/ROOT/pages/cryptography-xml.adoc @@ -102,6 +102,22 @@ In the next example, a detached XML signature is created based on an element of ---- +=== Selecting the Signing Algorithm + +In the *XML Sign* operation, the `digestAlgorithm` parameter defines the hashing algorithm applied to the content before signing, for example SHA1, SHA256, or SHA512. + +However, the final XML signature algorithm is not manually selected. It is automatically determined based on the type of key (RSA, DSA, EC, HMAC) configured in the module. + +The signing process combines the chosen hash algorithm `digestAlgorithm` with the key type to produce the signature method used in the XML document. + +For example: + +* An RSA key with `digestAlgorithm=SHA256` results in the `rsa-sha256` signature method. +* A DSA key with `digestAlgorithm=SHA1` results in the `dsa-sha1` signature method. +* An EC key with `digestAlgorithm=SHA256` results in the `ecdsa-sha256` signature method. + +If you want to use a different signature method, you must change the type of key in the `digestAlgorithm` parameter configuration. It is not currently possible to manually select the signature method within the operation. + == Validating a Signature .Example: JCE Configuration From 776c6fe6d173a08e09c6bbbdc849bc31235e47ee Mon Sep 17 00:00:00 2001 From: Kevin Meinrad Troller Date: Mon, 12 May 2025 11:56:39 -0300 Subject: [PATCH 097/119] W-16543184-runtime-http-handling-diagram-v4.4-kt --- .../runtime-http-connections-diagram.graffle | Bin 0 -> 106077 bytes .../runtime-http-connections-diagram.png | Bin 0 -> 140339 bytes modules/ROOT/pages/_partials/nav-app-dev.adoc | 1 + .../ROOT/pages/http-connection-handling.adoc | 77 ++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 modules/ROOT/assets/image-source-files/runtime-http-connections-diagram.graffle create mode 100644 modules/ROOT/assets/images/runtime-http-connections-diagram.png create mode 100644 modules/ROOT/pages/http-connection-handling.adoc diff --git a/modules/ROOT/assets/image-source-files/runtime-http-connections-diagram.graffle b/modules/ROOT/assets/image-source-files/runtime-http-connections-diagram.graffle new file mode 100644 index 0000000000000000000000000000000000000000..f6704cb475f6271c0bc4fee6620ac00258f0affe GIT binary patch literal 106077 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

vzm#g?%h6dR~d z(NzCqt+tHJxMAT%o3JN2`o7M*7kz#oOo03;pahdt=FmM0P_!7$V5l(3gM`j0+Gz0m zg*fuWsrPv9eCTV10_V!gXNOkq`jGS67jfJ5ObFX7P+Sg5a~2(KjgEm>-Q&-y?CtH% z!dCS;17sWx{Mkqjmp&M03;$Tq*%2{hB!Z&6?J*XR+ua^nw(W`~O;G$AE63h;IED2m z7lrWqKdL~Und6ht51H0pvDwmS)yBnZ5IA*YACeR1{7`3{y7cK#QwvGYNQDBBK)&~A}t00ZK+SU;kKpy>_w>PAPh$O%oOE@OpU zg@*ia%>~X-<8~)j(mZyN3E}V>^3po%Qx14*J$~dZ>-Fz{{T=+0RjL66aWAK2mn)jsanFhm|yuN z004ni000UA0000000000005+c00000WMOn+E^usVb97Kk0RjL66aWAK2mn)jsalkU z!?ucd0RX3q0sssE0000000000005+cAtnF-aB^jKX=QgVYH(#|P)h{{000000ssO4 NasU7T)tvzV003m(L5~0c literal 0 HcmV?d00001 diff --git a/modules/ROOT/assets/images/runtime-http-connections-diagram.png b/modules/ROOT/assets/images/runtime-http-connections-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..579b6c3e4dcccfcb43da9a8bd3d7c6ec6084d5ca GIT binary patch literal 140339 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 EU;4uZ9RL6T literal 0 HcmV?d00001 diff --git a/modules/ROOT/pages/_partials/nav-app-dev.adoc b/modules/ROOT/pages/_partials/nav-app-dev.adoc index 16e98a20c5..e231e150d7 100644 --- a/modules/ROOT/pages/_partials/nav-app-dev.adoc +++ b/modules/ROOT/pages/_partials/nav-app-dev.adoc @@ -53,6 +53,7 @@ *** xref:until-successful-scope.adoc[Until Successful Scope] ** xref:build-application-from-api.adoc[Build an Application from an API] ** xref:build-an-https-service.adoc[Build an HTTPS Service] +** xref:http-connection-handling.adoc[Understand HTTP Connection Handling During Mule Runtime Shutdown] ** xref:global-elements.adoc[Configure Global Elements] ** xref:global-settings-configuration.adoc[Configure Global Settings] ** xref:configuring-properties.adoc[Configure Properties] diff --git a/modules/ROOT/pages/http-connection-handling.adoc b/modules/ROOT/pages/http-connection-handling.adoc new file mode 100644 index 0000000000..7656d5b1cf --- /dev/null +++ b/modules/ROOT/pages/http-connection-handling.adoc @@ -0,0 +1,77 @@ += Understanding HTTP Connection Handling during Mule Runtime Shutdown + +Mule runtime engine (Mule) manages HTTP connections during shutdown through a two-stage graceful shutdown process followed by a forceful termination. + +This process first refuses new connections while allowing existing ones to complete with a `Connection: close` signal, then rejects new requests entirely while finishing in-flight processing, before finally forcefully terminating all remaining connections upon timeout. + +This supports seamless scale-down scenarios, enabling the reduction of Mule replicas while maintaining the stability and reliability of the application by progressively draining traffic. + +== HTTP Connection Handling Diagram + +This diagram illustrates the behavior of HTTP connection handling during Mule shutdown: + +image::runtime-http-connections-diagram.png[] + +Phase 1: Mule Started + +* Mule State: Mule started and is running normally. +* HTTP Behavior: All incoming HTTP traffic is routed to Mule and processed without any special handling. + +Transition: Send Stop Signal to Mule + +* The shutdown sequence starts by sending a stop signal to the Mule instance. + +Phase 2: HTTP Graceful Shutdown - Mule Stopping + +* Trigger: Reception of the stop signal. +* Duration: Up to the configured HTTP Graceful Timeout (default: 5 seconds). However, if all existing HTTP connections are closed before this timeout period elapses, the HTTP Graceful Shutdown phase will end early, and Mule won't wait for the full timeout duration. +* Mule State: Mule is initiating a shutdown or transitioning to stopped. +* HTTP Behavior: + +** No new connections: The HTTP server stops accepting new incoming TCP connections (the acceptor socket is closed). +** Existing and In-Flight requests: Ongoing HTTP requests (both those already being processed in-flight and those on existing, established connections) will continue to be handled normally. However, all responses will include the `Connection: close` header, signaling to the HTTP client to close the connection after the current request-response cycle. +** Early termination: If there are no active HTTP connections when the stop signal is received, the HTTP Graceful Shutdown phase will end immediately, even before the timeout period expires. +** Late-Arriving requests: If an HTTP request arrives just before the HTTP Graceful Timeout is reached, it'll still be processed normally, even if the processing extends beyond the HTTP Graceful Shutdown timeout. + +Transition: HTTP Graceful Shutdown Timeout Elapsed + +* The configured duration for the HTTP Graceful Shutdown has ended. + +Phase 3: Mule Graceful Shutdown - Mule Stopping + +* Trigger: Expiration of the HTTP Graceful Shutdown Timeout. +* Duration: Up to the configured Mule Graceful Shutdown Timeout (default: 5 seconds). +* Mule State: Mule is shutting down gracefully +* HTTP Behavior: + +** Reject new requests (503): Any new HTTP requests arriving at the runtime will be immediately rejected with a 503 Service Unavailable error. +** Reject new Requests (404): Once the Mule app code unregisters the HTTP endpoint from the underlying HTTP server, subsequent new HTTP requests will receive a 404 Not Found error. +** Complete In-Flight messages: HTTP requests that were already fully read and are being processed (in-flight messages) will be allowed to complete their execution normally. + +Transition: Mule Graceful Shutdown Timeout Elapsed + +* The configured duration for the overall Mule Graceful Shutdown has ended. + +Phase 4: Mule Stopped + +* Trigger: Expiration of the Mule Graceful Shutdown Timeout. +* Mule State: Mule stopped. +* Behavior: The Mule process proceeds to a forceful shutdown and will eventually exit. As a result: + +** All remaining open HTTP connections will be abruptly closed. +** Clients connected to these forcibly closed connections will likely receive a connection reset error or a broken pipe error, depending on the TCP status of their socket at the time of closure. + +== Configure Shutdown Timeout + +Note that while the HTTP Graceful Shutdown Timeout and the overall Mule Graceful Shutdown Timeout serve distinct purposes in the shutdown sequence, you configure them using the same `shutdownTimeout` parameter within the `` element of your Mule application's XML file. + +Specify the value in milliseconds (default 5000 milliseconds), which controls the maximum duration for both graceful shutdown periods. For example: + +[source,xml,linenums] +---- + + +---- + +For details, refer to xref:global-settings-configuration.adoc#global-configurations-reference[Global Configurations Reference] + From 7c3d48223098afdf64342f305da0f54e757d7b01 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Thu, 15 May 2025 18:20:53 -0300 Subject: [PATCH 098/119] W-18384973-fixLINKS-44-dm --- .../ROOT/pages/custom-configuration-properties-provider.adoc | 2 +- modules/ROOT/pages/migration-api-gateways-policies.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/custom-configuration-properties-provider.adoc b/modules/ROOT/pages/custom-configuration-properties-provider.adoc index 404e115a2a..c55ffe9247 100644 --- a/modules/ROOT/pages/custom-configuration-properties-provider.adoc +++ b/modules/ROOT/pages/custom-configuration-properties-provider.adoc @@ -174,7 +174,7 @@ You can download or checkout the https://github.com/mulesoft/mule-custom-properties-providers-module-example[sample project], which contains all the infrastructure code to get started implementing your custom configuration properties resolver extension. -The sample project is a Mule SDK module. See https://docs.mulesoft.com/mule-sdk/1.1/getting-started[Getting started with the Mule SDK] for additional information. +The sample project is a Mule SDK module. See xref:mule-sdk::getting-started.adoc[Getting started with the Mule SDK] for additional information. === Customizing the Module to Access Your Custom Properties Source diff --git a/modules/ROOT/pages/migration-api-gateways-policies.adoc b/modules/ROOT/pages/migration-api-gateways-policies.adoc index 6a1353cb1d..a8cc2f044b 100644 --- a/modules/ROOT/pages/migration-api-gateways-policies.adoc +++ b/modules/ROOT/pages/migration-api-gateways-policies.adoc @@ -6,7 +6,7 @@ endif::[] // authors: Federico Balbi and Nahuel Dalla Vecchia (assigned by Eva) // Explain generally how and why things changed between Mule 3 and Mule 4. -In Mule 4, policies underwent major changes. A full explanation of them is available in https://docs.mulesoft.com/api-manager/custom-policy-4-reference[Custom Policy General Reference (Nov 2017)] +In Mule 4, policies underwent major changes. == Defining Policy Behavior From a66ee2ef3ff74e696a804d03482ccd33a2cd204c Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Fri, 23 May 2025 17:08:02 -0300 Subject: [PATCH 099/119] W-15505887-clusteringBestPractices-44-dm --- modules/ROOT/pages/mule-high-availability-ha-clusters.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc index 33ca24c462..952887e909 100644 --- a/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc +++ b/modules/ROOT/pages/mule-high-availability-ha-clusters.adoc @@ -345,6 +345,7 @@ There are a number of recommended practices related to clustering. These include * Use distributed stores such as those used with the VM or JMS connector – these stores are available to an entire cluster. This is preferable to the non-distributed stores used with connectors such as File, FTP, and JDBC – these stores are read by a single node at a time. * Use the VM connector to get optimal performance. Use the JMS connector for applications where data needs to be saved after the entire cluster exits. * Implement reliability patterns to create high reliability applications. +* In HA cluster mode, all Object Store content, both in-memory and persistent (as defined by the `persistent` parameter), is stored in the distributed memory grid. As long as the cluster maintains quorum, this data survives application redeploys or restarts. To fully clear the Object Store content, all cluster nodes must be stopped before restarting. For scenarios where data persistence is required even after a full cluster shutdown, configure the Object Store to use a JDBC-based store instead of the memory grid. See xref:creating-and-managing-a-cluster-manually.adoc#object-store-persistence[Object Store Persistence]. == See Also From eda22b6c8e035efeebb45d6d2b9291480c41ee63 Mon Sep 17 00:00:00 2001 From: Kevin Meinrad Troller Date: Tue, 27 May 2025 10:57:21 -0300 Subject: [PATCH 100/119] W-18610079-crypto-remove-4.4-kt --- modules/ROOT/nav.adoc | 6 - modules/ROOT/pages/cryptography-jce.adoc | 660 ------------------ modules/ROOT/pages/cryptography-pgp.adoc | 618 ---------------- .../ROOT/pages/cryptography-reference.adoc | 95 --- .../pages/cryptography-troubleshooting.adoc | 97 --- modules/ROOT/pages/cryptography-xml.adoc | 433 ------------ modules/ROOT/pages/cryptography.adoc | 33 - modules/ROOT/pages/securing.adoc | 72 -- 8 files changed, 2014 deletions(-) delete mode 100644 modules/ROOT/pages/cryptography-jce.adoc delete mode 100644 modules/ROOT/pages/cryptography-pgp.adoc delete mode 100644 modules/ROOT/pages/cryptography-reference.adoc delete mode 100644 modules/ROOT/pages/cryptography-troubleshooting.adoc delete mode 100644 modules/ROOT/pages/cryptography-xml.adoc delete mode 100644 modules/ROOT/pages/cryptography.adoc delete mode 100644 modules/ROOT/pages/securing.adoc diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 3a8419e311..c63fd0bd25 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -55,12 +55,6 @@ include::partial$nav-app-dev.adoc[] ** xref:maven-reference.adoc[Maven Reference] * xref:securing.adoc[Security] ** xref:secure-configuration-properties.adoc[Secure Configuration Properties] - ** xref:cryptography.adoc[Cryptography Module] - *** xref:cryptography-pgp.adoc[PGP] - *** xref:cryptography-xml.adoc[XML] - *** xref:cryptography-jce.adoc[JCE] - *** xref:cryptography-reference.adoc[General Operations] - *** xref:cryptography-troubleshooting.adoc[Troubleshoot Cryptography Module] ** xref:fips-140-2-compliance-support.adoc[FIPS 140-2 Compliance Support] ** xref:setting-up-ldap-provider-for-spring-security.adoc[Configure LDAP Provider for Spring Security] ** xref:component-authorization-using-spring-security.adoc[Component Authorization Using Spring Security] diff --git a/modules/ROOT/pages/cryptography-jce.adoc b/modules/ROOT/pages/cryptography-jce.adoc deleted file mode 100644 index 877e667dad..0000000000 --- a/modules/ROOT/pages/cryptography-jce.adoc +++ /dev/null @@ -1,660 +0,0 @@ -= JCE Cryptography -ifndef::env-site,env-github[] -include::_attributes.adoc[] -endif::[] - -The JCE strategy enables you to use the wider range of cryptography capabilities provided by the Java Cryptography Extension. - -You can use cryptography capabilities in two ways: - -* Password-based encryption (PBE): + -This method enables you to encrypt and sign content by providing only an encryption password. -* Key-based encryption: + -Similar to how PGP and XML encryption works, this method enables you to configure a symmetric or asymmetric key to perform encryption and signing operations. - -You can encrypt all, or part of a message using any of these two methods. - -== PBE - -This method applies a hash function over the provided password to generate a symmetric key that is compatible with standard encryption algorithms. Because PBE only requires a password, a global configuration element is not needed for the PBE operations. - -=== Configure Password-Based Encryption from Anypoint Studio - -To configure PBE from Anypoint Studio, follow these steps: - -. From the Mule palette, add *Crypto* to your project. -+ -See xref:cryptography.adoc#install-crypto-module[Install the Extension] for instructions. -. Select the desired operation, and drag the component to the flow: -+ -image::mruntime-crypto-pbe-add.png[crypto-pbe-add] -. In the component view, configure the *Algorithm* and *Password* properties: -+ -image::mruntime-crypto-pbe-config.png[crypto-pbe-config] - -=== XML Examples - -The following are XML examples for each each of the PBE operations: - -* PBE Encryption -+ -[source,xml,linenums] ----- - ----- -+ -If no algorithm is specified, `PBEWithHmacSHA256AndAES_128` is used. - -* PBE Decryption -+ -[source,xml,linenums] ----- - ----- - -* PBE Signature -+ -[source,xml,linenums] ----- - ----- -+ -If no algorithm is specified, `PBEWithHmacSHA256` is used. - -* PBE Signature Validation -+ -[source,xml,linenums] ----- - ----- -+ -The `expected` parameter defines the signature used to validate the message. - -== Key-Based Encryption - -Configure a symmetric or asymmetric key to perform encryption and signing operations. - -=== Configure Key-Based Encryption from Anypoint Studio - -To configure key-based encryption operations from Anypoint Studio, follow these steps: - -. From the Mule palette, add *Crypto* to your project. -+ -See xref:cryptography.adoc#install-crypto-module[Install the Extension] for instructions. -. Select the desired operation, and drag the component to the flow: -+ -image::mruntime-crypto-jce-add.png[crypto-jce-add] -. Open the component properties and select an existing module configuration, or create a new one by specifying values for *Keystore*, *Type* (JKS, JCEKS, PKCS12), and *Password*. -+ -You can also add symmetric or asymmetric key information to be used in the sign operations: -+ -image::mruntime-crypto-jce-global-config.png[crypto-jce-global-config] -. Configure *Key selection* by using a *Key id* value previously defined in the module configuration, or define a new one for this operation: -+ -image::mruntime-crypto-jce-config.png[crypto-jce-config] -. Select the algorithm to use during the operation. - -=== XML Examples - -The following XML examples show a JCE configuration that defines symmetric and asymmetric keys and different operations using these keys. - -* Configuration -+ -In this example, a keystore with different types of keys is defined in a JCE configuration: -+ -[source,xml,linenums] ----- - - - - - - - - - ----- - -* Asymmetric Encryption -+ -The following example operations use the asymmetric keys defined in the previous configuration. -+ -.Encrypting a Message -[source,xml,linenums] ----- - ----- -+ -.Decrypting a Message -[source,xml,linenums] ----- - ----- - -* Symmetric Encryption -+ -The following example operations use the symmetric keys defined in the previous configuration. -+ -.Encrypting a Message -[source,xml,linenums] ----- - ----- -+ -.Decrypting a Message -[source,xml,linenums] ----- - ----- - -* Signature and Validation -+ -The following are examples of sign and validate operations that use a key defined in the previous configuration: -+ -.Signing a Message -[source,xml,linenums] ----- - ----- -+ -.Validating a Signature -[source,xml,linenums] ----- - ----- -+ -The `expected` parameter defines the signature used to validate the message. - -== Reference - -=== Module Configuration - -JCE configuration for Java keystores and inline keys. - -==== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -|Name | String | The name for this configuration. Connectors reference the configuration with this name. | | *x*{nbsp} -| Keystore a| String | +++Path to the keystore file.+++ | | X -| Type a| Enumeration, one of: - -** `JKS` -** `JCEKS` -** `PKCS12` | +++Type of the keystore.+++ | `JKS` | {nbsp} -| Password a| String | +++Password for unlocking the keystore.+++ | | {nbsp} -| Jce Key Infos a| Array of One of: - -* <> -* <> | +++List of keys to be considered, with internal IDs for referencing them.+++ | | {nbsp} -| Expiration Policy a| <> | +++Configures the minimum amount of time that a dynamic configuration instance can remain idle before the runtime considers it eligible for expiration. This does not mean that the platform will expire the instance at the exact moment that it becomes eligible. The runtime will actually purge the instances when it sees it fit.+++ | | {nbsp} -|=== - -[[jceDecrypt]] -== Jce Decrypt Operation -`` - -+++ -Decrypt a stream using JCE, with a key. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | You can decrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to decrypt only an encrypted variable called `name` from the payload | `#[payload]` | {nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Output Encoding a| String | +++The encoding of the payload that this operation outputs.+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Cipher a| String | A raw cipher string in the form "algorithm/mode/padding" according to the Java crypto documentation, for example `AES/CBC/PKCS5Padding`. Note that GCM mode is currently not supported, and not all algorithm/mode/padding combinations are valid. | | {nbsp} -| Algorithm a| Enumeration, one of: - -** `AES` -** `AESWrap` -** `ARCFOUR` -** `Blowfish` -** `DES` -** `DESede` -** `RC2` -** `DESedeWrap` -** `RSA` a| Algorithm from a list of valid definitions. When you specify this field, Mule automatically selects the mode and padding to use according to the following list: - -* `AES/CBC/PKCS5Padding` -* `AESWrap/ECB/NoPadding` -* `ARCFOUR/ECB/NoPadding` -* `Blowfish/CBC/PKCS5Padding` -* `DES/CBC/PKCS5Padding` -* `DESede/CBC/PKCS5Padding` -* `RC2/CBC/PKCS5Padding` -* `DESedeWrap/CBC/NoPadding` -* `RSA/ECB/OAEPWithSHA-256AndMGF1Padding` | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:PARAMETERS` {nbsp} -* `CRYPTO:DECRYPTION` {nbsp} - - -[[jceEncrypt]] -== Jce Encrypt Operation -`` - -+++ -Encrypt a stream using JCE, with a key. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | You can encrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to encrypt only a variable called `name` from the payload | `#[payload]` | {nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Output Encoding a| String | +++The encoding of the payload that this operation outputs.+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Cipher a| String | A raw cipher string in the form "algorithm/mode/padding" according to the Java crypto documentation, for example `AES/CBC/PKCS5Padding`. Note that GCM mode is currently not supported, and not all algorithm/mode/padding combinations are valid. | | {nbsp} -| Algorithm a| Enumeration, one of: - -** `AES` -** `AESWrap` -** `ARCFOUR` -** `Blowfish` -** `DES` -** `DESede` -** `RC2` -** `DESedeWrap` -** `RSA` a| Algorithm from a list of valid definitions. When you specify this field, Mule automatically selects the mode and padding to use according to the following list: - -* `AES/CBC/PKCS5Padding` -* `AESWrap/ECB/NoPadding` -* `ARCFOUR/ECB/NoPadding` -* `Blowfish/CBC/PKCS5Padding` -* `DES/CBC/PKCS5Padding` -* `DESede/CBC/PKCS5Padding` -* `RC2/CBC/PKCS5Padding` -* `DESedeWrap/CBC/NoPadding` -* `RSA/ECB/OAEPWithSHA-256AndMGF1Padding` | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:ENCRYPTION` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PARAMETERS` {nbsp} - -[[jceSign]] -== Jce Sign Operation -`` - -+++ -Sign a stream using JCE, with a key. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | +++The content to sign+++ | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `MD2withRSA` -** `MD5withRSA` -** `SHA1withRSA` -** `SHA224withRSA` -** `SHA256withRSA` -** `SHA384withRSA` -** `SHA512withRSA` -** `NONEwithDSA` -** `SHA1withDSA` -** `SHA224withDSA` -** `SHA256withDSA` -** `HmacMD5` -** `HmacSHA1` -** `HmacSHA224` -** `HmacSHA256` -** `HmacSHA384` -** `HmacSHA512` | +++The algorithm used for signing+++ | `HmacSHA256` | {nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -String - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:SIGNATURE` {nbsp} - - -[[jceValidate]] -== Jce Validate Operation -`` - -+++ -Validate a stream against a signature, using a key. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Value a| Binary | +++the message to authenticate+++ | `#[payload]` | {nbsp} -| Expected a| String | +++the signature to validate+++ | | *x*{nbsp} -| Algorithm a| Enumeration, one of: - -** `MD2withRSA` -** `MD5withRSA` -** `SHA1withRSA` -** `SHA224withRSA` -** `SHA256withRSA` -** `SHA384withRSA` -** `SHA512withRSA` -** `NONEwithDSA` -** `SHA1withDSA` -** `SHA224withDSA` -** `SHA256withDSA` -** `HmacMD5` -** `HmacSHA1` -** `HmacSHA224` -** `HmacSHA256` -** `HmacSHA384` -** `HmacSHA512` | +++The algorithm used for signing+++ | `HmacSHA256` | {nbsp} -| Key Id a| String | +++The key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -|=== - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:VALIDATION` {nbsp} - -[[jceDecryptPbe]] -== Jce Decrypt Pbe Operation -`` - -+++ -Decrypt a stream using JCE, with a password. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Content a| Binary | You can decrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to decrypt only an encrypted variable called `name` from the payload | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `PBEWithMD5AndDES` -** `PBEWithMD5AndTripleDES` -** `PBEWithSHA1AndDESede` -** `PBEWithSHA1AndRC2_40` -** `PBEWithSHA1AndRC2_128` -** `PBEWithSHA1AndRC4_40` -** `PBEWithSHA1AndRC4_128` -** `PBEWithHmacSHA1AndAES_128` -** `PBEWithHmacSHA224AndAES_128` -** `PBEWithHmacSHA256AndAES_128` -** `PBEWithHmacSHA384AndAES_128` -** `PBEWithHmacSHA512AndAES_128` -** `PBEWithHmacSHA1AndAES_256` -** `PBEWithHmacSHA224AndAES_256` -** `PBEWithHmacSHA256AndAES_256` -** `PBEWithHmacSHA384AndAES_256` -** `PBEWithHmacSHA512AndAES_256` | +++The algorithm for generating a key from the password+++ | `PBEWithHmacSHA256AndAES_128` | {nbsp} -| Password a| String | +++The password for decryption+++ | | *x*{nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Output Encoding a| String | +++The encoding of the payload that this operation outputs.+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:PARAMETERS` {nbsp} -* `CRYPTO:DECRYPTION` {nbsp} - -[[jceEncryptPbe]] -== Jce Encrypt Pbe Operation -`` - -+++ -Encrypt a stream using JCE, with a password. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Content a| Binary | You can encrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to encrypt only a variable called `name` from the payload | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `PBEWithMD5AndDES` -** `PBEWithMD5AndTripleDES` -** `PBEWithSHA1AndDESede` -** `PBEWithSHA1AndRC2_40` -** `PBEWithSHA1AndRC2_128` -** `PBEWithSHA1AndRC4_40` -** `PBEWithSHA1AndRC4_128` -** `PBEWithHmacSHA1AndAES_128` -** `PBEWithHmacSHA224AndAES_128` -** `PBEWithHmacSHA256AndAES_128` -** `PBEWithHmacSHA384AndAES_128` -** `PBEWithHmacSHA512AndAES_128` -** `PBEWithHmacSHA1AndAES_256` -** `PBEWithHmacSHA224AndAES_256` -** `PBEWithHmacSHA256AndAES_256` -** `PBEWithHmacSHA384AndAES_256` -** `PBEWithHmacSHA512AndAES_256` | +++The algorithm for generating a key from the password+++ | `PBEWithHmacSHA256AndAES_128` | {nbsp} -| Password a| String | +++The password for encryption+++ | | *x*{nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Output Encoding a| String | +++The encoding of the payload that this operation outputs.+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:ENCRYPTION` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PARAMETERS` {nbsp} - -[[jceSignPbe]] -== Jce Sign Pbe Operation -`` - -+++ -Sign a stream using JCE, with a key. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Content a| Binary | +++the content to sign+++ | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `HmacPBESHA1` -** `PBEWithHmacSHA1` -** `PBEWithHmacSHA224` -** `PBEWithHmacSHA256` -** `PBEWithHmacSHA384` -** `PBEWithHmacSHA512` | +++The algorithm used for signing+++ | `PBEWithHmacSHA256` | {nbsp} -| Password a| String | +++The password used to sign+++ | | *x*{nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -String - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:SIGNATURE` {nbsp} - -[[jceValidatePbe]] -== Jce Validate Pbe Operation -`` - -+++ -Validate a stream against a signature, using a key. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Value a| Binary | +++the message to authenticate+++ | `#[payload]` | {nbsp} -| Expected a| String | +++the signature to validate+++ | | *x*{nbsp} -| Algorithm a| Enumeration, one of: - -** `HmacPBESHA1` -** `PBEWithHmacSHA1` -** `PBEWithHmacSHA224` -** `PBEWithHmacSHA256` -** `PBEWithHmacSHA384` -** `PBEWithHmacSHA512` | +++The algorithm used for signing+++ | `PBEWithHmacSHA256` | {nbsp} -| Password a| String | +++The password used to sign+++ | | *x*{nbsp} -|=== - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:VALIDATION` {nbsp} - -== Types Definition -[[ExpirationPolicy]] -=== Expiration Policy - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Max Idle Time a| Number | A scalar time value for the maximum amount of time a dynamic configuration instance should be allowed to be idle before it's considered eligible for expiration | | -| Time Unit a| Enumeration, one of: - -** `NANOSECONDS` -** `MICROSECONDS` -** `MILLISECONDS` -** `SECONDS` -** `MINUTES` -** `HOURS` -** `DAYS` | A time unit that qualifies the maxIdleTime attribute | | -|=== - -[[repeatable-in-memory-stream]] -=== Repeatable In Memory Stream - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Initial Buffer Size a| Number | This is the amount of memory that will be allocated in order to consume the stream and provide random access to it. If the stream contains more data than can be fit into this buffer, then it will be expanded by according to the `bufferSizeIncrement` attribute, with an upper limit of `maxInMemorySize`. | | -| Buffer Size Increment a| Number | This is by how much will be buffer size by expanded if it exceeds its initial size. Setting a value of zero or lower will mean that the buffer should not expand, meaning that a `STREAM_MAXIMUM_SIZE_EXCEEDED` error will be raised when the buffer gets full. | | -| Max Buffer Size a| Number | This is the maximum amount of memory that will be used. If more than that is used then a `STREAM_MAXIMUM_SIZE_EXCEEDED` error will be raised. A value lower or equal to zero means no limit. | | -| Buffer Unit a| Enumeration, one of: - -** `BYTE` -** `KB` -** `MB` -** `GB` | The unit in which all these attributes are expressed | | -|=== - -[[repeatable-file-store-stream]] -=== Repeatable File Store Stream - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Max In Memory Size a| Number | Defines the maximum memory that the stream should use to keep data in memory. If more than that is consumed then it will start to buffer the content on disk. | | -| Buffer Unit a| Enumeration, one of: - -** `BYTE` -** `KB` -** `MB` -** `GB` | The unit in which maxInMemorySize is expressed | | -|=== - -[[JceAsymmetricKeyInfo]] -=== Jce Asymmetric Key Info - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Key Id a| String | Internal key ID for referencing from operations. | | x -| Alias a| String | Alias of the key in the keystore. | | x -| Password a| String | Password used to unlock the private part of the key. | | -|=== - -[[JceSymmetricKeyInfo]] -=== Jce Symmetric Key Info - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Key Id a| String | Internal key ID for referencing from operations. | | x -| Alias a| String | Alias of the key in the keystore. | | x -| Password a| String | Password used to unlock the key. | | x -|=== diff --git a/modules/ROOT/pages/cryptography-pgp.adoc b/modules/ROOT/pages/cryptography-pgp.adoc deleted file mode 100644 index 28c2a41253..0000000000 --- a/modules/ROOT/pages/cryptography-pgp.adoc +++ /dev/null @@ -1,618 +0,0 @@ -= PGP Cryptography -ifndef::env-site,env-github[] -include::_attributes.adoc[] -endif::[] -:keywords: cryptography, module, sign, encrypt, pgp, AES - -Mule can encrypt all or part of a message using Pretty Good Privacy (PGP). PGP combines data compression and data encryption to secure messages. The compression reduces the size of the payload to help reduce the transmission time later on your application. - -Due to its increased complexity, PGP encryption is a heavy-load task when compared to JCE or XML encryption. - -This section addresses these scenarios: - -* Encryption: Using another party's public key to encrypt an outgoing message in a Mule app. -* Decryption: Using your own private key to decrypt an incoming message in a Mule app. - -== Prerequisites - -This document assumes that you are reasonably familiar with PGP encryption, as well as the concepts of public and private keys and asymmetric cryptography. - -== Configure PGP Encryption from Anypoint Studio - -To configure PGP encryption from Anypoint Studio, follow these steps: - -. From the Mule palette, add *Crypto* to your project. -+ -See xref:cryptography.adoc#install-crypto-module[Install the Extension] for instructions. -. Select the desired operation, and drag the component to the flow: -+ -image::mruntime-crypto-pgp-add.png[crypto-pgp-add] -. Open the component properties and select an existing *Module configuration*, or create a new one by specifying the *Public keyring* file and the *Private keyring* file. -+ -You can also add asymmetric key information to be used in the sign operations: -+ -image::mruntime-crypto-pgp-global-config.png[crypto-pgp-global-config] -. Configure *Key selection* by using a *Key id* value previously defined in the module configuration, or define a new one for this operation: -+ -image::mruntime-crypto-pgp-config.png[crypto-pgp-config] -. Select the algorithm to use during the operation. - -== Working with Subkeys - -A key can contain subkeys, according to the RFC-4880 standard specification. When working with subkeys, use the `fingerprint` attribute of the `` element in the XML configuration to specify the key to use. - -For example, if you use different keys for signing and encrypting operations, and each of these keys use different algorithms, like DSA and ElGamal, then you must reference the appropriate key's fingerprint, depending on the operation you want to perform. - -In this case, you reference the ElGamal fingerprint to encrypt your messages and the DSA fingerprint to sign your messages. - -== Encrypting Messages with Public Keys - -During PGP encryption, the sender of the message must encrypt its content using the receiver's public key. So, whenever you want to encrypt messages in your Mule app using someone else's public key, you must add the public key to your key ring. When adding a new PGP configuration to your Mule app, you need to provide your key ring file so the encryption module can get the public key from it to encrypt the message. - -. Use a tool such as GPG Suite to import the other party's public key. See below for details. -. Using the same tool, export the public key, selecting `binary` as the output format. This produces a key ring file with a `.gpg` extension. -. Ensure that the key ring (`.gpg`) file is stored where the Mule app can access it during runtime. - -.Example: PGP Configuration -[source,xml,linenums] ----- - - - - - ----- - -* Using the Encrypt Operation -+ -The next example returns an ASCII-armored encrypted payload, which is suitable for sending over plain-text channels: -+ -[source,xml,linenums] ----- - ----- - -* Using the Encrypt Binary Operation -+ -If you want to return a binary output instead, you can use the `pgp-encrypt-binary` operation: -+ -[source,xml,linenums] ----- - ----- -+ -Producing a binary output is faster than using ASCII-armored. However, the output is not standard and might not be ideal to send to other systems for decryption. - -* Using the Binary to Armored Operation -+ -If you need to send a payload with binary output to another system, you can transform it to ASCII-armored: -+ -[source,xml,linenums] ----- - ----- -This operation has a single input parameter, the message payload to transform. - -== Encrypt and Sign - -In addition to encrypting, you can atomically encrypt and sign a message, which returns a message (in ASCII-armored format) similar to the encrypted one. In this case, the returned message also has a signature inside its encrypted contents. The signature provides an integrity check of the original message. - -To encrypt and sign, the signer private key (which is usually the sender) must be in the public key ring. This process always produces an ASCII-armored output. - -.Example: PGP Configuration -[source,xml,linenums] ----- - - - - ----- - -== Decrypt - -During PGP decryption, the receiver of the message must use its private key to decrypt the contents of a message that was encrypted using a public key. -Therefore, the receiver must distribute its public key to those who will use it to send encrypted messages. - -.Example: PGP Configuration -[source,xml,linenums] ----- - - - - - ----- -In the example above, notice that you need to provide at least three parameters to be able to use the private key ring in the decrypt operation: - -* Key ID (`keyId`): the internal ID that will allow you to reference this key from an operation. -* Key Fingerprint (`fingerprint`): The last 16 characters of your key fingerprint, which can be obtained from your external GPG tool (such as GPG Keychain). -* Passphrase (`passphrase`): The passphrase of the private key. - -.Example: Using the Decrypt Operation -[source,xml,linenums] ----- - ----- - -== Signing - -Sign a message using a configured private key. - -.Example: PGP Configuration -[source,xml,linenums] ----- - - - - - ----- - -.Example: Using the Sign Operation -[source,xml,linenums] ----- - ----- - -== Validating a Signature - -Validate the signature of a message using the signer's public key. - -.Example: PGP Configuration -[source,xml,linenums] ----- - - - - - ----- - -.Example: Using the Validate Operation -[source,xml,linenums] ----- - ----- - -== Reference - -=== Module Configuration - -Keystore configuration for PGP. Contains a list of keys with internal names to be used in the operations. - -==== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -|Name | String | The name for this configuration. Connectors reference the configuration with this name. | | *x*{nbsp} -| Public Keyring a| String | +++Public key ring file.+++ | | {nbsp} -| Private Keyring a| String | +++Private key ring file.+++ | | {nbsp} -| Pgp Key Infos a| Array of One of: - -* <> | +++List of keys to be considered, with internal IDs for referencing them.+++ | | {nbsp} -| Expiration Policy a| <> | +++Configures the minimum amount of time that a dynamic configuration instance can remain idle before the runtime considers it eligible for expiration. This does not mean that the platform will expire the instance at the exact moment that it becomes eligible. The runtime will actually purge the instances when it sees it fit.+++ | | {nbsp} -|=== - -[[pgpDecrypt]] -== Pgp Decrypt Operation -`` - -+++ -Decrypt a stream using PGP, giving the original data as a result. The decryption is done with the private key, so the secret passphrase must be provided. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | You can decrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to decrypt only an encrypted variable called `name` from the payload | `#[payload]` | {nbsp} -| File Name a| String | +++the internal file name to decrypt, if not present the first will be used+++ | | {nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Output Encoding a| String | +++The encoding of the payload that this operation outputs.+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -| Validate Signature if Found a| Boolean | +++If a contents signature is found in any of the internal decryption stages, the operation will attempt to validate the decrypted contents. Note that this requires the *Signer's public key* to be present in the operation config's public keyring. Also, if the validation fails, the decryption operation will also.+++ | `false` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:DECRYPTION` {nbsp} - - -[[pgpEncrypt]] -== Pgp Encrypt Operation -`` - -+++ -Encrypt a stream using PGP, giving an ASCII-armored stream output as a result. The encryption is done with the public key of the recipient, so the private keyring and secret passphrase are not required. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | You can encrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to encrypt only a variable called `name` from the payload | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `IDEA` -** `TRIPLE_DES` -** `CAST5` -** `BLOWFISH` -** `SAFER` -** `DES` -** `AES_128` -** `AES_192` -** `AES_256` -** `TWOFISH` -** `CAMELLIA_128` -** `CAMELLIA_192` -** `CAMELLIA_256` | +++the symmetric algorithm to use for encryption+++ | `AES_256` | {nbsp} -| File Name a| String | +++the internal file name to use in the resulting PGP header+++ | +++stream+++ | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the PGP configuration.+++ | | {nbsp} -| Pgp Key Info a| One of: - -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:ENCRYPTION` {nbsp} -* `CRYPTO:KEY` {nbsp} - -[[pgpEncryptAndSign]] -== PGP Encrypt and Sign Operation - -`` - -You can encrypt and sign a stream using PGP, producing an ASCII-armored stream output as a result. The encryption requires the public key of the recipient, so the secret passphrase is not required. The secret passphrase is required for signing because the process uses private key of the signer (usually the sender). - - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x* -| Content a| Binary | You can encrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to encrypt only a variable called `name` from the payload | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `IDEA` -** `TRIPLE_DES` -** `CAST5` -** `BLOWFISH` -** `SAFER` -** `DES` -** `AES_128` -** `AES_192` -** `AES_256` -** `TWOFISH` -** `CAMELLIA_128` -** `CAMELLIA_192` -** `CAMELLIA_256` | Symmetric algorithm to use for encryption. | `AES_256` | {nbsp} -| File Name a| String | The internal file name to use in the resulting PGP header. | stream | {nbsp} -| Encryption key selection a| A child element with <> | The identifier of the recipient public key. | | {nbsp} -| Sign key selection a| A child element with <> | The identifier of the signer's private key. | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | Configure if repeatable streams should be used and their behavior | | {nbsp} -| Key Id a| String | The key ID, as defined in the PGP configuration. | | {nbsp} -| Target Variable a| String | The name of a variable in which to store the operation's output. | | {nbsp} -| Target Value a| String | An expression that is evaluated against the operation's output. The result of that expression is stored in the target variable. | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:ENCRYPTION` {nbsp} -* `CRYPTO:KEY` {nbsp} - - -[[pgpEncryptBinary]] -== PGP Encrypt Binary Operation -`` - -You can encrypt a stream using PGP, producing a binary output as a result. Because the encryption process uses the public key of the recipient, the secret passphrase is not required. - - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | You can encrypt all, or part of a message by using a DataWeave expression. + -For example, you can set Content to `#[payload.name]` to encrypt only a variable called `name` from the payload | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `IDEA` -** `TRIPLE_DES` -** `CAST5` -** `BLOWFISH` -** `SAFER` -** `DES` -** `AES_128` -** `AES_192` -** `AES_256` -** `TWOFISH` -** `CAMELLIA_128` -** `CAMELLIA_192` -** `CAMELLIA_256` | +++the symmetric algorithm to use for encryption+++ | `AES_256` | {nbsp} -| File Name a| String | +++the internal file name to use in the resulting PGP header+++ | +++stream+++ | {nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Output Encoding a| String | +++The encoding of the payload that this operation outputs.+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the PGP configuration.+++ | | {nbsp} -| Pgp Key Info a| One of: - -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:ENCRYPTION` {nbsp} -* `CRYPTO:KEY` {nbsp} - - -[[pgpSign]] -== Pgp Sign Operation -`` - -+++ -Create a detached (standalone) PGP signature of the stream. The signing is done with the private key of the sender, so the secret passphrase must be provided. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | +++the content to sign+++ | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `MD5` -** `RIPEMD160` -** `TIGER_192` -** `HAVAL_5_160` -** `DOUBLE_SHA` -** `SHA1` -** `SHA224` -** `SHA256` -** `SHA384` -** `SHA512` | +++the digest (or hashing) algorithm+++ | `SHA256` | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the PGP configuration.+++ | | {nbsp} -| Pgp Key Info a| One of: - -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:SIGNATURE` {nbsp} - - -[[pgpSignBinary]] -== Pgp Sign Binary Operation -`` - -+++ -Create a detached (standalone) PGP signature of the stream. The signing is done with the private key of the sender, so the secret passphrase must be provided. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | +++the content to sign+++ | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `MD5` -** `RIPEMD160` -** `TIGER_192` -** `HAVAL_5_160` -** `DOUBLE_SHA` -** `SHA1` -** `SHA224` -** `SHA256` -** `SHA384` -** `SHA512` | +++the digest (or hashing) algorithm+++ | `SHA256` | {nbsp} -| Output Mime Type a| String | +++The mime type of the payload that this operation outputs.+++ | | {nbsp} -| Output Encoding a| String | +++The encoding of the payload that this operation outputs.+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the PGP configuration.+++ | | {nbsp} -| Pgp Key Info a| One of: - -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:SIGNATURE` {nbsp} - - -[[pgpValidate]] -== Pgp Validate Operation -`` - -+++ -Validate a PGP signature against a stream, to authenticate it. The validation is done with the public key of the sender, so the secret passphrase is not required. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Value a| Binary | +++the message to authenticate+++ | `#[payload]` | {nbsp} -| Expected a| Binary | +++the signature+++ | | *x*{nbsp} -|=== - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:VALIDATION` {nbsp} - - -[[pgpBinaryToArmored]] -== Pgp Binary To Armored Operation -`` - -+++ -Converts an encrypted PGP message or a PGP signature to an ASCII armored representation, suitable for plain text channels. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Content a| Binary | +++the content to convert+++ | `#[payload]` | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:PARAMETERS` {nbsp} - -== Types -[[ExpirationPolicy]] -=== Expiration Policy - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Max Idle Time a| Number | A scalar time value for the maximum amount of time a dynamic configuration instance should be allowed to be idle before it's considered eligible for expiration | | -| Time Unit a| Enumeration, one of: - -** `NANOSECONDS` -** `MICROSECONDS` -** `MILLISECONDS` -** `SECONDS` -** `MINUTES` -** `HOURS` -** `DAYS` | A time unit that qualifies the maxIdleTime attribute | | -|=== - -[[repeatable-in-memory-stream]] -=== Repeatable In Memory Stream - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Initial Buffer Size a| Number | This is the amount of memory that will be allocated in order to consume the stream and provide random access to it. If the stream contains more data than can be fit into this buffer, then it will be expanded by according to the `bufferSizeIncrement` attribute, with an upper limit of `maxInMemorySize`. | | -| Buffer Size Increment a| Number | This is by how much will be buffer size by expanded if it exceeds its initial size. Setting a value of zero or lower will mean that the buffer should not expand, meaning that a `STREAM_MAXIMUM_SIZE_EXCEEDED` error will be raised when the buffer gets full. | | -| Max Buffer Size a| Number | This is the maximum amount of memory that will be used. If more than that is used then a `STREAM_MAXIMUM_SIZE_EXCEEDED` error will be raised. A value lower or equal to zero means no limit. | | -| Buffer Unit a| Enumeration, one of: - -** `BYTE` -** `KB` -** `MB` -** `GB` | The unit in which all these attributes are expressed | | -|=== - -[[repeatable-file-store-stream]] -=== Repeatable File Store Stream - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Max In Memory Size a| Number | Defines the maximum memory that the stream should use to keep data in memory. If more than that is consumed then it will start to buffer the content on disk. | | -| Buffer Unit a| Enumeration, one of: - -** `BYTE` -** `KB` -** `MB` -** `GB` | The unit in which maxInMemorySize is expressed | | -|=== - -[[PgpAsymmetricKeyInfo]] -=== Pgp Asymmetric Key Info - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Key Id a| String | Internal key ID for referencing from operations. | | x -| Key Pair Identifier a| <> | A way to identify the key inside the keystore. | | x -| Passphrase a| String | The password for unlocking the secret part of the key. | | -|=== - -[[PgpAsymmetricKeyIdentifier]] -=== PGP Asymmetric Key Identifier - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Fingerprint a| String | The Fingerprint of the configured key | | -| Principal a| String | A combination of name and email specified while generating the key. When you use this field, you use the primary key. -Do not use this field when you are using keys with different algorithms to sign and encrypt (for example, DSA and Elgamal); specify the proper key by using the `fingerprint` property instead. | | -|=== - -[[PgpKeySelection]] -=== PGP Key Selection - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Key is a| String | Internal key ID for referencing from operations | | -| Pgp Key info a| One of: - -* <> | An inline key definition. | | -|=== diff --git a/modules/ROOT/pages/cryptography-reference.adoc b/modules/ROOT/pages/cryptography-reference.adoc deleted file mode 100644 index fef5686db4..0000000000 --- a/modules/ROOT/pages/cryptography-reference.adoc +++ /dev/null @@ -1,95 +0,0 @@ -= General Operations -ifndef::env-site,env-github[] -include::_attributes.adoc[] -endif::[] - -The Cryptography module provides operations to calculate and validate a checksum to check data for errors. These operations are independent of the encryption strategy used. - -== Checksum Overview - -Checksum operations enable you to ensure message integrity. The Calculate Checksum operation acts as an enricher to generate a checksum for a message when it enters a system, and then the Validate Checksum operation acts as a filter to verify the checksum when the message leaves the system. If the entry and exit values do not match, a `CRYPTO:VALIDATION` error is raised. - -This pair of operations enables you to verify that a message remains intact between the sender and the receiver. Because checksum operations do not provide encryption or append a signature to the message, you can use the operations in conjunction with any other security features. - -[[calculateChecksum]] -== Calculate Checksum -`` - -+++ -Calculates the checksum of a given content or value, which can be an expression. You can select the hashing algorithm to use. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Algorithm a| Enumeration, one of: - -** `CRC32` -** `MD2` -** `MD5` -** `SHA_1` -** `SHA_256` -** `SHA_512` | +++the checksum algorithm+++ | `SHA_256` | {nbsp} -| Content a| Binary | +++The content for calculating the checksum+++ | `#[payload]` | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -String - -=== Throws -* `CRYPTO:CHECKSUM` {nbsp} - - -[[validateChecksum]] -== Validate Checksum -`` - -+++ -Validates the checksum of the content or value against the checksum previously calculated using the Calculate Checksum operation. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Algorithm a| Enumeration, one of: - -** `CRC32` -** `MD2` -** `MD5` -** `SHA_1` -** `SHA_256` -** `SHA_512` | +++The checksum algorithm+++ | `SHA_256` | {nbsp} -| Value a| Binary | +++The content for calculating the checksum+++ | `#[payload]` | {nbsp} -| Expected a| String | +++The expected checksum as an hexadecimal string+++ | | *x*{nbsp} -|=== - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:VALIDATION` {nbsp} - -== Configure Use Random Initialization Vectors - -You can enable the *Use random IVs* field to use random initialization vectors (IVs). If you enable this field, the decryption algorithm assumes IVs are prepended to the ciphertext during the decryption operation. To configure this field in Anypoint Studio, follow these steps: - -. In Studio, drag a Cryptography module operation to your flow, for example *Jce sign*. -. Select the operation from the flow. -. In the operation configuration screen, click the plus sign to access the module global configuration. -. In the *Global Element Properties* window, enable the *Use random IVs* field. - -image::crypto-random-iv.png[Use random IVs field selected] - -In the *XML editor* window, the *Use random IVs* field looks like this: - -[source,xml,linenums] ----- -crypto:jce-config name="Crypto_Jce" doc:name="Crypto Jce" keystore="/Users/MuleSoft/Desktop/jcekeystore.jks" password="mulesoft" useRandomIVs="true"> - - - - ----- \ No newline at end of file diff --git a/modules/ROOT/pages/cryptography-troubleshooting.adoc b/modules/ROOT/pages/cryptography-troubleshooting.adoc deleted file mode 100644 index 20f79b94d7..0000000000 --- a/modules/ROOT/pages/cryptography-troubleshooting.adoc +++ /dev/null @@ -1,97 +0,0 @@ -= Troubleshoot Cryptography Module - -To troubleshoot the Cryptography module, become familiar with app logs, PGP protocol, attached and detached signatures, and interpreting commonly thrown messages. - -== View the App Log - -If you encounter problems while running your Mule runtime engine (Mule) app, you can view the app log as follows: - -* If you’re running the app from Anypoint Platform, the output is visible in the Anypoint Studio console window. -* If you’re running the app using Mule from the command line, the app log is visible in your OS console. - -Unless the log file path is customized in the app’s log file `log4j2.xml`, view the app log in the default location `MULE_HOME/logs/.log`. - -== Enable Cryptography Module Debug Logging - -To begin troubleshooting the Cryptography module, enable debug logging to see the exact error messages: - -. Access Anypoint Studio and navigate to the *Package Explorer* view. -. Open your application by clicking the project name. -. Open the `src/main/resources` path folder. -. Open the `log4j2.xml` file inside the folder. -. Add the following line: -+ -`` - -[start=6] -. Save your changes. -. Click the project name in *Package Explorer* and then click *Run* > *Run As* > *Mule Application*. - -== Understand PGP Encryption and Decryption Configuration - -During PGP encryption, the sender of the message must encrypt its content using the receiver’s _public key_. To encrypt messages in your Mule app using someone else’s public key, in the *Crypto Pgp* global configuration add the _receiver_ public keyring file in the *Public keyring* field. - -During PGP decryption, the receiver of the message must use its _private key_ to decrypt the contents of a message that was encrypted using a public key. To decrypt the message, in the *Crypto Pgp* global configuration add the _receiver_ private keyring file in the *Private keyring* field. - -.Crypto Pgp Global configuration with Public keyring and Private keyring fields -image::mruntime-crypto-pgp-global-config.png[Crypto Pgp Global configuration with Public keyring and Private keyring fields] - -== Understand PGP Signature Configuration - -In addition to encrypting, you can sign a message. The signature provides an integrity check of the original message. - -To create a signature, in the *Crypto Pgp* global configuration add the _sender_ private keyring file in the *Private keyring* field. - -To validate a signature, in the *Crypto Pgp* global configuration add the _sender_ public keyring file in the *Public keyring* field. - -=== PGP Signature Types and Operations - -The Cryptography module has two PGP signature operations: - -* *Pgp sign*: Creates a PGP armored signature in ASCII format. -* *Pgp sign binary*: Creates a PGP binary signature. - -In both cases, signing includes the private key of the sender, so the secret passphrase must be provided. - -There are two types of signatures: - -* Attached signature + -Generates a single document file that contains both the signature and the original document. - -* Detached signature + -Generates a single document file that contains only the signature, which is stored and transmitted separately from the document the signature signs. - -Currently, the Cryptography module supports validation of detached signatures only. - -== Understand Common Throws - -Here is a list of common throw messages and how to interpret them: - -* CRYPTO:PARAMETERS - - The operation is configured using invalid parameters. - -* CRYPTO:MISSING_KEY - - A key required for the operation was not found. - -* CRYPTO:PASSPHRASE - - The unlocking password is invalid. - -* CRYPTO:CHECKSUM - - An error occurred during an attempt to calculate a checksum. - -* CRYPTO:TRANSFORMATION - - An error occurred during an attempt to transform binary to ASCII to build the ASCII Armor file. - -* CRYPTO:VALIDATION - - The signature cannot be validated against the data. - -== See Also - -* https://help.mulesoft.com[MuleSoft Help Center] -* xref:cryptography-reference.adoc[Cryptography Module Reference] diff --git a/modules/ROOT/pages/cryptography-xml.adoc b/modules/ROOT/pages/cryptography-xml.adoc deleted file mode 100644 index 7237b2f87d..0000000000 --- a/modules/ROOT/pages/cryptography-xml.adoc +++ /dev/null @@ -1,433 +0,0 @@ -= XML Cryptography -ifndef::env-site,env-github[] -include::_attributes.adoc[] -endif::[] -:keywords: cryptography, module, sign, encrypt, xml, AES -:toc: -:toc-title: - -== Configure XML Encryption from Anypoint Studio - -To configure XML encryption from Anypoint Studio, follow these steps: - -. From the Mule palette, add *Crypto* to your project. -+ -See xref:cryptography.adoc#install-crypto-module[Install the Extension] for instructions. -. Select the desired operation, and drag the component to the flow: -+ -image::mruntime-crypto-xml-add.png[crypto-xml-add] -. Open the component properties and select an existing *Module configuration*, or create a new one by specifying the *Keystore*, *Type* (JKS, JCEKS, PKCS12) and *Password*. -+ -You can also add symmetric or asymmetric key information to be used in the sign operations: -+ -image::mruntime-crypto-jce-global-config.png[crypto-jce-global-config] -. Configure *Key selection* by using a *Key id* value previously defined in the module configuration, or define a new one for this operation: -+ -image::mruntime-crypto-xml-config.png[crypto-xml-config] -. Select *Digest Algorithm*, *Canonicalization Algorithm*, *Type*, and *Element path*. - -== Encrypting - -This example configures a keystore that contains a symmetric key that will later be used for encryption. - -.Example: JCE Configuration -[source,xml,linenums] ----- - - - - - ----- - -In the next example, the XML encrypt operation is used to encrypt a specific element of the XML document. - -.Example: Using the Encrypt Operation -[source,xml,linenums] ----- - ----- - -The `elementPath` is an XPath expression that identifies the element to encrypt. -Depending on your needs, you can use a symmetric or asymmetric key for encrypting an XML document. - -== Decrypting - -.Example: JCE Configuration -[source,xml,linenums] ----- - - - - - - ----- - -In the next example, the XML decrypt operation (`crypto:xml-decrypt`) is used to decrypt an XML document. The operation uses the asymmetric key stored in the referenced keystore. - -.Example: Using the Decrypt Operation -[source,xml,linenums] ----- - ----- - -Depending on your needs, you can use a symmetric or asymmetric key for decryption. - -== Signing - -.Example: JCE Configuration -[source,xml,linenums] ----- - - - - - ----- - -The next example uses the asymmetric key to sign an XML document by creating an XML envelope and inserting the signature inside the content that is being signed. - -.Example: Enveloped Signature -[source,xml,linenums] ----- - ----- - -In the next example, a detached XML signature is created based on an element of the XML document. Instead of being inserted in the signed content, the detached signature is returned as a separate XML element. - -.Example: Detached Signature -[source,xml,linenums] ----- - ----- - -=== Selecting the Signing Algorithm - -In the *XML Sign* operation, the `digestAlgorithm` parameter defines the hashing algorithm applied to the content before signing, for example SHA1, SHA256, or SHA512. - -However, the final XML signature algorithm is not manually selected. It is automatically determined based on the type of key (RSA, DSA, EC, HMAC) configured in the module. - -The signing process combines the chosen hash algorithm `digestAlgorithm` with the key type to produce the signature method used in the XML document. - -For example: - -* An RSA key with `digestAlgorithm=SHA256` results in the `rsa-sha256` signature method. -* A DSA key with `digestAlgorithm=SHA1` results in the `dsa-sha1` signature method. -* An EC key with `digestAlgorithm=SHA256` results in the `ecdsa-sha256` signature method. - -If you want to use a different signature method, you must change the type of key in the `digestAlgorithm` parameter configuration. It is not currently possible to manually select the signature method within the operation. - -== Validating a Signature - -.Example: JCE Configuration -[source,xml,linenums] ----- - - - - - ----- - -In the next example, the asymmetric key is used to validate the signature of the XML element specified by the `elementPath` XPath expression. - -.Example: Using the Validate Operation -[source,xml,linenums] ----- - ----- - -If the document has multiple signatures, set `elementPath` to select the signature to validate. Specify a signed element using an XPath expression to validate the signature for that element. - -== Targeting a Custom Namespace by Using elementPath - -To sign or validate an XML element that is inside a custom namespace, specify the namespace by using the XPath functions: https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/namespace-uri[namespace-uri] and https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/local-name[local-name]. - -For example, consider the following document: -[source,xml,linenums] ----- - - - - - - - - ----- -To target the content of `FirstElement` inside `soap:Envelope`, you specify the `xmlns:soap` namespace. The XML schema for `xmlns:soap` is defined in `http://www.w3.org/2003/05/soap-envelope/`. - -The following example shows an `xml-sign` operation configured to sign `FirstElement`: -[source,xml,linenums] ----- - ----- -Note that the `elementPath` expression specifies the `xmlns:soap` namespace. - -== Reference - -=== Module Configuration - -JCE Configuration for Java keystores and inline keys to sign or encrypt XML documents or elements. - -==== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -|Name | String | The name for this configuration. Connectors reference the configuration with this name. | | *x*{nbsp} -| Keystore a| String | +++Path to the keystore file.+++ | | {nbsp} -| Type a| Enumeration, one of: - -** `JKS` -** `JCEKS` -** `PKCS12` | +++Type of the keystore.+++ | `JKS` | {nbsp} -| Password a| String | +++Password for unlocking the keystore.+++ | | {nbsp} -| Jce Key Infos a| Array of One of: - -* <> -* <> | +++List of keys to be considered, with internal IDs for referencing them.+++ | | {nbsp} -| Expiration Policy a| <> | +++Configures the minimum amount of time that a dynamic configuration instance can remain idle before the runtime considers it eligible for expiration. This does not mean that the platform will expire the instance at the exact moment that it becomes eligible. The runtime will actually purge the instances when it sees it fit.+++ | | {nbsp} -|=== - -[[xmlDecrypt]] -== Xml Decrypt Operation -`` - -+++ -Decrypts the XML document. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | +++the document to decrypt+++ | `#[payload]` | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:PARAMETERS` {nbsp} -* `CRYPTO:DECRYPTION` {nbsp} - - -[[xmlEncrypt]] -== Xml Encrypt Operation -`` - -+++ -Encrypt the XML document. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | +++the document to encrypt+++ | `#[payload]` | {nbsp} -| Algorithm a| Enumeration, one of: - -** `AES_CBC` -** `AES_GCM` -** `TRIPLEDES` | +++the algorithm for encryption+++ | `AES_CBC` | {nbsp} -| Element Path a| String | +++the path to the element to encrypt, if empty the whole document is considered+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:ENCRYPTION` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PARAMETERS` {nbsp} - - -[[xmlSign]] -== Xml Sign Operation -`` - -+++ -Sign an XML document. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | +++the XML document to sign+++ | `#[payload]` | {nbsp} -| Digest Algorithm a| Enumeration, one of: - -** `RIPEMD160` -** `SHA1` -** `SHA256` -** `SHA512` | +++the hashing algorithm for signing+++ | `SHA256` | {nbsp} -| Canonicalization Algorithm a| Enumeration, one of: - -** `EXCLUSIVE` -** `EXCLUSIVE_WITH_COMMENTS` -** `INCLUSIVE` -** `INCLUSE_WITH_COMMENTS` | +++the canonicalization method for whitespace and namespace unification+++ | `EXCLUSIVE` | {nbsp} -| Type a| Enumeration, one of: - -** `DETACHED` -** `ENVELOPED` -** `ENVELOPING` | +++the type of signature to create+++ | `ENVELOPED` | {nbsp} -| Element Path a| String | +++for internally detached signatures, an unambiguous XPath expression resolving to the element to sign+++ | | {nbsp} -| Streaming Strategy a| * <> -* <> -* non-repeatable-stream | +++Configure if repeatable streams should be used and their behavior+++ | | {nbsp} -| Key Id a| String | +++The key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -| Target Variable a| String | +++The name of a variable on which the operation's output will be placed+++ | | {nbsp} -| Target Value a| String | +++An expression that will be evaluated against the operation's output and the outcome of that expression will be stored in the target variable+++ | `#[payload]` | {nbsp} -|=== - -=== Output Type - -Binary - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:KEY` {nbsp} -* `CRYPTO:PASSPHRASE` {nbsp} -* `CRYPTO:SIGNATURE` {nbsp} - - -[[xmlValidate]] -== Xml Validate Operation -`` - -+++ -Validate an XML signed document. -+++ - -=== Parameters -[cols=".^20%,.^20%,.^35%,.^20%,^.^5%", options="header"] -|=== -| Name | Type | Description | Default Value | Required -| Configuration | String | The name of the configuration to use. | | *x*{nbsp} -| Content a| Binary | +++Specifies the document to verify (includes the signature).+++ | `#[payload]` | {nbsp} -| Element Path a| String | +++For internally detached signatures, an unambiguous XPath expression that resolves to the signed element.+++ | | {nbsp} -| Use inline certificate if present a| Boolean | +++Specify whether or not to validate the signature against a certificate contained in the +++`ds:Signature`+++ element, if the certificate is present.+++ | `"false"` | {nbsp} -| Key Id a| String | +++Specifies the key ID, as defined in the JCE configuration.+++ | | {nbsp} -| Jce Key Info a| One of: - -* <> -* <> | +++An inline key definition.+++ | | {nbsp} -|=== - -=== Throws -* `CRYPTO:MISSING_KEY` {nbsp} -* `CRYPTO:PARAMETERS` {nbsp} -* `CRYPTO:VALIDATION` {nbsp} - -== Types Definition -[[ExpirationPolicy]] -=== Expiration Policy - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Max Idle Time a| Number | A scalar time value for the maximum amount of time a dynamic configuration instance should be allowed to be idle before it's considered eligible for expiration | | -| Time Unit a| Enumeration, one of: - -** `NANOSECONDS` -** `MICROSECONDS` -** `MILLISECONDS` -** `SECONDS` -** `MINUTES` -** `HOURS` -** `DAYS` | A time unit that qualifies the maxIdleTime attribute | | -|=== - -[[repeatable-in-memory-stream]] -=== Repeatable In Memory Stream - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Initial Buffer Size a| Number | This is the amount of memory that will be allocated in order to consume the stream and provide random access to it. If the stream contains more data than can be fit into this buffer, then it will be expanded by according to the `bufferSizeIncrement` attribute, with an upper limit of `maxInMemorySize`. | | -| Buffer Size Increment a| Number | This is by how much will be buffer size by expanded if it exceeds its initial size. Setting a value of zero or lower will mean that the buffer should not expand, meaning that a `STREAM_MAXIMUM_SIZE_EXCEEDED` error will be raised when the buffer gets full. | | -| Max Buffer Size a| Number | This is the maximum amount of memory that will be used. If more than that is used then a `STREAM_MAXIMUM_SIZE_EXCEEDED` error will be raised. A value lower or equal to zero means no limit. | | -| Buffer Unit a| Enumeration, one of: - -** `BYTE` -** `KB` -** `MB` -** `GB` | The unit in which all these attributes are expressed | | -|=== - -[[repeatable-file-store-stream]] -=== Repeatable File Store Stream - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Max In Memory Size a| Number | Defines the maximum memory that the stream should use to keep data in memory. If more than that is consumed then it will start to buffer the content on disk. | | -| Buffer Unit a| Enumeration, one of: - -** `BYTE` -** `KB` -** `MB` -** `GB` | The unit in which maxInMemorySize is expressed | | -|=== - -[[JceAsymmetricKeyInfo]] -=== Jce Asymmetric Key Info - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Key Id a| String | Internal key ID for referencing from operations. | | x -| Alias a| String | Alias of the key in the keystore. | | x -| Password a| String | Password used to unlock the private part of the key. | | -|=== - -[[JceSymmetricKeyInfo]] -=== Jce Symmetric Key Info - -[cols=".^20%,.^25%,.^30%,.^15%,.^10%", options="header"] -|=== -| Field | Type | Description | Default Value | Required -| Key Id a| String | Internal key ID for referencing from operations. | | x -| Alias a| String | Alias of the key in the keystore. | | x -| Password a| String | Password used to unlock the key. | | x -|=== diff --git a/modules/ROOT/pages/cryptography.adoc b/modules/ROOT/pages/cryptography.adoc deleted file mode 100644 index 3136d1577f..0000000000 --- a/modules/ROOT/pages/cryptography.adoc +++ /dev/null @@ -1,33 +0,0 @@ -= About the Cryptography Module -ifndef::env-site,env-github[] -include::_attributes.adoc[] -endif::[] -:keywords: cryptography, module, sign, encrypt, pgp, jce, AES - -This module provides cryptography capabilities to a Mule application. Its main features include: - -* Symmetric encryption and decryption of messages. -* Asymmetric encryption and decryption of messages. -* Message signing and signature validation of signed messages. - -This module supports three different strategies to encrypt and sign your messages: - -* xref:cryptography-pgp.adoc[PGP]: Signature/encryption using PGP. -* xref:cryptography-xml.adoc[XML]: For signing or encrypting XML documents or elements. -* xref:cryptography-jce.adoc[JCE]: For using a wider range of cryptography capabilities as provided by the Java Cryptography Extension. - -Additionally, this module offers two general operations to calculate and validate stream checksums. + -See xref:cryptography-reference.adoc[General Operations] for more information. - -== Using the Extension in Anypoint Studio 7 - -You can use this extension by adding it as a dependency in your Mule app. - -[[install-crypto-module]] -=== Installing the Extension - -. Open your Mule project in Anypoint Studio. -. Go to the Mule Palette. -. Select **Search in Exchange**, and search for the Cryptography Module. -. Add the extension. -. You can now search in the mule Palette for operations of the Cryptography module. diff --git a/modules/ROOT/pages/securing.adoc b/modules/ROOT/pages/securing.adoc deleted file mode 100644 index 9ad7806e80..0000000000 --- a/modules/ROOT/pages/securing.adoc +++ /dev/null @@ -1,72 +0,0 @@ -= Security -ifndef::env-site,env-github[] -include::_attributes.adoc[] -endif::[] -:keywords: security, securing -:page-aliases: mule-security.adoc, configuring-security.adoc - -It is critical to ensure that the valuable information that a business stores and makes available through software applications and web services is secure, protected from unauthorized users and malicious attackers. But it is also critical that these protected resources, such as credit card information or Social Security numbers, be immediately accessible to authorized, legitimate users and systems to conduct business transactions. + - -To provide secure access to information, applications and services can apply a variety of security measures. Mule runtime engine (Mule) provides several tools and methods that enables you to protect applications: - -* Securing application configuration properties -* Using the Cryptography module -* Configuring a FIPS 140-2 certified environment -* Securing flows with Spring security -* Configuring TLS cryptographic protocol -* Obtaining access to protected resource using Oath Authorization Grant Types -* Configuring the Mule Secure Token Service - - -== Secure Configuration Properties -Encrypting configuration properties for your applications involves creating a secure configuration properties file, defining the secure properties in the file, and configuring the file in your project with the Mule Secure Configuration Properties Extension module. + - -See details in xref:secure-configuration-properties.adoc[Secure Configuration Properties] - -== Cryptography Module -The Cryptography module provides the following main cryptography capabilities to a Mule application: - -* Symmetric and asymmetric encryption and decryption of messages -* Message signing and signature validation of signed messages + - -This module supports three different strategies to encrypt and sign your messages: - -* xref:cryptography-pgp.adoc[PGP] + -Provides basic signing and encryption. -* xref:cryptography-xml.adoc[XML] + -Provides signing and encryption of XML documents or elements. -* xref:cryptography-jce.adoc[JCE] + -Provides the wide range of cryptography capabilities available through the Java Cryptography Extension. + - -See details in xref:cryptography.adoc[Cryptography Module]. - -== FIPS 140-2 Compliance Support -You can configure Mule 4 to run in a FIPS 140-2 certified environment if you meet the following two requirements: - -* A certified cryptography module installed in your Java environment -* Mule settings adjusted to run in FIPS security mode - -See details in xref:fips-140-2-compliance-support.adoc[FIPS 140-2 Compliance Support] - -== Spring Security -Spring Security provides authentication and authorization via JAAS, LDAP, CAS (Yale Central Authentication service), and DAO. The following topics help get you started securing your flows using Spring Security: - -* xref:setting-up-ldap-provider-for-spring-security.adoc[Configure LDAP Provider for Spring Security] + -Perform component authorization, or use it as a Mule security provider. -* xref:component-authorization-using-spring-security.adoc[Component Authorization Using Spring Security] + -Configure authorization using Spring Security features on your Mule components, so that users with different roles can only invoke certain methods. - -== TLS Configuration -TLS is a cryptographic protocol that provides communications security for your Mule app. Mule 4.x supports Transport Layer Security (TLS) 1.1 and 1.2. - -See details in xref:tls-configuration.adoc[TLS Configuration] - -== OAuth Authorization Grant Types -There are four types of authorization grants that an OAuth consumer (a client app) can use to obtain access to a protected resource from an OAuth service provider: Authorization Code, Implicit, Resource Owner Password Credentials, and Client Credentials. - -See details in xref:authorization-grant-types.adoc[OAuth Authorization Grant Types] - -== Mule Secure Token Service -Mule supports the OAuth 2.0 protocol. How you configure OAuth 2.0 authorization depends on your OAuth role and objective. - -See details in xref:mule-secure-token-service.adoc[Mule Secure Token Service] From ecfaee815a0772d1ce633f98f90c24d3a5b482e2 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Wed, 25 Jun 2025 17:32:05 -0300 Subject: [PATCH 101/119] W-18894569-adjustTables-mule44-dm --- .../ROOT/pages/batch-error-handling-faq.adoc | 21 ++++++++++++------- .../ROOT/pages/mule-server-notifications.adoc | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/batch-error-handling-faq.adoc b/modules/ROOT/pages/batch-error-handling-faq.adoc index db9f9b74a4..dddf4de375 100644 --- a/modules/ROOT/pages/batch-error-handling-faq.adoc +++ b/modules/ROOT/pages/batch-error-handling-faq.adoc @@ -115,14 +115,19 @@ By default, Mule's batch jobs follow the first error handling strategy which hal [%header,cols="40a,30a,30a"] |=== -|Failed Record Handling Option 2+^|Batch Job -| | *Attribute* | *Value* -| Stop processing when a failed record is found. -| `maxFailedRecords`|`0` -| Continue processing indefinitely, regardless of the number of failed records. -| `maxFailedRecords` |`-1` -| Continue processing until reaching maximum number of failed records. -| `maxFailedRecords` | `integer` +|Failed Record Handling Option |Batch Job Attribute |Value + +|Stops processing when a failed record is found +|`maxFailedRecords` +|`0` + +|Continues processing indefinitely, regardless of the number of failed records +|`maxFailedRecords` +|`-1` + +|Continues processing until reaching the maximum number of failed records +|`maxFailedRecords` +|`integer` |=== [source,xml,linenums] diff --git a/modules/ROOT/pages/mule-server-notifications.adoc b/modules/ROOT/pages/mule-server-notifications.adoc index afb01df85f..ab7f26517d 100644 --- a/modules/ROOT/pages/mule-server-notifications.adoc +++ b/modules/ROOT/pages/mule-server-notifications.adoc @@ -279,8 +279,8 @@ All notifications extend `java.util.EventObject`, and you can use the `getSource |Exception Strategy Notification |ComponentLocation |Component name |The flow component that triggered this notification. -|Extension Notification |Object | |The payload can change from one extension to another. +|Extension Notification |Object |Extension name |The payload can change from one extension to another. -|Connector-Message Notification ||ComponentLocation |Component name |The flow component that triggered this notification. +|Connector-Message Notification |ComponentLocation |Component name |The flow component that triggered this notification. |=== From b15a7fe953d354ef5b48de9fc7020f2205ebd8a6 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Thu, 26 Jun 2025 14:03:04 -0300 Subject: [PATCH 102/119] W-18900906-CH2vCores-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 6de6f2d0a5..5d33c82fcd 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -172,7 +172,7 @@ This value must match an environment configured in your Anypoint Platform accoun | `vCores` | The size of each replica specified in vCores. Accepted values: `0.1`, `0.2`, `0.5`, `1`, `1.5`, `2`, `2.5`, `3`, `3.5`, `4`. See xref:cloudhub-2::ch2-architecture.adoc#cloudhub-2-replicas[CloudHub 2.0 Replicas] for a detailed description of available vCore sizes and their assigned hardware resources. -| No +| Yes (Only when `instanceType` isn't configured.) include::mule-runtime::partial$mmp-concept.adoc[tag=businessGroupParameterDescription] include::mule-runtime::partial$mmp-concept.adoc[tag=businessGroupIdParameterDescription] include::mule-runtime::partial$mmp-concept.adoc[tag=deploymentTimeoutParameterDescription] From 4dfba762bd468ee35667fa4777d48aa52caa807b Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Fri, 27 Jun 2025 17:33:39 -0300 Subject: [PATCH 103/119] W-18622249-prerequisite-MuleLicense-44-dm --- .../pages/installing-an-enterprise-license.adoc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/installing-an-enterprise-license.adoc b/modules/ROOT/pages/installing-an-enterprise-license.adoc index 0461927a1e..78fdc5a53e 100644 --- a/modules/ROOT/pages/installing-an-enterprise-license.adoc +++ b/modules/ROOT/pages/installing-an-enterprise-license.adoc @@ -14,13 +14,14 @@ Complete the following steps to acquire and install a non-trial *Enterprise lice .. Delete the existing `muleLicenseKey.lic` file. . If you are installing your license on multiple platforms, back up your new `license.lic` file in another location before proceeding. . Make sure that the Mule Server is *stopped (not running)* and then open the terminal or command line on your system. -. On *Mac/Unix/Linux*, from the `$MULE_HOME/bin` directory, run the following command: +. Set the `JAVA_HOME` environment variable before running the `mule -installLicense` command. + -`mule -installLicense ~/license.lic` + - + -On *Windows*, first copy the `license.lic` file into the `\bin` folder, then execute the following in the command line: - + -`mule.bat -installLicense license.lic` + +.. On *Mac/Unix/Linux*, if `JAVA_HOME` isn't detected automatically, set it to avoid any issues. +.. On *Windows*, if `JAVA_HOME` isn't set, the license installation fails. +. Run the license installation command: ++ +.. On *Mac/Unix/Linux*, from the `$MULE_HOME/bin` directory, run `mule -installLicense ~/license.lic`. +.. On *Windows*, copy the `license.lic` file to the `\bin` folder, and then run `mule.bat -installLicense license.lic` from the command line. . In the `$MULE_HOME/conf` directory, Mule saves a new file called `muleLicenseKey.lic`. This shows that the license has been installed. . *Start* your Mule Server again, by the usual means. From a1a5bf703d3b76a9d063a67f96f33c2d53364df2 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Tue, 1 Jul 2025 16:51:36 -0300 Subject: [PATCH 104/119] W-18903018-cronExpressionW-44-dm --- modules/ROOT/pages/scheduler-concept.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/scheduler-concept.adoc b/modules/ROOT/pages/scheduler-concept.adoc index 7c5209f402..af0948fa2e 100644 --- a/modules/ROOT/pages/scheduler-concept.adoc +++ b/modules/ROOT/pages/scheduler-concept.adoc @@ -233,7 +233,7 @@ The Scheduler component also supports Quartz Scheduler special characters: * `/`: Incremental values, for example, `1/7`. * `L`: Last day of the week or month, or last specific day of the month (such as `6L` for the last Saturday of the month). -* `W`: Weekday, which is valid in the month and day-of-the-week fields. +* `W`: Weekday, which is valid in the day-of-month field and must follow a specific day. For example, `15W` for the weekday nearest to the 15th of the month. * `#`: "nth" day of the month. For example, `#3` is the third day of the month. //source info: +http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html+ From bb5c7bd626abe754960e744a29e7352a97380808 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Tue, 1 Jul 2025 18:19:03 -0300 Subject: [PATCH 105/119] W-18404398-until-successful-scope-rewrite-44-dm --- modules/ROOT/pages/until-successful-scope.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/until-successful-scope.adoc b/modules/ROOT/pages/until-successful-scope.adoc index a743655e41..c3306aba88 100644 --- a/modules/ROOT/pages/until-successful-scope.adoc +++ b/modules/ROOT/pages/until-successful-scope.adoc @@ -10,7 +10,7 @@ Until Successful runs synchronously. If any processor within the scope fails to connect or to produce a successful result, Until Successful retries all the processors within it, including the one that failed, until all configured retries are exhausted. If a retry succeeds, the scope proceeds to the next -component. If the final retry does not succeed, Until Successful produces an error. +component. If the final retry doesn't succeed, Until Successful produces an error. Routing is successful if no exception is raised or if the response matches an expression. @@ -31,7 +31,7 @@ You can configure the following attributes in the Until Successful scope: |=== |Field | XML | Description |Max Retries | `maxRetries` |Specifies the maximum number of retries that are allowed. This attribute can be either a number or an expression that resolves to a number. An error message looks like this: `Message: 'until-successful' retries exhausted.` The Mule error type is `MULE:RETRY_EXHAUSTED`. -|Milliseconds Between Retries | `millisBetweenRetries` |Specifies, in milliseconds, the minimum interval between two retries. The actual interval depends on the previous execution, but it should not exceed twice this number. The default value is 60000 milliseconds (one minute). This attribute can be either a number or an expression that resolves to a number. +|Milliseconds Between Retries | `millisBetweenRetries` |Specifies the minimum interval, in milliseconds, between retries. The actual interval depends on the duration of the previous attempt, but it shouldn't exceed twice this value. The default is `60000` (one minute). This attribute can be either a number or an expression that resolves to a number. |=== == Example Configuration of the Until Successful Scope @@ -89,7 +89,7 @@ The next processor after the Until Successful scope executes, in this case, the == Variable Propagation -Every execution of the Until Successful scope starts with the same variables and values present before the execution of the block. New variables or modifications to already-existing variables while processing one element are not visible in the next execution (in case there is an error). If the execution finishes correctly, the variables (and payload) are propagated to the rest of the flow. +Every execution of the Until Successful scope starts with the same variables and values present before the execution of the block. New variables or modifications to already-existing variables while processing one element aren't visible in the next execution (in case there is an error). If the execution finishes correctly, the variables (and payload) are propagated to the rest of the flow. == See also From e3e17fe08a9499285e898cab07fce91fa4733ec7 Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 12:22:09 -0700 Subject: [PATCH 106/119] W-18823869: Replace xref:2.1@munit::index.adoc with xref:munit::index.adoc --- modules/ROOT/pages/continuous-integration.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/continuous-integration.adoc b/modules/ROOT/pages/continuous-integration.adoc index d6846cccab..3c6af2b1bf 100644 --- a/modules/ROOT/pages/continuous-integration.adoc +++ b/modules/ROOT/pages/continuous-integration.adoc @@ -33,7 +33,7 @@ You can deploy Mule applications using: * xref:api-manager::getting-started-proxy.adoc[The API Manager] * xref:runtime-manager::runtime-manager-agent.adoc[The Runtime Manager Agent] -You can create functional tests with xref:2.1@munit::index.adoc[MUnit Unit Testing]. +You can create functional tests with xref:munit::index.adoc[MUnit Unit Testing]. The mule-maven-plugin supports deployments to: @@ -66,4 +66,4 @@ If your target deployable is a web application and not a Mule application, consi == See Also * xref:using-maven-with-mule.adoc[Maven Support in Mule] -* xref:2.1@munit::index.adoc[MUnit Unit Testing] +* xref:munit::index.adoc[MUnit Unit Testing] From 7fc4f93d4f29ec6aff9d2a2d3b9d2ab089ea4c2f Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 12:34:54 -0700 Subject: [PATCH 107/119] Replace xref with context variables text in migration-mel.adoc --- modules/ROOT/pages/migration-mel.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/migration-mel.adoc b/modules/ROOT/pages/migration-mel.adoc index 6ae954382d..f45a68551e 100644 --- a/modules/ROOT/pages/migration-mel.adoc +++ b/modules/ROOT/pages/migration-mel.adoc @@ -43,7 +43,7 @@ attachments or exception payloads MEL is recommended. The next sections show how to adapt some uses of MEL to Mule 4. === Accessing Context Variables -Except for the following changes, xref:3.9@mule-runtime::mel-cheat-sheet.adoc#server-mule-application-and-message-variables[context variables] +Except for the following changes, context variables (also called Mule Runtime variables) remain the same in DataWeave: [cols="1a,1a", options="header"] From bb9d2516071e8c76725e7b0bdd8e46b66fe43a3e Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 12:45:33 -0700 Subject: [PATCH 108/119] Remove Mule 3 class-loading xref bullet point --- modules/ROOT/pages/about-classloading-isolation.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ROOT/pages/about-classloading-isolation.adoc b/modules/ROOT/pages/about-classloading-isolation.adoc index 1a32d05273..4e6b618421 100644 --- a/modules/ROOT/pages/about-classloading-isolation.adoc +++ b/modules/ROOT/pages/about-classloading-isolation.adoc @@ -144,5 +144,4 @@ See xref:mmp-concept.adoc#configure-plugin-dependencies[Configure Plugin Depende == See Also -* xref:3.9@mule-runtime::classloader-control-in-mule.adoc[Mule 3 Class-loading] * xref:mule-sdk::isolation.adoc[Mule SDK - About Class-loading Isolation] From 23d058ff68a4bd20868d7a065a74e6b9c9716ef4 Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 12:59:23 -0700 Subject: [PATCH 109/119] Replace xref:2.2@munit::munit-test-concept.adoc with xref:munit::munit-test-concept.adoc --- modules/ROOT/pages/migration-munit-test-structure.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/migration-munit-test-structure.adoc b/modules/ROOT/pages/migration-munit-test-structure.adoc index 3786f49891..8c6ec96add 100644 --- a/modules/ROOT/pages/migration-munit-test-structure.adoc +++ b/modules/ROOT/pages/migration-munit-test-structure.adoc @@ -58,4 +58,4 @@ The following examples compare MUnit tests in 1.x to 2.x. == See Also -* xref:2.2@munit::munit-test-concept.adoc[MUnit 2 Test structure] +* xref:munit::munit-test-concept.adoc[MUnit 2 Test structure] From 1120938ae89769a5a1ce2fa849ad331947efa956 Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 13:07:33 -0700 Subject: [PATCH 110/119] Replace xref:cryptography.adoc[Cryptography Module] with xref:securing.adoc#cryptography-module[Cryptography Module] --- modules/ROOT/pages/migration-aes.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/migration-aes.adoc b/modules/ROOT/pages/migration-aes.adoc index e7ce3a993d..5ded4b3747 100644 --- a/modules/ROOT/pages/migration-aes.adoc +++ b/modules/ROOT/pages/migration-aes.adoc @@ -5,7 +5,7 @@ endif::[] In Mule 4, the Anypoint Enterprise Security module was split into different modules: -* xref:cryptography.adoc[Cryptography Module] replaces the Mule 3 Encryption and Signature modules +* xref:securing.adoc#cryptography-module[Cryptography Module] replaces the Mule 3 Encryption and Signature modules * xref:secure-configuration-properties.adoc[Secure Configuration Properties Module] replaces the Mule 3 Secure Property Placeholder * xref:connectors::validation/validation-connector.adoc[Validation Module] incorporated functionality from the Mule 3 Filters Module * xref:connectors::oauth/oauth2-provider-documentation-reference.adoc[OAuth2 Provider] replaces the Mule 3 OAuth2 Provider From 0ee5dad435b9c8d86cf0a4a14da0feb585024987 Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 13:18:44 -0700 Subject: [PATCH 111/119] Add securing.adoc file to fix broken cryptography xref links --- modules/ROOT/pages/securing.adoc | 73 ++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 modules/ROOT/pages/securing.adoc diff --git a/modules/ROOT/pages/securing.adoc b/modules/ROOT/pages/securing.adoc new file mode 100644 index 0000000000..5d4dbaecf8 --- /dev/null +++ b/modules/ROOT/pages/securing.adoc @@ -0,0 +1,73 @@ += Security +ifndef::env-site,env-github[] +include::_attributes.adoc[] +endif::[] +:keywords: security, securing +:page-aliases: mule-security.adoc, configuring-security.adoc + +It is critical to ensure that the valuable information that a business stores and makes available through software applications and web services is secure, protected from unauthorized users and malicious attackers. But it is also critical that these protected resources, such as credit card information or Social Security numbers, be immediately accessible to authorized, legitimate users and systems to conduct business transactions. + + +To provide secure access to information, applications and services can apply a variety of security measures. Mule runtime engine (Mule) provides several tools and methods that enables you to protect applications: + +* Securing application configuration properties +* Using the Cryptography module +* Configuring a FIPS 140-2 certified environment +* Securing flows with Spring security +* Configuring TLS cryptographic protocol +* Obtaining access to protected resource using Oath Authorization Grant Types +* Configuring the Mule Secure Token Service + + +== Secure Configuration Properties +Encrypting configuration properties for your applications involves creating a secure configuration properties file, defining the secure properties in the file, and configuring the file in your project with the Mule Secure Configuration Properties Extension module. + + +See details in xref:secure-configuration-properties.adoc[Secure Configuration Properties] + +== Cryptography Module +Cryptography Module provides cryptography capabilities to a Mule application. Its main features include: + +* Symmetric encryption and decryption of messages. +* Asymmetric encryption and decryption of messages. +* Message signing and signature validation of signed messages. + +The module supports these strategies to encrypt and sign your messages: + +* JCE + +Provides cryptography capabilities of Java Cryptography Extension. +* PGP + +Provides signing and encryption using Pretty Good Privacy. +* XML + +Provides signing and encryption of XML documents or elements. + +For details, refer to xref:cryptography-module::index.adoc[Cryptography Module]. + +== FIPS 140-2 Compliance Support +You can configure Mule 4 to run in a FIPS 140-2 certified environment if you meet the following two requirements: + +* A certified cryptography module installed in your Java environment +* Mule settings adjusted to run in FIPS security mode + +See details in xref:fips-140-2-compliance-support.adoc[FIPS 140-2 Compliance Support] + +== Spring Security +Spring Security provides authentication and authorization via JAAS, LDAP, CAS (Yale Central Authentication service), and DAO. The following topics help get you started securing your flows using Spring Security: + +* xref:setting-up-ldap-provider-for-spring-security.adoc[Configure LDAP Provider for Spring Security] + +Perform component authorization, or use it as a Mule security provider. +* xref:component-authorization-using-spring-security.adoc[Component Authorization Using Spring Security] + +Configure authorization using Spring Security features on your Mule components, so that users with different roles can only invoke certain methods. + +== TLS Configuration +TLS is a cryptographic protocol that provides communications security for your Mule app. Mule 4.x supports Transport Layer Security (TLS) 1.1 and 1.2. + +See details in xref:tls-configuration.adoc[TLS Configuration] + +== OAuth Authorization Grant Types +There are four types of authorization grants that an OAuth consumer (a client app) can use to obtain access to a protected resource from an OAuth service provider: Authorization Code, Implicit, Resource Owner Password Credentials, and Client Credentials. + +See details in xref:authorization-grant-types.adoc[OAuth Authorization Grant Types] + +== Mule Secure Token Service +Mule supports the OAuth 2.0 protocol. How you configure OAuth 2.0 authorization depends on your OAuth role and objective. + +See details in xref:mule-secure-token-service.adoc[Mule Secure Token Service] From 4fa0c1e22c1bc8bdf7c05eb682590aa764c4b6c6 Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 13:20:13 -0700 Subject: [PATCH 112/119] Fix broken cryptography xref in fips-140-2-compliance-support.adoc --- modules/ROOT/pages/fips-140-2-compliance-support.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/fips-140-2-compliance-support.adoc b/modules/ROOT/pages/fips-140-2-compliance-support.adoc index f077c4b61b..4d009cffbe 100644 --- a/modules/ROOT/pages/fips-140-2-compliance-support.adoc +++ b/modules/ROOT/pages/fips-140-2-compliance-support.adoc @@ -141,7 +141,7 @@ Open the relevant file and comment or uncomment items in the lists to manually c == Tips and Limitations * The Bouncy Castle security provider bundled with the Mule Runtime distribution isn't FIPS certified. When Mule starts in FIPS security mode, the Bouncy Castle provider isn't registered or used. -* Not all encryption schemes and signatures included in xref:cryptography.adoc[Mule Cryptography Module] and xref:secure-configuration-properties.adoc[Mule Secure Properties] configuration options are FIPS compliant. If your application is using an algorithm that isn't approved for FIPS use, you will get an error at runtime that reads: +* Not all encryption schemes and signatures included in xref:securing.adoc#cryptography-module[Mule Cryptography Module] and xref:secure-configuration-properties.adoc[Mule Secure Properties] configuration options are FIPS compliant. If your application is using an algorithm that isn't approved for FIPS use, you will get an error at runtime that reads: .... Could not find encryption algorithm ''. You are running in FIPS mode, so please verify that From f5a1ee886cc68f524018b46697f42d90f0212ccb Mon Sep 17 00:00:00 2001 From: johanna-nelson_sfemu Date: Wed, 2 Jul 2025 13:39:45 -0700 Subject: [PATCH 113/119] Remove MEL xref reference from migration-mel.adoc --- modules/ROOT/pages/migration-mel.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ROOT/pages/migration-mel.adoc b/modules/ROOT/pages/migration-mel.adoc index f45a68551e..c0d542ae69 100644 --- a/modules/ROOT/pages/migration-mel.adoc +++ b/modules/ROOT/pages/migration-mel.adoc @@ -421,7 +421,6 @@ xref:dataweave.adoc[DataWeave Language] https://blogs.mulesoft.com/dev/mule-dev/why-dataweave-main-expression-language-mule-4/[Why DataWeave is the Main Expression Language in Mule 4 Beta] -xref:3.9@mule-runtime::mule-expression-language-mel.adoc[Mule Expression Language (MEL)] (3.9) //// From a6992339e44cfc974ef29a00d5b4d954ebe8c259 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Mon, 7 Jul 2025 18:46:00 -0300 Subject: [PATCH 114/119] W-18982533-upgradeTOOLupdate-44-dm --- modules/ROOT/pages/mule-upgrade-tool.adoc | 27 +++++++++-------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/modules/ROOT/pages/mule-upgrade-tool.adoc b/modules/ROOT/pages/mule-upgrade-tool.adoc index c25a38cab4..e34ed6e2e4 100644 --- a/modules/ROOT/pages/mule-upgrade-tool.adoc +++ b/modules/ROOT/pages/mule-upgrade-tool.adoc @@ -6,7 +6,9 @@ If the Runtime Manager agent is installed in your current Mule instance, the upg Upgrading the Anypoint Monitoring agent isn't supported. To proceed with an upgrade, you must first uninstall the agent, and reinstall it after the Mule instance upgrade is complete. See xref:monitoring::am-installing.adoc#update-the-anypoint-monitoring-agent[Update the Anypoint Monitoring Agent]. -The Mule upgrade tool supports upgrading clustered Mule instances by manually upgrading each node using the tool. For additional information on how to proceed with the upgrade, see <>. Though highly recommended, using the tool is not strictly necessary to upgrade your current Mule instance. For a completely manual upgrade, see xref:release-notes::mule-runtime/updating-mule-4-versions.adoc#mulerunvers[Upgrading an On-Premises Mule Instance Managed Through Runtime Manager]. +The upgrade tool doesn't modify Mule applications running on the runtime you're upgrading. + +The Mule upgrade tool supports upgrading clustered Mule instances by manually upgrading each node using the tool. For additional information on how to proceed with the upgrade, see <>. Though highly recommended, using the tool isn't strictly necessary to upgrade your current Mule instance. For a completely manual upgrade, see xref:release-notes::mule-runtime/updating-mule-4-versions.adoc#mulerunvers[Upgrading an On-Premises Mule Instance Managed Through Runtime Manager]. == Before You Begin @@ -158,8 +160,7 @@ The following are the supported options for this subcommand. The following are some of the most common error messages from the upgrade tool and include the error description and a proposed solution. -=== Missing required subcommand - +=== Missing Required Subcommand ---- ./upgrade-tool @@ -182,13 +183,11 @@ Ensure you are running the `upgrade-tool` command and specifying any of the supp The `-h` or `--help` options enable you to get additional details for a certain subcommand, for example: - ---- $ ./upgrade-tool rollback --help ---- -=== Missing required option - +=== Missing Required Option ---- ./upgrade-tool upgrade @@ -215,7 +214,6 @@ Run the following command to get information about which arguments are required After running the command, the tool outputs additional information: - ---- Mule Runtime Upgrade Tool ───────────────────────── @@ -237,8 +235,7 @@ Upgrades a Mule Runtime to a newer version The `Usage:` line specifies which options and arguments are optional by enclosing them in square brackets (`[`,`]`). Options and arguments without square brackets are mandatory. -=== No space left on device - +=== No Space Left on Device ---- $ ./upgrade-tool upgrade -n /tmp/mule-enterprise-standalone-4.4.0-20211104 @@ -265,15 +262,13 @@ enough disk space available and that any other requirements are met. On Linux environments, use the `df` command to check available disk space: - ---- $ df -h /opt Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg-opt 419G 205G 193G 52% /opt ---- -=== Version should be newer - +=== Version Should Be Newer ---- ./upgrade-tool upgrade -n /tmp/mule-enterprise-standalone-4.4.0-20211104 @@ -294,7 +289,7 @@ This error occurs when the upgrade command specifies a new Mule distribution tha Verify that the downloaded Mule distribution is in a later version than your current Mule instance. If you continue to receive this error message during the upgrade, it means that the current Mule instance is already updated or running the latest available version. -=== Missing reading permissions +=== Missing Reading Permissions ---- ./upgrade-tool upgrade -n /tmp/mule-enterprise-standalone-4.4.0-20211104 @@ -317,7 +312,7 @@ Read permissions in the new Mule distribution are required but not set for the u Obtain read permission for files that the upgrade identifies as unreadable. Contact your system administrator for assistance, if necessary. -=== Missing writing permissions +=== Missing Writing Permissions ---- ./upgrade-tool upgrade -n /tmp/mule-enterprise-standalone-4.4.0-20211104 @@ -340,7 +335,7 @@ Write permissions in the old Mule distribution are required but not set for the Obtain write permission to files that the upgrade tool identifies. Contact your system administrator for assistance, if necessary. -=== Mule Runtime should be stopped +=== Mule Runtime Should Be Stopped ---- ./upgrade-tool upgrade -n /tmp/mule-enterprise-standalone-4.4.0-20211104 @@ -363,7 +358,7 @@ The upgrade tool detected that Mule is running. Stop Mule before starting the upgrade process. To check the current status, use the command `${MULE_HOME}/bin/mule status`. -=== Mule version is not supported for an upgrade +=== Mule Version Isn't Supported for an Upgrade ---- ./upgrade-tool upgrade -n /tmp/mule-enterprise-standalone-4.4.0-20211104 From 7dd284c6a9f0556abada09295778ec07677fc9d2 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Thu, 10 Jul 2025 18:50:06 -0300 Subject: [PATCH 115/119] W-18909925-mavenCLI-CH2-44-dm W-18909925-mavenCLI-CH2-44-dm --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 5d33c82fcd..8371588e41 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -87,6 +87,13 @@ From the command line in your project's folder, package the application and exec mvn clean deploy -DmuleDeploy ---- +To deploy the artifact without rebuilding it, run: + +[source,bash,linenums] +---- +mvn mule:deploy +---- + === Exchange Snapshot Assets You can also deploy Exchange snapshot assets into CloudHub 2.0. From 6265a914f79e3053d161c363ef3b54417b2f3bae Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Mon, 4 Aug 2025 18:27:27 -0300 Subject: [PATCH 116/119] =?UTF-8?q?W-19156508-MMPpathRewrite-relocation-44?= =?UTF-8?q?-dm=E2=80=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc index 8371588e41..7d8589b680 100644 --- a/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc +++ b/modules/ROOT/pages/_partials/mmp-deploy-to-cloudhub-2.adoc @@ -215,8 +215,6 @@ Configuration example: ---- | No -| `pathRewrite` | Supplies the base path expected by the HTTP listener in your application. This value must begin with `/`. This parameter is used only for applications that are deployed to xref:cloudhub-2::ch2-private-space-about.adoc[private space]. | No - |=== // end::DeploymentReference[] @@ -273,8 +271,8 @@ Configuration example: [cols=".^1,.^1,.^3"] !=== .3+! `inbound` -// ! `pathRewrite` ! TBC. ! `publicURL` ! URL of the deployed application. You can add multiple comma-separated values. + ! `pathRewrite` ! Supplies the base path expected by the HTTP listener in your application. This value must begin with `/`. This parameter is used only for applications that are deployed to xref:cloudhub-2::ch2-private-space-about.adoc[private space]. ! `lastMileSecurity` ! Enable Last-Mile security to forward HTTPS connections to be decrypted by this application. This requires an SSL certificate to be included in the Mule application, and also requires more CPU resources. The default value is `false`. ! `forwardSslSession` ! Enables SSL forwarding during a session. The default value is `false`. !=== @@ -285,6 +283,7 @@ Configuration example: https://myapp.anypoint.com + /api true true From f6a9291b00c68c9aef1a48e8619632a16b198d00 Mon Sep 17 00:00:00 2001 From: Daniela Merlo <97902112+dmerlob@users.noreply.github.com> Date: Mon, 18 Aug 2025 16:51:11 -0300 Subject: [PATCH 117/119] W-19336023-J-typo-44-dm --- modules/ROOT/pages/fips-140-2-compliance-support.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/fips-140-2-compliance-support.adoc b/modules/ROOT/pages/fips-140-2-compliance-support.adoc index 4d009cffbe..cfb6398b46 100644 --- a/modules/ROOT/pages/fips-140-2-compliance-support.adoc +++ b/modules/ROOT/pages/fips-140-2-compliance-support.adoc @@ -114,7 +114,7 @@ keytool -importkeystore \ ---- [IMPORTANT] -If you're using Java 17 or later, add the `-J--add-exports=java.base/sun.security.provider=ALL-UNNAMED` parameter to the keytool command before the `-importkeystore` parameter. +If you're using Java 17 or later, add the `-J--add-exports=java.base/sun.security.provider=ALL-UNNAMED` parameter to the keytool command before the `-importkeystore` parameter. [start=4] . To use the new keystore or truststore, update the xref:tls-configuration.adoc[TLS configuration] in the Mule configuration file: From 8ca52da1e8e2ee62297339e5dd5356b7d311de56 Mon Sep 17 00:00:00 2001 From: luanamulesoft Date: Thu, 21 Aug 2025 13:38:25 -0300 Subject: [PATCH 118/119] W-19365943-customized-Java-truststores: Add warnings about custom Java truststores --- modules/ROOT/pages/tls-configuration.adoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/tls-configuration.adoc b/modules/ROOT/pages/tls-configuration.adoc index 63282b8fe3..957cb8816f 100644 --- a/modules/ROOT/pages/tls-configuration.adoc +++ b/modules/ROOT/pages/tls-configuration.adoc @@ -49,7 +49,12 @@ A well-known Certificate Authority (CA) can generate certificates, or you can ge == Keystores and Truststores -The `tls:trust-store` and `tls:key-store` elements in a Mule configuration can reference a specific certificate and key, but if you don't provide values for `tls:trust-store`, Mule uses the default Java truststore. Java updates the default trust store when you update Java, so getting regular updates is recommended to keep well-known CA certificates up-to-date. +In a Mule configuration, the `tls:trust-store` and `tls:key-store` elements allow you to reference specific certificates and keys. If you don't specify a `tls:trust-store`, Mule uses the default Java truststore, which is maintained by Java and updated automatically when Java is updated. This helps make sure that certificates from Certificate Authorities (CAs) remain current. + +Using a custom Java Trust Store isn't the standard approach in MuleSoft and can lead to connectivity issues with the MuleSoft control plane when MuleSoft certificates are renewed. + +[IMPORTANT] +Use the default Java truststore to avoid connectivity issues. If you use a custom truststore, you're responsible for managing and updating it. Truststore and keystore contents differ depending on whether they are used for clients or servers: From 24dfcf7bf39f4db71892ea6634037f63b84b4ba0 Mon Sep 17 00:00:00 2001 From: Daniela Merlo Date: Thu, 4 Sep 2025 14:43:47 -0300 Subject: [PATCH 119/119] W-17790331-ACB-deployingTABLE-44-dm --- modules/ROOT/pages/deploying.adoc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/deploying.adoc b/modules/ROOT/pages/deploying.adoc index 739322352e..0cea02ddfd 100644 --- a/modules/ROOT/pages/deploying.adoc +++ b/modules/ROOT/pages/deploying.adoc @@ -18,17 +18,19 @@ In addition, different tools are available to deploy applications to each of the |=== |Deployment Target | Available Deployment Tools | Mule Runtime Engine Installation |CloudHub | -* Anypoint Studio -* Anypoint Runtime Manager +* Anypoint Code Builder * Anypoint Platform CLI +* Anypoint Runtime Manager +* Anypoint Studio * Mule Maven plugin | * No installation of Mule runtime engine is required, because CloudHub workers start Mule instances as part of the deployment process. |CloudHub 2.0 | -* Anypoint Studio -* Anypoint Runtime Manager +* Anypoint Code Builder * Anypoint Platform CLI +* Anypoint Runtime Manager +* Anypoint Studio * Mule Maven plugin | * No installation of Mule runtime engine is required, because CloudHub 2.0 replicas start Mule instances as part of the deployment process. @@ -42,10 +44,10 @@ In addition, different tools are available to deploy applications to each of the * Installation of Anypoint Runtime Fabric in your desired infrastructure is required |On-premises | -* Anypoint Studio +* Anypoint Platform CLI * Anypoint Runtime Manager +* Anypoint Studio * Runtime Manager in Anypoint Platform Private Cloud Edition -* Anypoint Platform CLI * Mule Maven plugin | * Installation of Mule runtime engine in your desired infrastructure is required.