Spring Rabbit使用
Contents
Demo
<?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:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<bean id="rabbitConnectionFactory"
class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<constructor-arg value="10.0.0.11"/>
<property name="username" value="guest"/>
<property name="password" value="guest"/>
</bean>
<bean id="converter"
class="org.springframework.amqp.support.converter.JsonMessageConverter">
<property name="defaultCharset" value="UTF-8"/>
</bean>
<rabbit:template id="rabbitTemplate"
connection-factory="rabbitConnectionFactory" message-converter="converter" />
<rabbit:admin connection-factory="rabbitConnectionFactory"/>
<rabbit:queue name="ttt.ttt.tt.tt"/>
</beans>
Java文件
package yourcompany;
import com.yourcompany.pojo.ParamsPojo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Created by yang on 15-11-9.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-test.xml")
public class HelloTest {
@Autowired
private RabbitTemplate template;
@Test
public void run() {
ParamsPojo pp = new ParamsPojo();
pp.setCuid(222222222);
template.convertAndSend("ttt.ttt.tt.tt", pp);
}
@Test
public void run2() {
ParamsPojo pp = (ParamsPojo) template.receiveAndConvert("ttt.ttt.tt.tt");
System.out.println(pp.getCuid());
}
}
关于序列化的选择问题
<rabbit:template id="rabbitTemplate" connection-factory="rabbitConnectionFactory" message-converter="converter" />
这一行的配置,会创建一个org.springframework.amqp.rabbit.core.RabbitTemplate
对象,默认情况下的MessageConverter
,通过源码可知就是private volatile MessageConverter messageConverter = new SimpleMessageConverter();
关于MessageConveter的类型:
org.springframework.amqp.support.converter.SimpleMessageConverter
这个是使用JDK默认的序列化来序列化Message的.(默认就是它)
org.springframework.amqp.support.converter.JsonMessageConverter
这个是使用Jacson工具来进行Message对象的JSON化的.
org.springframework.amqp.support.converter.Jackson2JsonMessageConverter
这个是使用Jacson 2 工具来进行message对象的json化的.
org.springframework.amqp.support.converter.MarshallingMessageConverter
这个是XML与对象互转的converter
org.springframework.amqp.support.converter.SerializerMessageConverter
这个是使用Spring框架内的序列化接口来做的.
序列化: org.springframework.core.serializer.DefaultSerializer,使用的是ObjectOutputStream
来写入OutputStream
反序列化:org.springframework.core.serializer.DefaultDeserializer,使用的是ObjectInputStream
来读取InputStream
.
使用默认的这两个Serializer时,本质上与JDK自带的序列化行为是相同的。通过源码可看到:
public void serialize(Object object, OutputStream outputStream) throws IOException {
if (!(object instanceof Serializable)) {
throw new IllegalArgumentException(getClass().getSimpleName() + " requires a Serializable payload " +
"but received an object of type [" + object.getClass().getName() + "]");
}
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
objectOutputStream.flush();
}
它必须要实现Serializable
接口.
建议
使用JSON的方式来进行序列化Message,这样子通过RabbitMQ管理后台,也可以了解队列的内容。如果用JDK自带的方式来序列化,这样子可查找问题的时候,难以定位数据.