JMS 简介

JMS (Java Message Service)。用于在Application之间进行message传递。

Enterprise Message

WebSphere MQ、SonicMQ、Microsoft Message Queue(MSMQ)、ActiveMQ、EJB中的Message Bean、SOA中的ESB(Enterprise Message Bus)等都是Enterprise Message。

使用Enterprise Message时,可以有下列方式:

集中式

分布式

混合式

在每个Client上都安装一个Daemon程序,Client与Daemon使用TCP通信,Daemon与其它Daemon之间使用MultiCast。

JMS消息模型

JMS支持两种消息模型:point-to-point、publish-and-subscribe。

point-to-point

在P2P模型中,一个JMS Client可以发送、接收消息到(从)一个queue。可以是同步方式,也可以是异步方式。消息以PULL(拉)的方式获取。发送方称为sender,接收方称为receiver。

publish-and-subscribe

消息以push方式发送。即使订阅者是离线状态,也会进行发送。发送方称为publisher,接收方称为subscriber。

JMS API 简述

JMS 只是定义了接口,并没有具体的实现,实现都是由相关的厂商来完成的。这一点类似于JDBC。

JMS的API可以分为3个主要部分:1)通用API, 2)p2p API,3)pub/sub API。

几个主要的接口是:

·ConnectionFactory

·Destination

·Connection

·Session

·Message

·MessageProducer

·MessageConsumer

在上述接口中,ConnectionFactory、Destination是必须通过JNDI来取得,其实的接口都是根据这两个来创建的。取得ConnectionFactory后,就可以取得Connection;有了Connection就可以创建Session;有了Session,就可以创建出Message、MessageProducer、MessageConsumer。

实例的创建关系如下:

在JMS中,Session对象会持有transactional,而不是Connection,这一点与JDBC是不一样的。也就是说,在使用JMS时,一个应用只会创建一个Connection对象,可以根据这个Connection对象创建出多个Session对象。

Point-to-point

这是为P2P设计的接口。与通用接口一一对应。

Publish/Subscribe

 

与此类似,也为pub/sub专门设计了接口:

JMS Pub/Sub示例

要运行JMS,需要有JMS代理服务器。下面这个例子中,会使用activemq作为代理服务器。

在安装完成activemq后,启动它。

示例程序是一个简易Chat Room。

package com.fjn.java.jms.topic;

