ActiveMQ五种消息类型生产消费

一个简单的Spring整合activeMQ代码实现过程(p2p模式):

  1. 创建maven项目,创建生产者消费者模块,导入spring和activeMQ坐标。

生产者模块:提供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测试五种消息类型发送成功,状态:未消费。
ActiveMQ五种消息类型生产消费_第1张图片
消息详情:
ActiveMQ五种消息类型生产消费_第2张图片
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();
        }
    }
}

5、Junit测试五种消息被消费:
ActiveMQ五种消息类型生产消费_第3张图片

代码实现过程出现的问题:
生产者发送的ObjectMessage类型时,对象应该实现Serializable接口;
消费者应该在ActiveMQConnectionFactory配置

你可能感兴趣的:(activemq-spring)