第一个JMS(Java Service Message)实例

来源:互联网 发布:安卓网络机顶盒论坛 编辑:程序博客网 时间:2024/06/04 08:24

JMS相关的概念这里就不在赘述,已经有很多前辈写了很多,这里直接上可运行的代码,先跑起来再说。
JMS的两种模式以及各自的特点:主题模式和队列模式
队列模式特点:

  1. 客户端包括生产者和消费者

  2. 队列中的消息只能被一个消费者消费

  3. 消费者可以随时消费队列里面的消息,不需要先预定消息

主题模式:(先运行订阅者再运行消费者,不然接受不到消息)

  1. 客户端包括生产者和消费者

  2. 主题中的消息被所有的消息消费

  3. 消费者需要预先订阅主题,消费者不能消费订阅之前的消息

    环境:JDK1.8+ActiveMQ5.15
    Maven依赖:

 <dependency>     <groupId>org.apache.activemq</groupId>     <artifactId>activemq-all</artifactId>     <version>5.15.0</version> </dependency>

队列模式:

package net.imwork.jms.queue;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * Created by Jason. * Date 2017/7/28 16:45 * 生产者 */public class Producer {    public static void main(String[] args) throws JMSException {        //消息目的地        String destinationurl = "tcp://localhost:61616";        //队列的名称        String QueueName = "demoQueueName";        //创建连接工厂,通过连接工厂创建连接        ConnectionFactory connectionFactory  = new ActiveMQConnectionFactory(destinationurl);        Connection connection = connectionFactory.createConnection();        //启动连接        connection.start();        //创建会话:        /**         * 1、通过会话创建队列对象         * 2、通过会话创建生成者对象         * 3、通过会话创建消息对象         */        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);        //创建目标,创建时设置队列名称        Destination destination = session.createQueue(QueueName);//Queue继承自Destionation        //根据队列对象创建生产者        MessageProducer producer = session.createProducer(destination);        //创建消息对象,可以创建多种类型的消息对象,这里是文件消息对象        for (int i = 0; i < 100; i++) {            TextMessage textMessage = session.createTextMessage("Hello JMS -- Queue-->"+i);            //发送消息            System.out.println("发送消息:"+textMessage.getText());            producer.send(textMessage);        }        //关闭连接        connection.close();    }}
package net.imwork.jms.queue;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * Created by Jason. * Date 2017/7/28 16:46 * 消费者 */public class Comsumer {    public static void main(String[] args) throws JMSException {        //消息目的地        String destinationurl = "tcp://localhost:61616";        //队列的名称        String QueueName = "demoQueueName";        //创建连接工厂,通过连接工厂创建连接        ConnectionFactory connectionFactory  = new ActiveMQConnectionFactory(destinationurl);        Connection connection = connectionFactory.createConnection();        //打开连接        connection.start();        //创建会话:        /**         * 1、通过会话创建队列对象         * 2、通过会话创建生成者对象         * 3、通过会话创建消息对象         */        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);        //创建队列对象,创建时设置队列名称        Queue queue = session.createQueue(QueueName);//Queue继承自Destionation        //根据队列对象创建消费者        MessageConsumer consumer = session.createConsumer(queue);        //接受消息//        for (int i = 0; i < 100; i++) {//            TextMessage message = (TextMessage) consumer.receive();//            System.out.println("接受到消息:"+message.getText());//        }        //设置监听器        consumer.setMessageListener(new MessageListener() {            @Override            public void onMessage(Message message) {                TextMessage textMessage = (TextMessage)message;                try {                    System.out.println("接受到消息:"+textMessage.getText());                } catch (JMSException e) {                    e.printStackTrace();                }            }        });        //关闭连接(关闭连接之后接收不到消息)//        connection.close();    }}

主题模式:

package net.imwork.jms.topic;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * Created by Jason. * Date 2017/7/28 16:45 * 生产者 */public class Producer {    public static void main(String[] args) throws JMSException {        //消息目的地        String destinationurl = "tcp://localhost:61616";        //队列的名称        String TopicName = "demoTopicName";        //创建连接工厂,通过连接工厂创建连接        ConnectionFactory connectionFactory  = new ActiveMQConnectionFactory(destinationurl);        Connection connection = connectionFactory.createConnection();        //启动连接        connection.start();        //创建会话:        /**         * 1、通过会话创建队列对象         * 2、通过会话创建生成者对象         * 3、通过会话创建消息对象         */        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);        //创建队列对象,创建时设置队列名称        Topic topic = session.createTopic(TopicName);//Queue继承自Destionation        //根据队列对象创建生产者        MessageProducer producer = session.createProducer(topic);        //创建消息对象,可以创建多种类型的消息对象,这里是文件消息对象        for (int i = 0; i < 100; i++) {            TextMessage textMessage = session.createTextMessage("Hello JMS -- Topic-->" + i);            //发送消息            System.out.println("发送消息:"+textMessage.getText());            producer.send(textMessage);        }        //关闭连接        connection.close();    }}
package net.imwork.jms.topic;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;/** * Created by Jason. * Date 2017/7/28 16:46 * 消费者 */public class Comsumer {    public static void main(String[] args) throws JMSException {        //消息目的地        String destinationurl = "tcp://localhost:61616";        //队列的名称        String TopicName = "demoTopicName";        //创建连接工厂,通过连接工厂创建连接        ConnectionFactory connectionFactory  = new ActiveMQConnectionFactory(destinationurl);        Connection connection = connectionFactory.createConnection();        //启动连接        connection.start();        //创建会话:        /**         * 1、通过会话创建队列对象         * 2、通过会话创建生成者对象         * 3、通过会话创建消息对象         */        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);        //创建队列对象,创建时设置队列名称        Topic topic = session.createTopic(TopicName);//Topic继承自Destionation        //根据队列对象创建消费者        MessageConsumer consumer = session.createConsumer(topic);        //接受消息        connection.start();        for (int i = 0; i < 100; i++) {            TextMessage message = (TextMessage) consumer.receive();            System.out.println("接受到消息:"+message.getText());        }       //关闭连接//        connection.close();    }}
原创粉丝点击