之前的博客和大家分享了Rabbitmq的基本框架,及其工作原理,網址為 < http://www.cnblogs.com/jun-ma/p/4840869.html >。今天呢,想和大家一起分享一下如何把rabbitmq應用到我們的Spring工程項目中。
Rabbitmq Server Install & Config
使用Rabbitmq需要我們安裝rabbitmq服務器,服務器下載地址 < http://www.rabbitmq.com/download.html >。筆者使用的是Mac OS standalone 3.5.4版本,下載完成之后,解壓文件即可。
進入sbin目錄,后台啟動rabbitmq server
./rabbitmq-server –detached
使用ps -A| grep rabbit可以查看到當前運行的rabbitmq進程。
然后,使用rabbitmq-plugin命令使能web管理:
./rabbitmq-plugins enable rabbitmq_management
然后,我們就可以使用web界面管理我們的Rabbitmq Server,網址為:
http://localhost:15672/
用戶名和密碼默認為guest/guest,用戶登錄之后可以根據需要選擇新增用戶名和密碼,並設置管理權限。
Spring Rabbitmq使用實例
Message Producer
生產者的Rabbitmq.xml配置,這里我們使用rabbit標簽來配置rabbitmq客戶端。
<?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/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.0.xsd">
<!--配置connection-factory,指定連接rabbit server參數-->
<rabbit:connection-factory id="connectionFactory" username="guest" password="guest"
host="localhost"
port="5672"
virtual-host="/"/>
<!--通過指定下面的admin信息,當前producer中的exchange和queue會在rabbitmq服務器上自動生成-->
<rabbit:admin connection-factory="connectionFactory"/>
<!--定義queue-->
<rabbit:queue id="com.mj.test" name="com.mj.test" durable="true" auto-delete="false" exclusive="false"/>
<!-- 定義direct exchange,綁定com.mj.test queue -->
<rabbit:direct-exchange name="myChange" durable="true" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="com.mj.test" key="hello"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
<!--定義rabbit template用於數據的接收和發送-->
<rabbit:template id="myAmqpTemplate" connection-factory="connectionFactory" exchange="myChange"/>
</beans>
ApplicationContext.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"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- 使能AOP-->
<aop:aspectj-autoproxy/>
<!-- 自動裝載bean使能-->
<context:component-scan base-package="com.mj.amq"/>
<context:annotation-config/>
<!-- 聲明一個事物管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 啟用annotation的事務支持 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
<import resource="Rabbitmq.xml"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3307/student?useUnicode=true&characoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
</beans>
Producer發送數據Java代碼
@Service
public class MessageSender {
@Resource(name="myAmqpTemplate")
AmqpTemplate amqpTemplate;
public void sendMessage(Object message){
amqpTemplate.convertAndSend("hello",message);
}
}
Message Consumer
Rabbitmq.xml配置
Rabbitmq接收端需要配置Connection-Factory實例,監聽的隊列,以及Listener-container。同時,我們需要創建監聽隊列的java bean。這里我們使用的是spring rabbitmq提供的異步MessageListener接口,consumer的業務邏輯在onMessage中實現。
<?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/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.0.xsd">
<rabbit:connection-factory id="connectionFactory" username="guest" password="guest"
host="localhost"
port="5672"
virtual-host="/"/>
<rabbit:queue id="com.mj.test" name="com.mj.test" durable="true" auto-delete="false" exclusive="false"/>
<bean id="messageReceiver" class="com.mj.amq.MessageReceiver"></bean>
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener queues="com.mj.test" ref="messageReceiver"/>
</rabbit:listener-container>
</beans>
ApplicationContext.xml和producer的一致
Consumer偵聽mq消息代碼
public class MessageReceiver implements MessageListener {
public void onMessage(Message message) {
System.out.println(message);
}
public static void main(String[]args){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("ApplicationContext.xml");
}
}
測試
啟動MessageReceiver的main函數,運行producer的單元測試,會在MessageReceiver的concole端看到接收都到的數據。同時登陸rabbitmq客戶端可以看到我們配置的Exchange和queue信息。
public class MessageSenderTest {
private ApplicationContext context = null;
@Before
public void setUp() throws Exception {
context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
}
@Test
public void should_send_a_amq_message() throws Exception {
MessageSender messageSender = (MessageSender) context.getBean("messageSender");
messageSender.sendMessage("Hello, I am amq sender");
}
}
Conclusion
本文和大家分享了一個Spring rabbitmq代碼實例,文中給出了完整的xml配置和java代碼,希望能夠給大家帶來一些幫助。