rabbitmq 消息传送与监听

本文介绍了在使用RabbitMQ进行消息发送与监听时遇到的三个错误及解决办法。错误包括:未使用监听容器导致消息无法接收、未设置`message-converter`导致对象解析错误、混合发送字符串和对象导致解析异常。此外,还提到了依赖管理中的相关库版本和一个潜在的Eclipse快捷键问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值