我试图在我的项目中使用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));
});
});
}
我知道我错过了什么。也许有些经纪人配置?
提前谢谢!
答案 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知道用户/频道,它可以将队列发送到特定目的地。