相关文章推荐
谦逊的板栗  ·  文件系统 | 微信开放文档·  2 年前    · 
谦和的苦瓜  ·  MYSQL学习:GROUP ...·  2 年前    · 
性感的毛衣  ·  Scrapy入门到放弃04:下载器中间件,让 ...·  2 年前    · 
深情的烈酒  ·  postgresql图片等二进制数据的存储( ...·  2 年前    · 
沉着的热水瓶  ·  【演讲嘉宾】首批重磅公布!雀巢、伊利、蒙牛、 ...·  2 年前    · 
Code  ›  activmq:android平台下使用openwire协议连接activemq服务的问题开发者社区
activemq 科技新闻 session jndi
https://cloud.tencent.com/developer/article/1693113
老实的开心果
2 年前
作者头像
10km
0 篇文章

activmq:android平台下使用openwire协议连接activemq服务的问题

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 10km的专栏 > activmq:android平台下使用openwire协议连接activemq服务的问题

activmq:android平台下使用openwire协议连接activemq服务的问题

作者头像
10km
发布 于 2020-09-07 15:08:32
930 0
发布 于 2020-09-07 15:08:32
举报

如果在android平台连接activemq服务,应该怎么实现呢?大部分网上的文章都是eclipse 提供的paho MQTT client实现。如果你只是用消息发布/订阅功能,那么用paho MQTT client就足够了。 但是MQTT协议只支持消息发布/订阅,所以如果你需要使用生产者/消费者模型,就不能用MQTT协议了。 我就遇到这样的需求,需要在android平台以消费者身份接收 消息队列 的数据。于是我尝试使用activemq提供的 activemq-client 库来连接activemq服务.

// https://mvnrepository.com/artifact/org.apache.activemq/activemq-client
implementation 'org.apache.activemq:activemq-client:5.14.5'

然而在编译时就报错了:

错误: 无法访问Referenceable 找不到javax.naming.Referenceable的类文件

找不到 javax.naming.Referenceable 类,实际就是找不到包名前缀为 javax.naming 的所有类,也就是 JNDI 库(Java Naming and Directory Interface,Java命名和目录接口),在JDK中这个库是内置的。因为android使用的DVM并不是完整的JVM,所以缺少 JNDI 库。所以现在的问题就变成了如何找到android平台可以用的 JNDI 库.

在maven中央仓库可以搜索到 JNDI 库,但却找不到对应的jar包。

https://mvnrepository.com/artifact/javax.naming/jndi/1.2.1

所以指望在maven找到JNDI库是不可能了,我又不死心通过google一通找,

在以下两个网站找到了 jndi-1.2.1.jar ,经验证都能在Android平台正常使用 http://www.java2s.com/Code/JarDownload/jndi/jndi-1.2.1.jar.zip http://treebase.sourceforge.net/maven2/javax/naming/jndi/1.2.1/jndi-1.2.1.jar

使用方法也很简单,将 jndi-1.2.1.jar 复制到 app/libs 文件夹下。如果你的 app/build.gradle 中有定义 implementation fileTree(dir: 'libs', include: ['*.jar']) , jndi-1.2.1.jar 就被自动导入了项目,如果没有这一行就要手工加一行 implementation files('libs/jndi-1.2.1.jar')

有了JNDI库,编译不再报错,测试也就正常通过了

发布消息的JUNIT测试

ActivemqPublisherTest.java

package gu.simplemq.activemq;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
import com.google.common.collect.ImmutableMap;
 * @author guyadong
public class ActivemqPublisherTest {
    private static final int DELIVERY_MODE = DeliveryMode.NON_PERSISTENT;
    // activemq服务主机地址
	private static final String OPENWIRE_HOST = "192.168.10.226";
	private static ActiveMQConnectionFactory createFactory(){
		Properties props = new Properties();
    	props.setProperty("brokerURL","tcp://" + OPENWIRE_HOST + ":61616");
    	ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
       factory.setProperties(props);    
       return factory;
	@Test
	public void test1() throws InterruptedException, JMSException {
		ActiveMQConnectionFactory factory = createFactory();
		Connection connection = null;
		Session session = null;
		MessageProducer p1 = null;
		MessageProducer p2 = null;
		try {
			connection = factory.createConnection();
            connection.setExceptionListener(new MyExceptionListener());
            connection.start();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            p1 = session.createProducer(session.createTopic("chat1"));
            p2 = session.createProducer(session.createTopic("chat2"));
			for(int i=0; i<100; ++i){
				Date date = new Date();
				String str = "OPENWIRE "  + date.toString();
                TextMessage message = session.createTextMessage(str);
                p1.send(message, DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
                p2.send(message, DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
				logger.info(date.getTime() +" : " +date.toString());
				Thread.sleep(2000);
		} catch (JMSException e) {
			e.printStackTrace();
		} finally{
			if(null != p2){
				p2.close();
			if(null != p1){
				p1.close();
			if(null != session){
				session.close();
			if(null != connection){
				connection.close();
    private static class MyExceptionListener implements ExceptionListener {
        @Override
        public void onException(JMSException exception) {
            System.out.println("Connection ExceptionListener fired, exiting.");
            exception.printStackTrace(System.out);
            System.exit(1);
}

订阅消息的JUNIT测试

ActivemqSubscriberTest.java

package gu.simplemq.activemq;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Properties;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.ExceptionListener;
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.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.google.common.collect.ImmutableMap;
 * @author guyadong
public class ActivemqSubscriberTest {
	// activemq服务主机地址
	private static final String OPENWIRE_HOST = "192.168.10.226";
	private static ActiveMQConnectionFactory createFactory(){
		Properties props = new Properties();
    	props.setProperty("brokerURL","tcp://" + OPENWIRE_HOST + ":61616");
    	ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
       factory.setProperties(props);    
       return factory;
	private static Connection conn;
	private static Session session;
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		ActiveMQConnectionFactory factory = createFactory();
		conn = factory.createConnection();
		conn.setExceptionListener(new MyExceptionListener());
		conn.start();
		session = conn.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		session.close();
		conn.close();
	public void sub(Session session,String topic,MessageListener listener) throws JMSException {
		Topic activeMQTopic = session.createTopic(topic);
		MessageConsumer consumer = session.createConsumer(activeMQTopic);
		consumer.setMessageListener(listener);
	private static void waitquit(){
		System.out.println("PRESS 'quit' OR 'CTRL-C' to exit");
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
			while(!"quit".equalsIgnoreCase(reader.readLine())){
			System.exit(0);
		} catch (IOException e) {
		}finally {
	@Test
	public void test1() {
		try {
			sub(session,"chat1", new LogListener());
			sub(session,"chat2", new LogListener());
			sub(session,"chat3", new LogListener());
			waitquit();
		} catch (JMSException e) {
			e.printStackTrace();
	private static class LogListener implements MessageListener{
		private String textOf(Message message) throws JMSException{
			if(message instanceof TextMessage){
				return ((TextMessage) message).getText();
			if(message instanceof BytesMessage){
				BytesMessage bytesMessage = (BytesMessage)message;
				byte[] buf = new byte[(int) bytesMessage.getBodyLength()];
				bytesMessage.readBytes(buf);
				return new String(buf);
			throw new IllegalArgumentException(String.format("INVALID message type,%s,%s required",
					TextMessage.class.getName(),
					BytesMessage.class.getName()));
		@Override
		public void onMessage(Message message) {
			try {
				logger.info("dest {}:{}",message.getJMSDestination(),textOf(message));
			} catch (JMSException e) {
				e.printStackTrace();
    private static class MyExceptionListener implements ExceptionListener {
        @Override
        public void onException(JMSException exception) {
            System.out.println("Connection ExceptionListener fired, exiting.");
            exception.printStackTrace(System.out);
            System.exit(1);
 
推荐文章
谦逊的板栗  ·  文件系统 | 微信开放文档
2 年前
谦和的苦瓜  ·  MYSQL学习:GROUP BY分组取最新的一条记录-腾讯云开发者社区-腾讯云
2 年前
性感的毛衣  ·  Scrapy入门到放弃04:下载器中间件,让爬虫更完美 - 掘金
2 年前
深情的烈酒  ·  postgresql图片等二进制数据的存储(copy命令,bytea类型)_postgres 存储图片_djskl的博客-CSDN博客
2 年前
沉着的热水瓶  ·  【演讲嘉宾】首批重磅公布!雀巢、伊利、蒙牛、今麦郎、GNC、东鹏饮料等高层确认出席FBIF2023! - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号