需求:使用 python 程序向 activemq 的主题推送数据,默认推送的数据类型是 BytesMessage,java 程序那边接收较为麻烦,改为推送 TextMessage 类型的数据

解决方法:想要推送 TextMessage 需要指定 auto_content_length=False

示例代码如下:

# coding=utf-8
import stomp def send_to_topic(msg):
try:
conn = stomp.Connection10([("10.10.19.200", 61613)], auto_content_length=False)
conn.start()
conn.connect()
conn.send('/topic/HIATMP.HISENSE.ILLEGAL.AIREVIEW', msg)
conn.disconnect()
return 1
except Exception as e:
# logging.error(f"send message with activemq failed, error is:{e}")
return 0 if __name__ == "__main__":
result = send_to_topic("ILLEGAL01,2.1,0001,5b9171c2815342c5bce90f601f14d182,1,02,鲁BJ0A92,2019-04-26 15:51:45,12080,601078111050,宁夏路与福州南路路口,370202000000,1,1,370202000000011125,3,01,,0,http://10.10.19.250/1.png,http://10.10.19.250/2.png,http://10.10.19.250/3.png,,717/1846/136/36/1,2,2019-04-26 15:51:53,,,,,,,,,1,不按道行驶,,,,,,,,,1,10")
print result

  

例外,附上 activemq 关于主题的生产者,消费者代码

1)python 版本(stomp协议)

生产者:

# coding=utf-8
import stomp def send_to_topic(msg):
try:
conn = stomp.Connection10([("10.10.19.200", 61613)], auto_content_length=False)
conn.start()
conn.connect()
conn.send('/topic/HIATMP.HISENSE.ILLEGAL.AIREVIEW', msg)
conn.disconnect()
return 1
except Exception as e:
# logging.error(f"send message with activemq failed, error is:{e}")
return 0 if __name__ == "__main__":
result = send_to_topic("ILLEGAL01,2.1,0001,5b9171c2815342c5bce90f601f14d182,1,02,鲁BJ0A92,2019-04-26 15:51:45,12080,601078111050,宁夏路与福州南路路口,370202000000,1,1,370202000000011125,3,01,,0,http://10.10.19.250/1.png,http://10.10.19.250/2.png,http://10.10.19.250/3.png,,717/1846/136/36/1,2,2019-04-26 15:51:53,,,,,,,,,1,不按道行驶,,,,,,,,,1,10")
print result

  

消费者:

# coding=utf-8
import stomp class SampleListener(object):
def on_message(self, headers, message):
print('headers: %s' % headers['destination'])
print('message: %s\n' % message) # 从主题接收消息
def receive_from_topic():
conn = stomp.Connection10([("10.10.19.200", 61613)])
conn.set_listener("", SampleListener())
conn.start()
conn.connect()
conn.subscribe("/topic/HIATMP.HISENSE.ILLEGAL.AIREVIEW")
while True:
pass
# conn.disconnect() if __name__ == '__main__':
receive_from_topic()

2)java 版本(tcp协议)

生产者:

package ActiveMQ;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID; public class TopicProducer { public static void main(String[] args) {
//连接信息设置
String username = "admin";
String password = "admin";
String brokerURL = "failover://tcp://10.10.19.200:61616";
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//会话 接受或者发送消息的线程
Session session = null;
//消息的主题
Topic topic = null;
//消息生产者
MessageProducer messageProducer = null;
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL);
try {
//通过连接工厂获取连接
connection = connectionFactory.createConnection();
//启动连接
connection.start();
//创建session
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建名为TopicTest的主题
// topic = session.createTopic("HIATMP.HISENSE.ILLEGAL");
topic = session.createTopic("HIATMP.HISENSE.ILLEGAL.AIREVIEW");
//创建主题生产者
messageProducer = session.createProducer(topic);
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//不将数据持久化
//发送主题
TextMessage message = null;
for (int i = 0; i < 1; i--) {
//创建要发送的文本信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");//设置日期格式
String dateTime = df.format(new Date());// new Date()为获取当前系统时间
// message = session.createTextMessage("illegal" + dateTime); String uuid = UUID.randomUUID().toString().replaceAll("-","");
String message_fmt = String.format("ILLEGAL01,2.1,0001,%s,1,02,鲁BJ0A92,2019-04-26 15:51:45,12080,601078111050,宁夏路与福州南路路口,370202000000,1,1,370202000000011125,3,01,,0,http://10.10.19.250/1.png,http://10.10.19.250/2.png,http://10.10.19.250/3.png,,717/1846/136/36/1,2,2019-04-26 15:51:53,,,,,,,,,1,不按道行驶,,,,,,,,,1,10", uuid);
message = session.createTextMessage(message_fmt);
//通过主题生产者发出消息
messageProducer.send(message);
System.out.println("发送成功:" + message.getText());
session.commit(); // 提交到mq Thread.sleep( 200 * 1 );
}
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != connection) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}

producer

消费者:

