2017-05-04 93 views
0

我已經在UML中實現了Spring statemachine,並試圖實現連接池。 我的配置類是Spring狀態機池錯誤

@Configuration 
public class CambodiaStateMachine { 


@Autowired 
    private ApplicationContext appContext; 

@Bean 
public StateMachineListener<String, String> listener() { 
    return new StateMachineListenerAdapter<String, String>() { 
     @Override 
     public void stateChanged(State<String, String> from, State<String, String> to) { 
      System.out.println("State change to " + to.getId()); 
     } 
    }; 
} 

@Bean(name = "stateMachineTarget") 
@Scope(scopeName="prototype") 
public StateMachine<String, String> stateMachineTarget() throws Exception { 

    Builder<String, String> builder = StateMachineBuilder.<String, String>builder(); 

    builder.configureConfiguration() 
    .withConfiguration() 
    .machineId("cambodia") 
    .autoStartup(true); 


    builder.configureModel().withModel().factory(modelFactory()); 
    builder.configureConfiguration().withConfiguration().beanFactory(appContext.getAutowireCapableBeanFactory()); 
    return builder.build(); 
} 

@Bean 
public StateMachineModelFactory<String, String> modelFactory() { 
    return new UmlStateMachineModelFactory("classpath:stm/model.uml"); 
} 


@Bean 
public CommonsPool2TargetSource poolTargetSource() { 
    CommonsPool2TargetSource pool = new CommonsPool2TargetSource(); 
    pool.setMaxSize(10); 
    pool.setTargetBeanName("stateMachineTarget"); 
    return pool; 
} 

@Bean 
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
    public ProxyFactoryBean stateMachine() { 
     ProxyFactoryBean pfb = new ProxyFactoryBean(); 
     pfb.setTargetSource(poolTargetSource()); 
     return pfb; 
    } 

}

,我得到一個錯誤

產生的原因:java.lang.IllegalStateException:無法爲bean創建範圍代理 「scopedTarget.stateMachine ':在創建代理時確定的目標類型不能爲

。 現在我決定去體驗一下,並刪除

proxyMode = ScopedProxyMode.TARGET_CLASS

錯誤是沒有更多的,但沒有觀察到預期的行爲。沒有游泳池,只有一臺機器在運行。

我看過這個bug here但是看不到解決方案。

+0

順便說一句你可以標記你的問題的答案,如果你認爲這些答案;) –

+0

對不起,我剛剛檢查。有效!! Thankyou –

回答

1

該問題鏈接到https://jira.spring.io/browse/SPR-15042。檢查Spring框架版本是否有迴歸,因爲它適用於4.3.3和4.3.6,但不適用於4.3.4和4.3.5。

+0

我沒有更多的錯誤,但有時候同樣的狀態機實例對同時發生的請求有效。爲什麼是這樣? –

+0

可能是因爲請求不是同時發生的。如果您啓動多個線程並進行冒煙測試,您會看到錯誤。 –

+0

不,我不使用線程,但我使用消息隊列。因此,只要我給狀態機提供服務,下一個請求就會在機器返回池之前出現。所以它在那裏發生衝突。有什麼我可以做的嗎?想知道目前是否有活躍的SM? –