2015-11-11 151 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()'的能力。 –

相关问题