ActiveMQ系列—使用示例(在ActiveMQ中传递Stomp消息)
2017-09-19 12:01
435 查看
下面我们使用ActiveMQ提供的JAVA 客户端(实际上就是ActiveMQ对JMS规范的实现),向ActiveMQ中的Queue(示例代码中将这个Queue命名为’test’)发送一条Stomp协议消息,然后再使用JAVA语言的客户端,从ActiveMQ上接受这条消息:
以上分别是使用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来验证这件事情
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来验证这件事情
相关文章推荐
- 消息中间件activemq的使用场景介绍(结合springboot的示例)
- [中间件] 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
- MQ系列3 使用Spring发送,消费topic和queue消息 activeMQ
- 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
- [中间件] 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
- [中间件] 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
- ActiveMQ - stomp 通过自定义转换器来支持 Map 消息传递
- activemq使用系列: 使用JmsGatewaySupport构建出通用的消息收发代码
- ActiveMQ In Action 第一章 消息传递和ActiveMQ简介 1.2 何时何地使用ActiveMQ
- biztalk中使用.net class类型的消息(二) -- 只使用.net class消息的示例
- 使用Eclipse RCP创建视图并实现视图间消息传递
- 使用PostThreadMessage在Win32线程间传递消息 (zhuan)
- ASP.NET中使用MSMQ进行消息处理系列文章
- 使用Eclipse RCP创建视图并实现视图间消息传递(二)
- C# 模仿QQ、MSN消息提示系列 五、改进 只使用两个时间控件
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- BizTalk开发系列(十八) 使用信封拆分数据库消息
- 使用PostThreadMessage在Win32线程间传递消息
- 使用PostThreadMessage在Win32线程间传递消息
- .net中使用消息传递数据