发送消息至 RabbitMQ 队列,如果没有监听或者消费过,消息仍然在消息队列中,直到下次消息被消费了。
例子为单个队列的rabbitmq的demo.https://download.csdn.net/download/my_blankness/10575061
demo目录:
配置文件:application.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-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<import resource="classpath*:rabbitMQ.xml" />
<!-- 扫描指定package下所有带有如@controller,@services,@resource,@ods并把所注释的注册为Spring Beans -->
<context:component-scan base-package="com.rabbitmq.demo" />
<!-- 激活annotation功能 -->
<context:annotation-config />
<!-- 激活annotation功能 -->
<context:spring-configured />
</beans>
配置文件:rabbitMQ.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-3.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd">
<!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory" virtual-host="自己配置的host"
username="自己配置的username" password="自己配置的password" host="自己配置的host" port="自己配置的port"
/>
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin id="connectAdmin" connection-factory="connectionFactory" />
<!--定义queue ,队列声明 -->
<rabbit:queue name="queueTest" durable="true" auto-delete="false"
exclusive="false" declared-by="connectAdmin" />
<!-- 定义direct exchange,绑定queueTest,声明了队列key值 -->
<rabbit:direct-exchange name="exchangeTest"
durable="true" auto-delete="false" declared-by="connectAdmin">
<rabbit:bindings>
<rabbit:binding queue="queueTest" key="queueTestKey"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
<!-- 消息接收者 -->
<bean id="msgListener" class="com.rabbitmq.demo.MsgListener"></bean>
<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container
connection-factory="connectionFactory" acknowledge="auto">
<rabbit:listener queues="queueTest" ref="msgListener" />
</rabbit:listener-container>
<!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
exchange="exchangeTest" />
</beans>
测试类:TestDemo.java
package com.rabbitmq.demo.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rabbitmq.demo.MsgProducer;
public class TestDemo {
private ApplicationContext context = null;
//引入配置文件
@Before
public void setUp() throws Exception {
context = new ClassPathXmlApplicationContext("application.xml");
}
@Test
public void sendMsgTest() throws Exception {
MsgProducer msgProducer = (MsgProducer) context.getBean("msgProducer");
msgProducer.sendMessage("message的内容,呵呵呵呵呵呵");
}
}
生产者:MsgProducer.java
package com.rabbitmq.demo;
import java.io.IOException;
import javax.annotation.Resource;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Service;
@Service
public class MsgProducer {
@Resource(name="amqpTemplate")
private AmqpTemplate amqpTemplate;
public void sendMessage(Object message) throws IOException {
System.out.println("MsgProducer消息生产者:"+message);
amqpTemplate.convertAndSend("queueTestKey", message);
}
}
监听者:MsgListener.java
package com.rabbitmq.demo;
import java.nio.charset.Charset;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("msgListener")
public class MsgListener implements MessageListener{
@Autowired
private MsgConsumer msgConsumer;
@Override
public void onMessage(Message message) {
//监听到信息,可以直接处理,也可以把message传递给消费者的类对数据进行处理
String tosendMessage = new String(message.getBody(), Charset.forName("UTF-8"));
System.out.println("msgListener的信息监听:"+tosendMessage);
msgConsumer.consumerMessage(tosendMessage);
}
}
消费者:MsgConsumer.java
package com.rabbitmq.demo;
import org.springframework.stereotype.Service;
@Service
public class MsgConsumer {
public void consumerMessage(String message) {
System.out.println("MsgConsumer消息消费者:"+message);
}
}
如果没有监听者或者消费者消费了信息,在图形界面中的ready和Total中就会显示个数,在点击Get Message中会显示出来消息的内容