ActiveMQ & JMS 简单应用
最近没事,因为裸辞一直闲置在一边。
ActiveMQ是apache所提供的一个消息系统,完全采用Java实现,因此它能够很好的支持J2EE提出的JMS规范。JMS(Java Message Service,Java消息服务)是一组应用程序接口,它提供创建、发送、接收、读取等一系列服务。
JMS支持的消息类型包括简单文本(TextMessage)、可序列化的对象(ObjectMessage)、键值对(MapMessage)、字节流(ByteMessage)、流(StreamMessage),以及无有效负载的消息(Message)等。消息的发送是异步的,因此消息的发布者发送完消息之后,不需要等待消息的接收者的立即响应,这样便提高了分布式系统协作的效率。
JMS支持两种消息的发送和接收模型。一种成为Point to Point(P2P)模型,即采用点对点的方式发送消息。P2P模型是基于queue(队列)的,消息生产者发送消息队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输可能,P2P模型在点对点的情况下进行消息的传送时采用。另一种称为Pub/Sub(Publish/Subscribe,即发布/订阅)模型,发布/订阅模型定义了如何向一个内容节点发布和订阅消息,这个内容节点称为topic(主题),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题订阅消息。主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模型在消息的一对多广播时采用。
点对点消息传输模型,多个消息的生产者和消息的消费者都可以注册到同一个消息队列,当消息生产者发送一条消息之后,只有其中一个消息消费者会接收到小消息生产者发送的消息,而不是所有消费者都能收到消息。eg:代码如下
先下载安装ActiveMQ 官网地址http://activemq.apache.org/ 分为Linux版本和Windows版本。再下载JMS Jar包
消息生产者产生消息
public static void main( String[] args ) { //创建一个ActiveMQConnectionFactory, ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616"); try { //通过ActiveMQConnectionFactory来创建一个ActiveMQ的链接 Connection connection = connectionFactory.createConnection(); //启动连接 connection.start(); /** * 通过连接创建Session * @value boolean 是否采用事物消息。如果采用消息是事物的,对应的参数设置为true,此时消息提交 * 自动有commit处理,消息的回滚则自动有rollback处理, * 假如消息不是自动的则对应参数设置为false,此时分为三种情况, * @value Session.AUTO_ACKNOWLEDGE表示Session会自动确认所接收到的消息; * Session.CLIENT_ACKNOWLEDGE 表示客户端通过调用消息确认的方法来确认所收到的消息; * Session.DUPS_OK_ACKNOWLEDGE 表示Session将“懒惰”地确认消息,即不会立即确认消息, * 这样有可能导致消息重复投递 */ Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); //创建消息队列对象,队列名称为MessageQueue(-自定义-) Destination destination = session.createQueue("MessageQueue"); //创建消息生产者 MessageProducer producer = session.createProducer(destination); //设置交互模式 不支持 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //创建消息 ObjectMessage message = session.createObjectMessage("Hello everyone"); //发送消息 producer.send(message); //提交 session.commit(); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
消息接收者
public static void main( String[] args ) { //床 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616"); try { Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("MessageQueue"); //创建消息接收者 MessageConsumer consumer = session.createConsumer(destination); while(true){ //通过receive来接收Object消息 ObjectMessage message = (ObjectMessage)consumer.receive(1000); if(message != null){ String messageContent = (String) message.getObject(); //打印消息 System.out.println(messageContent); }else{ break; } } session.close(); connection.close(); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); }; }
通过JMS创建ActiveMQ的topic,并给topic发送消息
public static void main( String[] args ) { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:62626"); try { Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); //创建主题消息 Topic topic = session.createTopic("topic"); //创建主题消息生产者 MessageProducer messageProducer = session.createProducer(topic);
//实时消息接收,消息接收者没有实时监听是,消息就会过期无法接收 messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); TextMessage textMessage = session.createTextMessage(); textMessage.setText("message_hello_我是小严"); messageProducer.send(textMessage); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
消息接收者
public static void main( String[] args ) { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616"); try { Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("topic"); //创建消息接收者 MessageConsumer consumer = session.createConsumer(topic); consumer.setMessageListener(new MessageListener(){ public void onMessage(Message message) { // TODO Auto-generated method stub TextMessage textMessage = (TextMessage) message; try { System.out.println(textMessage.getText()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); }; }
Session创建好后,通过Session创建对应的topic,然后通过topic来创建消息的消费者,消息的消费者需要在topic上注册一个listener,以便消息发送一个topic之后,消息的消费者能够及时的收到。
JMS一般用在企业级、分布式开发中。现在中国流行SSH基本上用不上,只有个别根据业务需要,会有用的,但不多。
最常见的连锁店,店铺销售数据要传回服务器,不能保证所有店铺都能正常联网,也不能断网这个店铺就不能销售。jms的异步传输,可以暂存数据,在网络正常时将之前的数据传输过去。
网络不好的时候,同步传输则要一直等待,异步则不需要。