2015-11-11 150 views
1

所以我有一個Runnable類,應該在符合某個條件時調用notifyUser(String username,String content)方法。我一直試圖讓這個工作,但它總是失敗與NullPointerExceptions。這很可能會導致Autowiring失敗(因爲Runnable類不是由Spring管理的)。在Spring管理的上下文中自動裝配SimpMessagingTemplate工作得很好,這些方法完成了他們應該做的事情。用Spring Websockets發送消息給特定的客戶端

我想要做的是調用SimpMessagingTemplate的方法(或類似的方法)convertAndSendToUser,但是我不能在這種情況下自動調用它。到目前爲止,我所嘗試過的一切都失敗了,這就是爲什麼我認爲我的一些基本概念錯了。

我的配置是這樣的:

@Configuration 
@EnableScheduling 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableSimpleBroker("/test"); 
     config.setApplicationDestinationPrefixes("/app"); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/test").withSockJS(); 
    } 
} 

更新:我已經通過使用下面的代碼設法擺脫NullPointerException異常..但消息(convertAndSendToUser()以及convertAndSend())唐客戶不會接受。開發者控制檯不顯示任何傳入消息。

AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(Application.class); 
ctx.getAutowireCapableBeanFactory().autowireBean(myService); 

回答

1

,因爲你這樣做這是真的:

new AnnotationConfigApplicationContext(Application.class); 

在您的類,這意味着開始一個新的全appicationContext。但是您的user已在另一個環境中註冊。

不清楚爲什麼你不能讓你的組件由Spring管理,但沒有其他方式可以使用SimpMessagingTemplate,如果你不能達到applicationContext

最好分享一下你的代碼,從我們這邊調查,然後決定我們該如何幫助。

也許你可以使用有WebApplicationContextUtils ...

+0

嗯,我genereally可能應該集中精力使螺紋春季管理,而不是與解決方法過於複雜的事情呢。你能指出我如何開始彈簧管理線程的正確方向嗎?據我所知,我需要通過上下文將線程作爲一個bean來啓動,並使用ThreadPoolTask​​Executor啓動它,但是在哪裏以及如何定義該Thread bean? – Lukehey

+1

你應該讓你的'Runnable'由Spring和'@ Autowire'來管理你想要的一切。這個也可以是「原型」。初始者也應該被管理,以便爲'Runnable'提供'ctx.getBean()'的能力。 –

相關問題