ActiveMQ系列—使用示例(在ActiveMQ中传递Stomp消息)

来源:互联网 发布:干淘宝网店都需要什么 编辑:程序博客网 时间:2024/05/26 09:55

下面我们使用ActiveMQ提供的JAVA 客户端(实际上就是ActiveMQ对JMS规范的实现),向ActiveMQ中的Queue(示例代码中将这个Queue命名为’test’)发送一条Stomp协议消息,然后再使用JAVA语言的客户端,从ActiveMQ上接受这条消息:

1、使用ActiveMQ的API发送Stomp协议消息

import java.net.Socket;import java.util.Date;import org.apache.activemq.transport.stomp.StompConnection;// 消息生产者public class TestProducer {    public static void main(String[] args) {        try {            // 建立Stomp协议的连接            StompConnection con = new StompConnection();            Socket so = new Socket("192.168.1.168", 61613);            con.open(so);            // 注意,协议版本可以是1.2,也可以是1.1            con.setVersion("1.2");            // 用户名和密码,这个不必多说了            con.connect("admin", "admin");            // 以下发送一条信息(您也可以使用“事务”方式)            con.send("/test", "234543" + new Date().getTime());        } catch (Exception e) {            e.printStackTrace(System.out);        }    }}

这里写图片描述

2、使用ActiveMQ的API接收Stomp协议消息

import java.net.Socket;import java.net.SocketTimeoutException;import java.util.Map;import org.apache.activemq.transport.stomp.StompConnection;import org.apache.activemq.transport.stomp.StompFrame;public class TestConsumer {    public static void main(String[] args) throws Exception {        // 建立连接        StompConnection con = new StompConnection();        Socket so = new Socket("192.168.1.168", 61613);        con.open(so);        con.setVersion("1.2");        con.connect("admin", "admin");        String ack = "client";        con.subscribe("/test", "client");        // 接受消息(使用循环进行)        for (;;) {            StompFrame frame = null;            try {                // 注意,如果没有接收到消息,                // 这个消费者线程会停在这里,直到本次等待超时                frame = con.receive();            } catch (SocketTimeoutException e) {                continue;            }            // 打印本次接收到的消息            System.out.println("frame.getAction() = " + frame.getAction());            Map<String, String> headers = frame.getHeaders();            String meesage_id = headers.get("message-id");            System.out.println("frame.getBody() = " + frame.getBody());            System.out.println("frame.getCommandId() = " + frame.getCommandId());            // 在ack是client标记的情况下,确认消息            if ("client".equals(ack)) {                con.ack(meesage_id);            }        }    }}

这里写图片描述

这里写图片描述

这里写图片描述

以上分别是使用Activie提供的Stomp协议的消息生产端和Stomp协议的消息消费端的代码(如果您不清楚Stomp协议的细节,可以参考我另一篇文章:《ActiveMQ系列—消息协议(Stomp协议)》)。请注意在代码片段中,并没有出现任何一个带有jms名称的包或者类——这是因为ActiveMQ为Stomp协议提供的JAVA API在内部进行了JMS规范的封装。

您可以查看activemq-stomp中关于协议转换部分的源代码:org.apache.activemq.transport.stomp.JmsFrameTranslator和其父级接口:org.apache.activemq.transport.stomp.FrameTranslator来验证这件事情

阅读全文
0 0
原创粉丝点击