频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
JMS(Java Message Service)
2017-09-13 10:36:00      个评论    来源:it_boy_elite的博客  
收藏   我要投稿

JMS(Java Message Service)

是一个Java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API。

两种消息模式

点对点(队列模型)

在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。生产者不需要在接收者接收该消息时处于运行状态,接收者也同样不需要在消息发送时处于运行状态。每一个成功处理的消息都由接收者签收。 发布者/订阅者

发布者/订阅者模型支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。 使用Java语言,JMS提供了将应用与提供数据的传输层相分离的方式。同一组Java类可以通过JNDI中关于提供者的信息,连接不同的JMS提供者。这一组类首先使用一个连接工厂以连接到队列或主题,然后发送或发布消息。在接收端,客户接收或订阅这些消息。 消息的消费:JMS的消费者可以通过两种方式来消费消息。

异步:订阅者/接收者可以注册一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage()方法。 同步:订阅者/接收者调用receive方法来接收消息,receive方法在能够接收消息之前(或超时之前)将一直阻塞。

JMS开发步骤

\
1. 实例化工厂连接ConnectionFactory connectionFactory;
2. 通过连接工厂获取连接Connection connection;
3. 启动连接;

4. 通过Connection得到会话Session;
5. 创建消息队列destination;
6. 通过session创建消息生产者/消费者,并设置消息队列;

7. 创建监听器(若消费者不自动接收消息的情况下可省略);

8. 消息生产者发送消息/消息消费者接收消息;

9. 关闭session,connection连接;

10. 注意:要开启activemq服务器;

JMS点对点通讯的实现

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

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

//生产者
public class JMSProcedure {

    // 默认连接用户名
    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    // 默认连接密码
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    // 默认连接地址
    private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
    // 发送消息的数量
    private static final int SENDNUM = 10;

    @SuppressWarnings("null")
    public static void main(String[] args) {
        // 连接工厂
        ConnectionFactory connectionFactory;
        // 连接
        Connection connection = null;
        // 会话
        Session session = null;
        // 消息的目的地
        Destination destination;
        // 消息的生产者
        MessageProducer messageProducer;

        // 实例化工厂连接
        connectionFactory = new ActiveMQConnectionFactory(JMSProcedure.USERNAME, JMSProcedure.PASSWORD,
                JMSProcedure.BROKEURL);
        try {
            // 通过连接工厂获取连接
            connection = connectionFactory.createConnection();
            // 启动连接
            connection.start();
            /*
             * 创建session,参数1:true支持事务。false不支持事务。为true时参数2值被忽略。
             * 参数2:取值Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外工作。
             * Session.CLIENT_ACKNOWLEDGE:为客户端确认。客户端接收到消息后,必须调用javax.jms.
             * Message的acknowledge方法。jms服务器才会删除消息
             * DUPS_OK_AKKNOWLEDGE:允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,
             * 会话对象就会确认消息的接收; 而且运行重复确认。在需要考虑资源使用时,这种模式非常有效。
             */
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            /// 创建一个名称为HelloWorld的消息队列
            destination = session.createQueue("HelloWorld");
            // 创建消息生产者
            messageProducer = session.createProducer(destination);
            // 发送消息
            sendMessage(session, messageProducer);
            session.commit();

        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    private static void sendMessage(Session session, MessageProducer messageProducer) {

        for (int i = 0; i 

ActiveMQ的web管理界面

https://blog.csdn.net/it_boy_elite/article/details/127.0.0.1:8161/admin

JMS消息服务器–Message消息类型

Java消息服务定义了6种JMS提供者必须支持的Message接口类型。尽管JMS定义了Message接口,但它并未定义他们的实现方式。这就允许提供者以他们自己的方式实现和传送消息,同时为JMS应用程序开发者维护了一个兼容的标准接口。这6个消息接口是Message和它的5个子接口:TextMessage,StreamMessage,MapMessage,ObjectMessage,ByteMessage。每种类型的消息都由3部分组成:消息头,消息属性和消息体。
1. StreamMessage—-Java原始值的数据流
2. MapMessage—-一套名称-值对
3. TextMessage—-一个字符串对象
4. ObjectMessage—-一个序列化的Java对象
5. BytesMessage—-一个未解释字节的数据流

点击复制链接 与好友分享!回本站首页
上一篇:java多线程学习
下一篇:Java I/O的设计模式
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训

版权所有: 红黑联盟--致力于做实用的IT技术学习网站