使用RabbitMQ侦听器类

时间:2017-09-13 16:06:46

标签: java websocket stomp spring-rabbitmq spring-messaging

是否可以从RabbitMQ侦听器bean发送带有SimpMessageSendingOperations的消息?

我有以下监听器类:

 public class MyJobListener {
     @Autowired
     public SimpMessageSendingOperations messagingTemplate;

     public void handleJob(JobMessage jobMessage) {
         doWork(jobMessage);

         messagingTemplate.convertAndSend("/topic/greetings", "TEST");
     }
 }

我的兔子配置文件是:

<!-- RabbitMQ configuration -->
<rabbit:connection-factory id="connectionFactory" host="${rabbitmq.connection.host}" port="${rabbitmq.connection.port}"  />
<rabbit:admin connection-factory="connectionFactory" /> 
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />

<!-- Queues -->    
<rabbit:queue id="myQueue" name="myQueue" />

<!-- Listeners -->
<bean id="myListener01" class="com.xxx.MyJobListener" />
<bean id="myListener02" class="com.xxx.MyJobListener" />
<bean id="myListener03" class="com.xxx.MyJobListener" />
<bean id="myListener04" class="com.xxx.MyJobListener" />    

<rabbit:listener-container connection-factory="connectionFactory" >
    <rabbit:listener ref="myListener01" method="handleJob" queue-names="myQueue" />
    <rabbit:listener ref="myListener02" method="handleJob" queue-names="myQueue" />
    <rabbit:listener ref="myListener03" method="handleJob" queue-names="myQueue" />
    <rabbit:listener ref="myListener04" method="handleJob" queue-names="myQueue" />
</rabbit:listener-container>  

<!-- Bindings -->
<rabbit:direct-exchange name="directexchange" >
    <rabbit:bindings>        
        <rabbit:binding queue="myQueue"/>
    </rabbit:bindings>
</rabbit:direct-exchange> 

当预期发送消息时(messagingTemplate.convertAndSend(“/ topic / greetings”,“TEST”))没有任何反应,但如果我做同样的事情,但在@Controller中一切正常(消息通过websocket到浏览器)

我需要这样做才能在作业完成时向用户发送通知。

3 个答案:

答案 0 :(得分:0)

经过多次测试后,我改变了我的兔子配置文件,只留下一个监听器:

<!-- Listeners -->
<bean id="myListener01" class="com.xxx.MyJobListener" />

<rabbit:listener-container connection-factory="connectionFactory" error-handler="queueErrorHandler" >
    <rabbit:listener ref="myListener01" method="handleJob" queue-names="myQueue" />
</rabbit:listener-container>

现在几乎是随机的。这很奇怪,但每2个叫它有效。我的意思是,两次是,两次没有,两次是,两次不是......所以......这很奇怪。我认为兔子配置有一些东西......

答案 1 :(得分:0)

绝对是Spring Security配置。如果我禁用Spring Security一切正常。我会发现它是什么,然后我会在这里发布答案。

答案 2 :(得分:0)

我能够解决它。

问题不在于Spring Security,问题是我在两次声明websocket消息代理:

<websocket:message-broker application-destination-prefix="/app" >
    <websocket:stomp-endpoint path="/websocket" >
        <websocket:sockjs />
    </websocket:stomp-endpoint>

     <websocket:simple-broker prefix="/topic,/user" />      
</websocket:message-broker> 

这些行位于我的websocket.xml中,并且由于“丑陋”而导致此文件被多次导入。在我的.xml弹簧文件中导入句子分布。

订购这些导入并确保只在一切正常后才创建bean。

愿这有帮助!