需求:使用 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. 快速识别Hash加密方式hashid

    快速识别Hash加密方式hashid hashid工具是用来识别不同类型的散列加密,进而判断哈希算法的类型.该工具的而语法格式如下所示: hashid [option] INPUT 其中,option ...

  2. 页面的Tab选项卡 简单实例

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  3. 转 How to Resolve ORA-16009: remote archive log destination must be a STANDBY

    ###sample A primary B STANDBY C STANDBY   问题A 库一直报错 ORA-16009: remote archive log destination must b ...

  4. Python - Django - ORM 常用的字段属性

    字段参数: null:用于表示某个字段可以为空 unique:如果设置为 unique=True,则该字段在此表中必须是唯一的 db_index:如果 db_index=True,则代表着为此字段设置 ...

  5. SAS如何看待大数据

    SAS如何看待大数据 "大数据"现在是一个炙手可热的词语,数据分析师这个词虽然比较新,但收集与存储大量信息的历史却不短了. 早在本世纪初,行业分析师Doug Laney就提出了&q ...

  6. Redis应用场景梳理

    缓存 作为Key-Value形态的内存数据库,Redis 最先会被想到的应用场景便是作为数据缓存.而使用 Redis 缓存数据非常简单,只需要通过string类型将序列化后的对象存起来即可,不过也有一 ...

  7. kafka删除topic后再创建同名的topic报错(ERROR org.apache.kafka.common.errors.TopicExistsException)

    [hadoop@datanode3 logs]$ kafka-topics.sh --delete --zookeeper datanode1:2181 --topic firstTopic firs ...

  8. 图解 perspective && perspective-origin && transform3d && transform-origin

    perspective && perspective-origin perspective是物体相对于画布的视距距离 perspective-origin是物体在画布位置的中心视点 t ...

  9. Java基础教程:多线程基础——线程池

    Java基础教程:多线程基础——线程池 线程池 在正常负载的情况瞎,通过为每一个请求创建一个新的线程来提供服务,从而实现更高的响应性. new Thread(runnable).start() 在生产 ...

  10. robot:接口入参为图片时如何发送请求

    https://www.cnblogs.com/changyou615/p/8776507.html 接口是上传图片,通过F12抓包获得如下信息 由于使用的是RequestsLibrary,所以先看一 ...