生产者模块:提供Spring配置文件(定义ActiveMQ 连接工厂,Spring Caching连接工厂,消息生产者)
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg index="0" value="admin">constructor-arg>
<constructor-arg index="1" value="admin">constructor-arg>
<constructor-arg index="2" value="tcp://localhost:61616">constructor-arg>
bean>
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="amqConnectionFactory">property>
<property name="sessionCacheSize" value="100" />
bean>
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
<property name="pubSubDomain" value="false" />
bean>
消费者模块:提供Spring配置文件(定义ActiveMQ 连接工厂,Spring Caching连接工厂,注册监听器)
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg index="0" value="admin">constructor-arg>
<constructor-arg index="1" value="admin">constructor-arg>
<constructor-arg index="2" value="tcp://localhost:61616">constructor-arg>
<property name="trustAllPackages" value="true"/>
bean>
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="amqConnectionFactory">property>
<property name="sessionCacheSize" value="100" />
bean>
<jms:listener-container destination-type="queue" container-type="default"
connection-factory="connectionFactory" acknowledge="auto">
<jms:listener destination="wq_Message" ref="customeListener"/>
jms:listener-container>
2、生产者代码实现(分别是TextMessage、MapMessage、ObjectMessage、BytesMessage、和StreamMessagg五种消息类型):
/**
*
* @ClassName: ActiveMqTest
* @Description: TODO
* @author 吴琼
* @date 2017年10月15日 下午2:56:15
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-mq.xml")
public class ActiveMqTest {
//点对点模式
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;
final Student student = new Student("objectMessage类型消息","消息发送成功");
// MapMessage类型
@Test
public void sendMapMessage(){
jmsTemplate.send("wq_Message", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
MapMessage map = session.createMapMessage();
map.setString("name", "p2p消息模式发送MapMessage");
map.setString("msg", "发送MapMessage");
return map;
}
});
}
// TextMessage类型
@Test
public void sendTextMessage(){
jmsTemplate.send("wq_Message", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage("p2p消息模式发送TextMessage");
return textMessage;
}
});
}
// ObjectMessage类型
@Test
public void sendObjectMessage(){
jmsTemplate.send("wq_Message", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
ObjectMessage objectMessage = session.createObjectMessage((Serializable)student);
return objectMessage;
}
});
}
// BytesMessage类型
@Test
public void sendBytesMessage(){
jmsTemplate.send("wq_Message", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
BytesMessage bytesMessage = session.createBytesMessage();
bytesMessage.writeBytes("BytesMessage类型消息".getBytes());
return bytesMessage;
}
});
}
// streamMessage类型
@Test
public void sendStreamMessage(){
jmsTemplate.send("wq_Message", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
StreamMessage streamMessage = session.createStreamMessage();
streamMessage.writeString("StreamMessage类型消息");
streamMessage.writeInt(10);
return streamMessage;
}
});
}
}
3、Junit测试五种消息类型发送成功,状态:未消费。
消息详情:
4、消费者代码实现(配置监听器,监听消息):
/**
* @ClassName: CustomeListener
* @Description: TODO
* @author 吴琼
* @date 2017年10月15日 下午2:02:23
*
*/
@Component
public class CustomeListener implements MessageListener {
/**
*
* @Title: onMessage
* @Description: 重写moMessage方法,监听消息信息
* @param @param message
* @return void
* @throws
*/
public void onMessage(Message message) {
try {
// 接收Text消息
if (message instanceof TextMessage) {
TextMessage tm = (TextMessage) message;
System.out.println("获取textMessage:" + tm.getText());
}
// 接收Map消息
if (message instanceof MapMessage) {
MapMessage mm = (MapMessage) message;
System.out.println("获取 MapMessage: name:" + mm.getString("name")
+ " msg:" + mm.getString("msg"));
}
// 接收Object消息
if (message instanceof ObjectMessage) {
ObjectMessage objectMessage = (ObjectMessage) message;
Student student = (Student) objectMessage.getObject();
System.out.println("获取 ObjectMessage: "+ToStringBuilder.reflectionToString(student));
}
// 接收bytes消息
if (message instanceof BytesMessage) {
byte[] b = new byte[1024];
int len = -1;
BytesMessage bm = (BytesMessage) message;
while ((len = bm.readBytes(b)) != -1) {
System.out.println(new String(b, 0, len));
}
}
// 接收Stream消息
if (message instanceof StreamMessage) {
StreamMessage streamMessage = (StreamMessage) message;
System.out.println(streamMessage.readString());
System.out.println(streamMessage.readInt());
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
代码实现过程出现的问题:
生产者发送的ObjectMessage类型时,对象应该实现Serializable接口;
消费者应该在ActiveMQConnectionFactory配置