package ActiveMQ;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.BytesMessage;
import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.transport.stomp.Stomp; public class TopicConsumer { public static void main(String[] args) {
// Stomp.Headers.Send.PERSISTENT; //连接信息设置
String username = "admin";
String password = "admin";
String brokerURL = "failover://tcp://10.10.19.200:61616";
// String brokerURL = "failover://stomp://0.0.0.0:61613";
//连接工厂
ConnectionFactory connectionFactory = null;
//连接
Connection connection = null;
//会话 接受或者发送消息的线程
Session session = null;
//主题的目的地
Topic topic = null;
//主题消费者
MessageConsumer messageConsumer = null;
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL); try {
//通过连接工厂获取连接
connection = connectionFactory.createConnection();
//启动连接
connection.start();
//创建session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个连接TopicTest的主题
topic = session.createTopic("HIATMP.HISENSE.ILLEGAL.AIREVIEW");
//创建主题消费者
messageConsumer = session.createConsumer(topic); messageConsumer.setMessageListener(new MyMessageListener());
} catch (JMSException e) {
e.printStackTrace();
}
} } class MyMessageListener implements MessageListener { @Override
public void onMessage(Message message) {
System.out.println(message);
// 接收 BytesMessage
// BytesMessage bytesMessage = (BytesMessage) message; TextMessage bytesMessage = (TextMessage) message;
try {
// 接收 BytesMessage
// byte []bt = new byte[(int) bytesMessage.getBodyLength()];
// bytesMessage.readBytes(bt);
// String str = new String(bt);
// System.out.println("接收订阅主题:" + str); System.out.println("接收订阅主题:" + bytesMessage.getText()); } catch (JMSException e) {
e.printStackTrace();
}
}
}

consumer

end~

activemq BytesMessage || TextMessage的更多相关文章

  1. spring整合JMS - 基于ActiveMQ实现

    一. 开篇语 继上一篇apache ActiveMQ之初体验后, 由于近期一直在复习spring的东西, 所以本文就使用spring整合下JMS. 二. 环境准备 1. ActiveMQ5.2.0 ( ...

  2. ActiveMQ的安装与使用。

    1.什么是ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE .4规范的 JMS Provider实现,尽 ...

  3. ActiveMQ消息队列的使用及应用

    这里就不说怎么安装了,直接解压出来就行了. 谢绝转载,作者保留所有权力 目录:  一:JMQ的两种消息模式 1.1:点对点的消息模式 1.2:订阅模式 二:点对点的实现代码 2.1:点对点的发送端 2 ...

  4. activemq和jms是种什么关系

    JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程. 而activemq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者. jm ...

  5. ActiveMQ入门

    ActiveMQ简介 概要 开源 JMS-compliant 消息中间件message-oriented middleware(MOM) 松耦合,相对于RPC的紧耦合 发送消息fire-and-for ...

  6. C++ activemq CMS 学习笔记.

    很早前就仓促的接触过activemq,但当时太赶时间.后面发现activemq 需要了解的东西实在是太多了. 关于activemq 一直想起一遍文章.但也一直缺少自己的见解.或许是网上这些文章太多了. ...

  7. Activemq消息类型

    Activemq消息类型JMS规范中的消息类型包括TextMessage.MapMessage.ObjectMessage.BytesMessage.和StreamMessage等五种.ActiveM ...

  8. ActiveMQ之二--JMS消息类型

    1.前言 //发送文本消息 session.createTextMessage(msg); //接受文本消息 public void onMessage(Message msg) { TextMess ...

  9. activemq spring 配置

    Apache ActiveMQ是最流行和最强大的开源消息集成模式服务器.Apache ActiveMQ是速度快,支持多跨语言的客户端和协议,带有易于使用企业集成模式和许多先进的功能在充分支持JMS 1 ...

随机推荐

  1. vim 显示行号 临时&永久

    设置vim 永久显示行号 - electrocrazy的博客 - CSDN博客https://blog.csdn.net/electrocrazy/article/details/79035216 v ...

  2. Hibernate Persistence Contexts

    Hibernate ORM 5.2.18.Final User Guidehttps://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/ ...

  3. mysql中int长度的意义 int(0)

    问题: mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同.如果不同,分别是多大?int(0) 能存多少位数字? 不同,int(3)最多显 ...

  4. 详解Django rest_framework实现RESTful API

    这篇文章主要介绍了详解Django rest_framework实现RESTful API,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 一.什么是REST 面向资源是R ...

  5. 美国gfs数据介绍和解析

    最近有个项目需要开发个气象信息API,可以通过经纬度查找未来几天的气象信息. 经过几天的研究,现在简单总结一下. 1.数据来源数据来源采自美国国家环境预报中心的GFS(全球预报系统),该系统每天发布4 ...

  6. python初级 0 出发吧

    一.与Python交互 键入命令(指令)后,Python立即执行这个命令 1 进入notebook交互编程环境 进入notebook环境, 点击New菜单下的Python 3环境进入到交互编程环境 2 ...

  7. Zabbix 3.2.6-Mysql多实例监控-Percona Monitoring Plugins自动发现

    mysql多实例监控实录   系统环境: cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 内核版本: uname -r 3.1 ...

  8. netty WEBSOKET 客户端 JAVA

    https://blog.csdn.net/mafei6827/article/details/80657405 https://blog.csdn.net/u010939285/article/de ...

  9. idea能用下划线替换红色报错吗?我色弱,用idea简直太痛苦了

    看看下图的idea,如果某个类的包路径没有引进来,使用颜色来提示,这对于色弱的程序员简直是一种折磨,有没有可以改成eclipse的那种报错提示方式? 个人感觉idea真的没有eclipse友好,也许是 ...

  10. 【Leetcode_easy】888. Fair Candy Swap

    problem 888. Fair Candy Swap solution: class Solution { public: vector<int> fairCandySwap(vect ...