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