RabbitMQ的自定义目的地

时间:2015-04-22 14:01:21

标签: spring rest rabbitmq spring-websocket spring-rabbit

我试图在我的项目中使用RabbitMQ作为代理,我想在客户端打开套接字时分配目标队列。 这样的事情:http://i.imgur.com/ldB2M0m.png

我设法使用SimpleBroker,但是当我尝试使用StompBrokerRelay时,我无法在RabbitMQ上配置队列,并且我不再在客户端上接收消息({{ 3}})。

我正是这样做的:

控制器:

@RestController
public class FeedController {

@Autowired
private SimpMessageSendingOperations template;

    @RequestMapping(value = "/feed",  method = RequestMethod.POST, consumes = "application/json")
    public Reference getLeankrReference(@RequestBody Reference ref)
    {       
        this.template.convertAndSendToUser(ref.getChannelId(), "/topic/feed", ref);
        return ref;
    }
}

Websocket配置:

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

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config)
    {
        config.enableStompBrokerRelay("/topic/")
            .setAutoStartup(true);

        //config.enableSimpleBroker("/user/");
        config.setApplicationDestinationPrefixes("/app");
    }

    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/vision").withSockJS();
    }
}

客户端:

        function connect() {
        var socket = new SockJS('/ws/vision');
        var channel = document.getElementById('name').value;
        stompClient = Stomp.over(socket);

        stompClient.connect({}, function(frame) {
            setConnected(true);
            console.log('Connected: ' + frame);
            stompClient.subscribe('/user/' + channel + '/feed', function(message) {
                showContent(JSON.parse(message.body));
            });
        });
    }

我知道我错过了什么。也许有些经纪人配置?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

最后,我想出了我错过的东西!

Websocket配置:

我只是分配主题队列。在这种情况下,我需要队列队列,一旦我想将其分配给特定的用户/频道。

config.enableStompBrokerRelay("/queue/", "/topic/");

<强>客户端:

我没有提到我想要使用的队列类型。

stompClient.subscribe('/user/queue/feed', function(content) {

但这还不够。它缺少正确的安全配置。

像这样,

安全配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .headers().addHeaderWriter(
            new XFrameOptionsHeaderWriter(
                    XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN)).and()
        .formLogin()
            .defaultSuccessUrl("/index.html")
            .loginPage("/login.html")
            .failureUrl("/login.html?error")
            .permitAll()
            .and()
        .logout()
            .logoutSuccessUrl("/login.html?logout")
            .logoutUrl("/logout.html")
            .permitAll()
            .and()
        .authorizeRequests()
            .antMatchers("/**").permitAll()
            .anyRequest().authenticated()
            .and();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
            .withUser("channel1").password("password").roles("USER");
}

随后我添加了一个登录页面。这没有必要。您只需确保使用password参数进行身份验证。

现在Rabbit知道用户/频道,它可以将队列发送到特定目的地。