Java 将承诺转换为不同类型,即使结果尚不可用

Java 将承诺转换为不同类型,即使结果尚不可用,java,promise,amazon-swf,Java,Promise,Amazon Swf,我有以下活动: @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) @Activities(version="1.0") public interface MyActivities { B first(A a) throws Exception; void second(C c) thro

我有以下活动:

@ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10)
@Activities(version="1.0")
public interface MyActivities {

    B first(A a) throws Exception;

    void second(C c) throws Exception;

}
我有以下工作流程:

public class MyWorkflowImpl implements MyWorkflow {

    @Autowired
    private MyActivitiesClient operations;

    @Override
    public void start(SomeType input) {
        A a = new A(...);

        Promise<B> b = operations.first(a);

        Promise<C> c = ...;
        /* Here, I would like to create c based on b */

        operations.second(c);
    }
}
公共类MyWorkflowImpl实现MyWorkflow{ @自动连线 私人MyActivities客户端操作; @凌驾 公共无效开始(SomeType输入){ A=新的A(…); 承诺b=运营。首先(a); 承诺c=。。。; /*在这里,我想在b的基础上创建c*/ 第二(c)段; } } 现在,直到第一个操作完成,
b
才可用,但即使
b
不可用,工作流仍将继续


有什么想法吗?

使用@Asynchronous方法注释:

public void start(SomeType input) {
    A a = new A(...);

    Promise<B> b = operations.first(a);

    Promise<C> c = ...;

    operations.second(c);
}

@Asynchronous
private Promise<C> calculateC(Promise<B> b) {
    Settable<C> result = new Settable<C>();
           /* Here create c based on b */
    result.set(b.get()....);
    return result;
}
public void开始(SomeType输入){
A=新的A(…);
承诺b=运营。首先(a);
承诺c=。。。;
第二(c)段;
}
@异步的
私人承诺计算器(承诺b){
可设置结果=新可设置();
/*这里创建基于b的c*/
result.set(b.get()…);
返回结果;
}
注释为@Asynchronous的方法在内部转换为回调,该回调在其Promise类型的所有参数就绪时调用@异步实现依赖于AspecJ,因此请确保仔细遵循安装说明来启用它

另一个选项是使用任务:

@Override
public void start(SomeType input) {
    A a = new A(...);

    Promise<B> b = operations.first(a);

    Promise<C> c = new Settable<C>();
    new Task(b) {
        protected void doExecute() {
            /* Here c based on b */
            c.set(b.get() ....);
        }
    }
    operations.second(c);
}
@覆盖
公共无效开始(SomeType输入){
A=新的A(…);
承诺b=运营。首先(a);
承诺c=新的可设置项();
新任务(b){
受保护的void doExecute(){
/*这里c基于b*/
c、 set(b.get()…);
}
}
第二(c)段;
}
当传递给任务构造函数的Promise类型的所有参数都就绪时,将调用Task doExecute方法