rabbitmq 消息傳送與監聽

rabbit配置文件:

<!--這裏是連接rabbitmq的服務器-->

<rabbit:connection-factoryid="connectionFactory"host="localhost"username="guest"password="guest"/>

<!--這是用來發送消息的時候用到,在rabbitmq裏面實際上只能用Message,內部將調用

send(exchange, routingKey, convertMessageIfNecessary(object),correlationData);

來將用戶的對象轉成message,這個在轉換裏面就用到了-->

 <beanid="jsonMessageConverter"class="org.springframework.amqp.support.converter.JsonMessageConverter"/>

<!-- 用來發送消息,這裏制定了交換區的名字、路由關鍵字的名字以及消息的“轉換器”-->

<rabbit:templateid="amqpTemplate"connection-factory="connectionFactory"

    exchange="myExchange"routing-key="foo.bar"message-converter="jsonMessageConverter"/>

<!--工廠-->

<rabbit:adminconnection-factory="connectionFactory"/>

<!--傳送對象-->

<beanid="movie"class="study.spring.myproject.domain.Movie">

<propertyname="id"value="123"/>

<propertyname="name"value="tank"/>

 </bean> 


<!--聲明隊列-->

<rabbit:queue name="myQueue"/>

<rabbit:topic-exchange name="myExchange">

<!--聲明交換區,通過制定的路由與特定的隊列綁定-->

    <rabbit:bindings>

        <rabbit:bindingqueue="myQueue"pattern="foo.*"/>

    </rabbit:bindings>

</rabbit:topic-exchange>

<!--聲明接收器,即用來監聽隊列裏面是不是有消息送到,並指明監聽的對象以及與之關聯的隊列-->

 <rabbit:listener-containerid="con"connection-factory="connectionFactory">

    <rabbit:listenerref="listener" queue-names="myQueue"/>

</rabbit:listener-container>


<beanid="listener"class="study.spring.myproject.listener.MyListener"/>   

在這個配置文件裏面,我犯過3個錯誤:

錯誤1:沒有使用監聽容器,即沒有消費者。在代碼的send會“廣播” 消息,我以爲只要再監聽器上繼承了接口MessageListener,就會接收到信息,因此造成只有隊列中有數據,而沒有在監聽器中得到送過來的數據【rabbit:listener-container裏默認的方法是:onMessage,可以通過 method指定監聽的方法】,也就是說我需要將監聽器和隊列綁定起來。

錯誤2:沒有使用

 message-converter="jsonMessageConverter"這個就來發送對象,導致監聽器解析的時候出現錯誤

錯誤3:加上

 message-converter="jsonMessageConverter"後,由於剛開始傳送了字符串,導致隊列中字符串和對象同時存在,出現瞭解析錯誤,應該先清空隊列。

POM:

<dependencies>

    <dependency>

        <groupId>org.springframework.amqp</groupId>

        <artifactId>spring-rabbit</artifactId>

        <version>1.4.3.RELEASE</version>

    </dependency>

    <dependency>

<groupId>org.springframework.amqp</groupId>

<artifactId>spring-amqp</artifactId>

<version>1.4.3.RELEASE</version>

</dependency>

    <dependency>

<groupId>org.codehaus.jackson</groupId>

<artifactId>jackson-mapper-asl</artifactId>

<version>1.9.13</version>

</dependency>

    <dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.2</version>

</dependency>

發送消息:

 AbstractApplicationContext ctx =

        new ClassPathXmlApplicationContext("rabbimq配置文件.xml");

    RabbitTemplate template = ctx.getBean(RabbitTemplate.class);

    Movie movie=(Movie) ctx.getBean("movie");

    System.out.println("i get movie:"+movie.getId()+" name:"+movie.getName());

    template.convertAndSend(movie);

    Thread.sleep(1000);

    ctx.destroy();

監聽器(接收消息):

public class MyListenerimplements MessageListener{

//    @Override  這裏可以不用 Override原因不明。。。。尋找中

public void onMessage(Messagearg0) {

// TODO Auto-generated method stub

String message =new String(arg0.getBody());

//錯誤4:我當時用了 alt+/ 不小心弄成了 JSON.parseArray(..),然後做junit測試的時候顯示成功,但是卻沒打印出監聽結果,原因不明。。。。是eclipse本身的問題嗎?

Movie movie = JSON.parseObject(message,Movie.class);

System.out.println(movie.toString()+":listenerMovie");

}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章