1

amqp对不起,我是世界上的新人。我尝试编写简单的应用程序:

public class HelloApp {

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

    final TestSender bean = context.getBean(TestSender.class);
    bean.sendMessage();

    }
}



@Component
public class TestSender {

    @Autowired
    private RabbitTemplate template;

    public void sendMessage() {

        final Message message = new Message("Sth".getBytes(), new MessageProperties());

        template.send(message);
        System.out.println("Was sent");
    }

}


@Component
public class MessageReceiver implements ChannelAwareMessageListener{

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        System.out.println("RECEIVE "+message.getBody().toString());

    }

.xml文件:

春天-amqp.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit        http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

    <rabbit:connection-factory id="connectionFactory" host="localhost"/>
    <rabbit:admin connection-factory="connectionFactory"/>

    <rabbit:template connection-factory="connectionFactory" id="rabbitTemplate" channel-transacted="true"/>
    <rabbit:queue name="userMesssageQueue" />

    <rabbit:listener-container connection-factory="connectionFactory">
        <rabbit:listener ref="lis" queue-names="userMesssageQueue"/>
    </rabbit:listener-container>

    <bean id="transactionManager" class="org.springframework.amqp.rabbit.transaction.RabbitTransactionManager">
        <property name="connectionFactory" ref="connectionFactory"/>
    </bean>
    <bean id="lis" class="foo.bar.MessageReceiver"/>

弹簧配置.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config />
    <context:component-scan base-package="foo.bar"/>


    <import resource="spring-amqp.xml"/>
</beans>

当我运行这个应用程序时,我看到:

Was sent

但我想看看:

Was sent
RECEIVE ...

怎么了??

4

1 回答 1

4

您在这里的问题实际上是关于 AMQP 的低知识。您应该了解什么是Exchange和。routingKeyBinding

你需要配置:

<rabbit:direct-exchange name="myExchange">
    <rabbit:bindings>
         <rabbit:binding queue="userMesssageQueue" key="userMesssage" />
    </rabbit:bindings>
</rabbit:direct-exchange>

从另一边,您应该exchange使用混凝土向混凝土发送消息routingKey。在你的情况下:

template.send("myExchange", "userMesssage", message);

只有在这种情况下,您的消息才会被放置到userMesssageQueue.

默认情况下RabbitTemplate,使用空字符串exchange(默认)和空字符串routingKey。由于您userMesssageQueue没有使用该路由键绑定到该交换,因此您的侦听器不会收到它。

发送工作没有错误,因为消息被放置到交易所并且对于生产者(发送者)来说已经足够了。

最后,您的消息只是被丢弃在 RabbitMQ 代理上,因为没有绑定到""路由键的队列。

请阅读 RabbitMQ 站点和 Spring AMQP 上的更多文档。

于 2014-04-19T18:31:17.797 回答