jsm apache-apollo-1.6 配置以及注意事项

最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽。

MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备。

MQTT的官网见:http://mqtt.org/。其中http://mqtt.org/software里面提供了官方推荐的各种服务器和客户端使用的各种语言版本的API。

下面以服务器Apollo 1.6为例,之前尝试过使用ActiveMQ,效果很不理想,只能实现服务器和客户端一对一的通信,从官网上了解到Apollo属于activemq的一个子工程。先不管这些了,言归正传,以下在windows环境下。

1、在这里下载Apollo服务器,下载后解压,然后运行apache-apollo-1.6\bin\apollo.cmd,输入create mybroker(名字任意取,这里是根据官网介绍的来取的)创建服务器实例,服务器实例包含了所有的配置,运行时数据等,并且和一个服务器进程关联。

2、create mybroker之后会在bin目录下生成mybroker文件夹,里面包含有很多信息,其中etc\apollo.xml文件下是配置服务器信息的文件,etc\users.properties文件包含连接MQTT服务器时用到的用户名和密码,后面会介绍,可以修改原始的admin=password,可以接着换行添加新的用户名密码。

3、打开cmd,运行…apache-apollo-1.6\bin\mybroker\bin\apollo-broker.cmd run 开启服务器,可以在浏览器中输入http://127.0.0.1:61680/查看是否安装成功,该界面展示了topic,连接数等很多信息。

经过上面的简单步骤,服务器基本上就已经完成,注意JDK要1.6版本的才可以。

4.发送消息代码

import java.io.File;
import java.util.List;

import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.commons.io.FileUtils;

public class Sender {

	public static void main(String[] args) {
		// ConnectionFactory :连接工厂,JMS 用它创建连接
		ConnectionFactory connectionFactory;
		// Connection :JMS 客户端到JMS Provider 的连接
		Connection connection = null;
		// Session: 一个发送或接收消息的线程
		Session session;
		// Destination :消息的目的地;消息发送给谁.
		Destination destination;
		// MessageProducer:消息发送者
		MessageProducer producer;
		// TextMessage message;
		// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
		connectionFactory = new ActiveMQConnectionFactory("admin",
				"password", "tcp://127.0.0.1:61613"); //url为回环地址 或者0.0.0.0
		try {
			// 构造从工厂得到连接对象
			connection = connectionFactory.createConnection();
			// 启动
			connection.start();
			// 获取操作连接
			session = connection.createSession(Boolean.TRUE ,
					Session.AUTO_ACKNOWLEDGE);
			// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
			destination = session.createQueue("queue.name");
			// 得到消息生成者【发送者】
			producer = session.createProducer(destination);
			// 设置不持久化,此处学习,实际根据项目决定
			producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
			// 构造消息,此处写死,项目就是参数,或者方法获取
			sendMessage(session, producer);
			session.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != connection)
					connection.close();
			} catch (Throwable ignore) {
			}
		}
	}

	public static void sendMessage(Session session, MessageProducer producer)
			throws Exception {
//		File file = new File("d:\\file0001.txt");
//		List<String> strs = FileUtils.readLines(file);
//		for (String s : strs) {
//			BytesMessage message = session.createBytesMessage();
//			try {
//				message.writeBytes(s.getBytes());
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//			System.out.println("发送了消息 storm Test>>>>>>>" + s);
//			producer.send(message);
//		}
		String s = "BytesMessage字节消息";  
		BytesMessage bytesMessage = session.createBytesMessage();  
		bytesMessage.writeBytes(s.getBytes());  
		producer.send(bytesMessage);
	}
}

5.接收消息代码

import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Receiver implements MessageListener {
	private boolean stop = false;

	public void execute() throws Exception {
		// 连接工厂
		ConnectionFactory connFactory = new ActiveMQConnectionFactory(
				"admin",
				"password", "tcp://0.0.0.0:61613");

		// 连接到JMS提供者
		Connection conn = connFactory.createConnection();
		conn.start();

		// 事务性会话,自动确认消息
		Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
		// 消息的来源地
		Destination destination = session.createQueue("queue.name");

		// 消息消费者
		MessageConsumer consumer = session.createConsumer(destination);
		consumer.setMessageListener(this);

		// 等待接收消息
		while (!stop) {
			Thread.sleep(5000);
		}

		session.commit();

		consumer.close();
		session.close();
		conn.close();
	}

	public void onMessage(Message m) {
		try {
			if (m instanceof TextMessage) { // 接收文本消息
				TextMessage message = (TextMessage) m;
				System.out.println(message.getText());
			} else if (m instanceof MapMessage) { // 接收键值对消息
				MapMessage message = (MapMessage) m;
				System.out.println(message.getLong("age"));
				System.out.println(message.getDouble("sarray"));
				System.out.println(message.getString("username"));
			} else if (m instanceof StreamMessage) { // 接收流消息
				StreamMessage message = (StreamMessage) m;
				System.out.println(message.readString());
				System.out.println(message.readLong());
			} else if (m instanceof BytesMessage) { // 接收字节消息
				byte[] b = new byte[1024];
				int len = -1;
				BytesMessage message = (BytesMessage) m;
				while ((len = message.readBytes(b)) != -1) {
					System.out.println(new String(b, 0, len));
				}
			} else if (m instanceof ObjectMessage) { // 接收对象消息
				ObjectMessage message = (ObjectMessage) m;
				User user = (User) message.getObject();
				System.out.println(user.getUserName() + " _ "
						+ user.getPassWord());
			} else {
				System.out.println(m);
			}

			stop = true;
		} catch (JMSException e) {
			stop = true;
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		Receiver r = new Receiver();
		try {
			r.execute();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

6.
 当数据量大的时候 byteMessage 可以压缩发送,这样在效率上会提高很多而TextMessage则不能。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值