ActiveMQ教程(2)— 在ActiveMQ中传递Stomp消息简单代码示例

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

使用ActiveMQ的API发送Stomp协议消息:
package mq.test.stomp;

import java.net.Socket;

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.128", 61613);
            con.open(so);
            // 注意,协议版本可以是1.2,也可以是1.1
            con.setVersion("1.2");
            // 用户名和密码,这个不必多说了
            con.connect("admin", "admin");

            // 以下发送一条信息(您也可以使用“事务”方式)
            con.send("/test", "生产者发送的消息");
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}
使用ActiveMQ的API接收Stomp协议消息:
package mq.test.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.128", 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协议的消息消费端的代码。请注意在代码片段中,并没有出现任何一个带有jms名称的包或者类——这是因为ActiveMQ为Stomp协议提供的JAVA API在内部进行了JMS规范的封装。

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

以下是Stomp协议的消费者端的运行效果(在生产者端已经向ActiveMQ插入了一条消息之后):

frame.getAction() = MESSAGE
frame.getBody() = 生产者发送的消息
frame.getCommandId() = 0
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值