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");
}
}