import java.io.IOException;
import java.util.Properties;
import java.util.Scanner;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Chat implements MessageListener {
    private TopicSession pubSession;
    private TopicPublisher publisher;
    private TopicConnection connection;
    private String username;

    public Chat(String factoryJdni, String topicName, String username)
            throws NamingException, JMSException, IOException {
        Properties props=new Properties();
        props.load(Chat.class.getResourceAsStream("jndi.properties"));
        InitialContext ctx = new InitialContext(props);
        TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx
                .lookup(factoryJdni);
        Topic topic = (Topic) ctx.lookup(topicName);

        TopicConnection conn = connFactory.createTopicConnection();

        TopicSession pubSession = conn.createTopicSession(false,
                Session.AUTO_ACKNOWLEDGE);
        TopicSession subSession = conn.createTopicSession(false,
                Session.AUTO_ACKNOWLEDGE);

        TopicPublisher publisher = pubSession.createPublisher(topic);
        TopicSubscriber subscriber = subSession.createSubscriber(topic, null,
                true);

        subscriber.setMessageListener(this);

        this.connection = conn;
        this.publisher = publisher;
        this.pubSession = pubSession;
        this.username = username;

        conn.start();
    }

    @Override
    public void onMessage(Message msg) {
        try {
            TextMessage text = (TextMessage) msg;
            System.out.println(text.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

    protected void writeMessage(String text) throws JMSException{
        TextMessage msg=pubSession.createTextMessage();
        msg.setText(username+": "+text);
        publisher.publish(msg);
    }

    public void close() throws JMSException{
        connection.close();
    }

    public static void main(String[] args) throws NamingException, JMSException, IOException {
        Chat chat=new Chat("TopicCF","topic1","ZhangSan");
        Scanner scanner=new Scanner(System.in);
        while(true){
            String line=scanner.nextLine();
            if("exit".equals(line)){
                chat.close();
                System.exit(0);
                scanner.close();
            }else{
                chat.writeMessage(line);
            }
        }
    }
}

package com.fjn.java.jms.topic;

import java.io.IOException;
import java.util.Scanner;

import javax.jms.JMSException;
import javax.naming.NamingException;

public class Chat2 {
    public static void main(String[] args) throws NamingException, JMSException, IOException {
        Chat chat=new Chat("TopicCF","topic1","LiSi");
        Scanner scanner=new Scanner(System.in);
        while(true){
            String line=scanner.nextLine();
            if("exit".equals(line)){
                chat.close();
                System.exit(0);
                scanner.close();
            }else{
                chat.writeMessage(line);
            }
        }
    }
}

其实,你可以将程序的main方法稍作改动,让创建Chat的三个参数从命名行取得。这样,就可以启动任意客户端了。

Jndi.properties文件内容:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
java.naming.security.principal=system
java.naming.security.credentials=manager
connectionFactoryNames = TopicCF
topic.topic1 = jms.topic1

这样就可以进行多个客户端对话了,也就是群组对话了。

时间: 2024-10-09 09:46:42

JMS 简介的相关文章

深入浅出JMS(一)——JMS简介 (转)

如果手机只能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了.为什么不能先将信息存下来,当用户需要查看信息的时候再去获得信息呢?伴随着这个疑惑,短息和留言应运而生,无论手机是否开机.是否未及时接到,我们都能得到其中的信息.JMS提供了类似这样的功能,本章我们将系统的学习JMS中的相关重要内容. Ø 掌握JMS基本概念及适用范围 Ø 点对点模型与发布/订阅模型的区别和使用场合 Ø 熟悉核心和通用的JMS API Ø 熟悉并理解JM

转:深入浅出JMS(一)——JMS简介

转载地址:http://blog.csdn.net/aking21alinjuju/article/details/6051421 作者:aking21alinjuju 目录: 企业消息系统 企业消息系统的好处 提供消息灵活性 松散耦合 JMS是什么 JMS的目标 JMS两种消息模型 点到点模型 发布订阅模型 如果手机只能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了.为什么不能先将信息存下来,当用户需要查看信息的时候再去获得

JMS简介

如果手机只能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了.为什么不能先将信息存下来,当用户需要查看信息的时候再去获得信息呢?伴随着这个疑惑,短息和留言应运而生,无论手机是否开机.是否未及时接到,我们都能得到其中的信息.JMS提供了类似这样的功能,本章我们将系统的学习JMS中的相关重要内容. ? 掌握JMS基本概念及适用范围 ? 点对点模型与发布/订阅模型的区别和使用场合 ? 熟悉核心和通用的JMS API ? 熟悉并理解JM

Spring整合JMS——基于ActiveMQ实现

1.1     JMS简介 JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑.对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应:另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收. 1.2  

MQ、JMS以及ActiveMQ的了解和认识

新加入的公司中,架构用到了activeMq,对于以前只了解nginx.tomcat的我有点懵逼,所以在网上找点资料看看,了解下什么是MQ,activemq.具体作用是什么 MQ MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队

Spring整合JMS(一)——基于ActiveMQ实现

1.1     JMS简介 JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑.对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应:另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收. 1.2  

MQ、JMS以及ActiveMQ

MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBMWEBSPHERE MQ. MQ特点: MQ的消费-生产者模型的一个

JMS和ActiveMQ

JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程.而activemq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者. jms 的一个标准或者说是一个协议. 通常用于企业级应用的消息传递. 主要有topic 消息(1 对多), queue 消息(1对1).activemq 是一个jms 的实现, apache 出的. 另外还其它的实现 jboss . MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一

JMS实现-ActiveMQ,介绍,安装,使用,注意点,spring整合

[TOC] 缘由: 最近在用netty开发游戏服务器,目前有这样的一个场景,聊天服务器和逻辑服务器要进行消息交互,比如,某个玩家往某个公会提交了加入申请,这个申请动作是在逻辑服务器上完成的,但是要产生一条申请消息,由聊天服务器推送到对应的公会频道,目前这个申请消息就是通过jms发送到聊天服务器上,聊天服务器监听到后,推送到对应的公会频道. 下面主要介绍以下几点 - JMS简介 - 消息传递模型 - ActiveMQ介绍 - 安装使用 - spring整合JMS - 代码相关 JMS简介 J Ja