我正在尝试通过cloudhub应用程序将JIRA与Salesforce集成。我创建了一个 Mule 软件项目(每次在 JIRA 中更新或创建工作日志时都会调用该项目)并将其部署在 cloudhub 中。在 Jira 中,我使用 Web hook 实例来调用云中心中的 mule 项目。我面临的问题是,当从 JIRA 到 cloudhub 应用程序同时调用时,项目流程中的 java 类通过 JIRA 的并行调用同时执行,并且变量被覆盖并产生冲突。如何在 mule 项目中一次处理一个 HTTP 请求?
要在 HTTP 侦听器上设置线程,请使用:
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration">
<http:worker-threading-profile maxThreadsActive="1" />
</http:listener-config>
您的问题对我来说意味着您正在使用自定义 java 类来转换 JIRA 数据,以便将其发送到 Salesforce,并且它具有静态变量或其他非线程安全的共享状态。
要解决并发问题,请尝试实现您的流程,使其不需要单线程:
首先,如果可以的话,使用内置的 Mule 消息处理器和 Mule 表达式语言来实现转换逻辑。 如果您使用的是 3.7+,我鼓励您尝试使用 DataWeave。 这些是隐式线程安全的。
如果您确实实现了自定义java,请尝试消除共享状态的使用。 这可以是静态变量的形式,或者如果您使用具有 Singleton 作用域(默认)的 spring bean,则也可能发生在实例变量中。
如果您需要在自定义 java 消息处理器中共享状态,请使用 Mule Object Store 来存储状态,而不是 java 实例变量或静态变量。 还有一个连接器,允许您直接从流程中的对象存储中添加和检索数据。
收到HTTP请求后,将其放入支持顺序处理的Pub\sub服务中。实现事件驱动流以顺序使用来自 Pub/Sub 服务的数据,并将变量赋值放在 try 块中以避免并行覆盖。