簡體   English   中英

Camunda BPMN-訪問線程內的變量

[英]Camunda BPMN - accessing variables inside a thread

在Camunda流程中,我試圖訪問在RabbitMQ onMessage線程內創建的變量...簡而言之,我讓RabbitMQ使用者監聽隊列,一旦消息發布到隊列,onMessage就被執行並在此onMessage中,我開始BPMN流程。

@Component("MyProcessor")
public class MyProcessor implements ChannelAwareMessageListener {

    public final void onMessage(Message message, Channel channel){
        // create some variables based on the message
        ....
        // do some database lookups based on the message
        ....
        // enrich message based on some other factors
        ....
        SomeService service = new SomeService(message);
        if (service.isThisOrThatEnabled()){
            System.out.println("Yes, it's enabled");
        }
        ....
        runtimeService.startProcessInstanceByKey("ABC");
        ....

    }

}

因此,根據傳入的消息,我設置了某些變量,且其作用域不在onMessage之外。

當我在Camunda中調用服務任務或在服務任務中使用表達式時:

${MyProcessor.isThisOrThatEnabled() == true}

顯然,這將調用帶@Component注釋的單例,並且無法訪問onMessage中的實際消息。 如果MyProcessor.isThisOrThatEnabled包裝了service.isThisOrThatEnabled,我可能會得到一個空指針異常,因為創建Singleton時未初始化服務,僅在onMessage線程內。

所以總結一下我的問題,我如何訪問線程內部的BPMN中的變量...

1:如果單例是訪問線程中變量的錯誤方式,那么我還應該如何訪問它們? 是否可以將SomeService實例注入BPMN流?

2:如果服務任務是訪問這些變量所用的錯誤組件,那么我應該改用哪個組件?

您可以設置一個過程變量,例如

Map<String, Object> variables = new HashMap<String, Object>();
variables.put("service", service);
runtimeService.startProcessInstanceByKey("ABC", variables);

在表達式中,您可以編寫

${service.isThisOrThatEnabled()}

上面假設SomeService實現了接口java.io.Serializable 如果不是這種情況,則可以創建一個POJO類,該類實現Serializable並填充過程所需的相關Service / Message屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM