`
canofy
  • 浏览: 830134 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

JMS的一些代码

    博客分类:
  • j2EE
阅读更多
通过这里的例子,可以把消息进行分组,然后进行分组的方式进行发送出去,即相当于不同级别的用户可以收取到不同的消息
现在对于消息的基于推的方式还没有想明白,即服务器向客户端推送消息还不是太明白
监听的方式是可以实现,但这是必须先运行接收端

在发送端代码可以使用 producer.send(message); producer.send(message, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
在接收端则可以使用consumer.setMessageListener(this);consumer.receive();consumer.receive(Long Timeout);


第一个例子是发布订阅者的例子,使用了选择器(选择器的选择是通过发布者里设置的属性来进行的)

这里使用了Tomcat里的JNDI,使用了ActiveMQ,但在程序里是使用标准来进行编写的,和具体使用的何种MQ没有关系,更换MQ,只需更改JNDI,当然这里没有涉及到分布式的问题,貌似分布式还需要使用JTA的xa吧



发送消息代码:


package com.test;

import javax.jms.*;
import javax.naming.*;

public class TestSendSelectorMain{


	/**
	 * 如果客户端需要接收主题上所有发布的消息,包括那些订阅者不活动期间发布的消
	息,那么就要使用持久化的TopicSubscriber.持久化的TopicSubscriber可以被Session或者被
	TopicSession创建。JMS保持这个持久化订阅的记录并且确保所有来自于主题发布者的消息
	都会被保持到被持久化订阅者确认,或者过期。 
	 */
    public void sendMessage()    {
        try {
            InitialContext initCtx = new InitialContext();
            Context envContext = (Context)initCtx.lookup("java:comp/env");
            ConnectionFactory connectionFactory = (ConnectionFactory)envContext.lookup("jms/ConnectionFactory");
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false, 1);
            MessageProducer producer = session.createProducer((Destination)envContext.lookup("jms/topic/MyTopic"));
            Message testMessage = session.createMessage();
            //设置所需传输的属性,可以使用选择器进行选择
            testMessage.setStringProperty("testKey", "testValue");
            testMessage.setStringProperty("JMSXGroupID", "QS_10/3/11");
            testMessage.setJMSType("car");
            producer.send(testMessage);
            System.out.println("Send End");
        } catch(NamingException e)  {
            System.out.println("NamingException");
            e.printStackTrace();
        } catch(JMSException e){
            System.out.println("JMSException");
            e.printStackTrace();
        }
    }
}




下面是接收消息代码:

package com.test;

import javax.jms.*;
import javax.naming.*;

/**
 * 异步接收消息(并且可通过类似sql的where条件语句的方式进行选择消息)
 * 如果没有消息,则会进行等待,直到获取消息为止
 * 
 */
public class TestReceiveSelectorMain{

	/**
	 *  1、使用JNDI查找一个ConnectionFactory对象。 
	 *  2、使用JNDI查找一个或者多个Destination对象。 
	 *  3、使用ConnectionFactory创建一个JMS连接 
	 *  4、使用连接创建一个或者多个JMS Sessions 
	 *  5、使用Session and Destinations  创建所需的MessageProducers 和MessageConsumers  
	 *  6、告知Connection 开始传送消息。 
	 * @throws NamingException
	 * @throws JMSException
	 */
    public void receiveMessage() throws NamingException, JMSException  {
        InitialContext initCtx = new InitialContext();
        Context envContext = (Context)initCtx.lookup("java:comp/env");
        ConnectionFactory connectionFactory = (ConnectionFactory)envContext.lookup("jms/ConnectionFactory");
      //连接工厂创建一个jms connection  
        Connection connection = connectionFactory.createConnection();
        connection.setClientID("testMessageDurableSubscriber");
        connection.start();
        
        //是生产和消费的一个单线程上下文。会话用于创建消息的生产者,消费者和消息。会话提供了一个事务性的上下文。  
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//不支持事务
        //目的地是客户用来指定他生产消息的目标还有他消费消息的来源的对象,两种消息传递方式:点对点和发布/订阅  
        //会话创建消息的生产者将消息发送到目的地          
        
        MessageConsumer consumer = session.createDurableSubscriber((Topic)envContext.lookup("jms/topic/MyTopic"), "name", "JMSType = 'car' AND testKey='testValue'", false);
        //使用createDurableSubscriber方法之后,当主题里有消息时,receive()方法则进行一条消息一条消息取出来
        //阻塞式监听 consumer.receive()
        //当主题里没有消息时,则一直等待发送消息
        //队列的receive(long timeout)方法用与一次获取一条消息,
        //当没有消息时,等待一段时间就结束而不会像receive()等待
        Message testMessage = consumer.receive();
        if(testMessage != null){
            String returnMessage = testMessage.getStringProperty("testKey");
            System.out.println((new StringBuilder("----returnMessage=")).append(returnMessage).toString());
        }
        session.close();
        connection.close();
        System.out.println("Recive End");
    }
}



剩下的工作就只剩下接收和发送的jsp页面了,页面里仅仅只是调用上面的两个类中的方法而已。


第二个例子是基于队列的有选择器应用的,还传递对象的例子,

发送消息:

package com.test;

import javax.jms.*;
import javax.naming.*;

public class TestJavaxJmsSendMain{

	 public void sendMessage() {
	        try{
		     //这是自定义的所需传输的对方,必须进行序列化
	             MessageObject mo = new MessageObject();
	             mo.setKey("testKey");
	             mo.setTitle("标题");
	             mo.setContent("内容");
	             mo.setDescription("描述测试");
	            System.out.println("Send Start");
	            InitialContext initCtx = new InitialContext();
	            Context envContext = (Context)initCtx.lookup("java:comp/env");
	            ConnectionFactory connectionFactory = (ConnectionFactory)envContext.lookup("jms/ConnectionFactory");
	            Connection connection = connectionFactory.createConnection();
	            Session session = connection.createSession(false, 1);
	            MessageProducer producer = session.createProducer((Destination)envContext.lookup("jms/queue/MyQueue"));
//	            MessageProducer producer = session.createProducer((Destination)envContext.lookup("jms/queue/MyQueue"));
	            
	            //ObjectMessage可以用来传输对象
	            //ObjectMessage的属性可以用来设置查询的条件
	            //ObjectMessage.setObject(Object)用来设置需要传输的对象
	            ObjectMessage testMessage = session.createObjectMessage();
	            testMessage.setJMSType("ObjectSendTest"); 
	            testMessage.setStringProperty("testKey", "testValue");
	            testMessage.setStringProperty("JMSXGroupID", "QS_10/3/11");
	            testMessage.setObject(mo);
	            //发送的两种方式
//	            producer.send(message);
//	            producer.send(message, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
	            producer.send(testMessage, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, 10000);
	            System.out.println("Send End");
	        } catch(NamingException e){
	            System.out.println("NamingException");
	            e.printStackTrace();
	        }catch(JMSException e){
	            System.out.println("JMSException");
	            e.printStackTrace();
	        }
	    }
}






接收消息:

package com.test;


import javax.jms.*;
import javax.naming.*;

public class TestJavaxJmsReceiveMain implements MessageListener, ExceptionListener{

    public void receiveMessage(){
        try{
        	System.out.println("Receive Start");
            InitialContext initCtx = new InitialContext();
            Context envContext = (Context)initCtx.lookup("java:comp/env");
            ConnectionFactory connectionFactory = (ConnectionFactory)envContext.lookup("jms/ConnectionFactory");
            Connection connection = connectionFactory.createConnection();
//            connection.start();
            Session session = connection.createSession(false, 1);
            MessageConsumer consumer = session.createConsumer((Destination)envContext.lookup("jms/queue/MyQueue"),"testKey='testValue'");
//          //这种采用consumer.setMessageListener(this)方式不太稳定,有时需要发送很多次,接收端才能收到消息,一下能接收到很多条消息
//            consumer.setMessageListener(this);
            
            //主动去获取消息,实现了阻塞式获取消息       consumer.receive()  consumer.receive(Long timeout)
            ObjectMessage testMessage = (ObjectMessage)consumer.receive();
            System.out.println("consumer.getMessageSelector="+consumer.getMessageSelector());
            if (testMessage != null) {
            	System.out.println("testMessage.getJMSType="+testMessage.getJMSType());
		//这里接收到了自定义的对象
            	MessageObject mo=(MessageObject)testMessage.getObject();
            	System.out.println("mo.getContent="+mo.getContent());
            	System.out.println("mo.getKey="+mo.getKey());
            	System.out.println("接收到消息");
            }else{
            	System.out.println("没有");
            }
            
            System.out.println("Receive end");
            consumer.close();
            session.close();
            connection.close();
        }catch(NamingException e) {
            System.out.println("NamingException");
            e.printStackTrace();
        }catch(JMSException e){
            System.out.println("JMSException");
            e.printStackTrace();
        }
    }

    public void onMessage(Message message)
    {
//        String returnMessage = "";
//        try{
//            returnMessage = message.getStringProperty("testKey");
//        }catch(JMSException e){
//            e.printStackTrace();
//        }
	    	if (message != null) {
	        	System.out.println("onMessage接收到消息");
	        }else{
	        	System.out.println("onMessage没有");
	        }
        
//    	 try{
//             if (message instanceof TextMessage) {
//                 TextMessage txtMsg = (TextMessage)message;
//                 String msg = txtMsg.getText();
//                 System.out.println("Received: " + msg);
//             }
//         }catch(Exception e){
//             e.printStackTrace();
//         }

//        System.out.println((new StringBuilder("----TestReceiveAsynMain returnMessage=")).append(returnMessage).toString());
//        System.out.println("Recive End");
    }

    public void onException(JMSException jmsexception)
    {
        System.out.println("Recive jmsexception");
    }
}
分享到:
评论

相关推荐

    java JMS代码示例

    下面我们将通过一个简单的Java JMS代码示例来理解其基本用法: 1. **JMS提供者选择** 在开始之前,你需要选择一个JMS提供者,例如Apache ActiveMQ、IBM WebSphere MQ或RabbitMQ。这里假设我们使用ActiveMQ,首先...

    jms示例代码

    本示例代码将帮助我们深入理解JMS的基本用法和概念。 JMS的核心组件包括生产者(Producer)、消费者(Consumer)和消息队列(Message Queue)。生产者创建并发送消息,消费者接收并处理这些消息,而消息队列则作为...

    SpringJMS示例代码

    在本文中,我们将深入探讨SpringJMS的基本概念、如何与ActiveMQ集成,以及如何通过示例代码理解其工作原理。 1. **SpringJMS简介** SpringJMS是Spring框架对JMS API的包装,它简化了生产者和消费者之间的消息通信...

    jms代码

    从给定的代码片段来看,主要涉及到JMS消息驱动Bean(MDB)的实现,这在Java EE环境中是处理消息队列的一种常见方式。 ### JMS与消息驱动Bean JMS是一种Java平台中的消息中间件规范,允许分布式系统中的组件通过...

    javax.jms.jar包与JMS实例代码

    总结起来,`javax.jms.jar` 包提供了Java开发人员与JMS兼容的消息中间件进行通信的工具,而`demo` 文件中的实例代码展示了如何在实际应用中使用这些工具。通过学习和实践这些示例,你可以更好地理解和掌握Java消息...

    基于Java通讯开发jms源代码 (jms通讯开发源码)

    基于Java通讯开发jms源代码 (jms通讯开发源码) java,net,socket,通讯开发,jms /* * @(#)Message.java 1.60 02/04/09 * * Copyright 1997-2002 Sun Microsystems, Inc. All Rights Reserved. * * SUN ...

    JMS规范培训教程、JMS源代码

    JMS教程和源代码的学习对于理解和实践这种强大的中间件技术至关重要。 **JMS规范培训教程** 《JMS规范培训教程》可能是包含以下几个核心知识点的文档: 1. **JMS概念**:解释了消息队列、消息生产者、消息消费者...

    flex用到JMS代码下载

    在“flex用到JMS代码下载”这个主题中,我们讨论的是如何在Flex应用中集成JMS来实现分布式通信。以下是一些关键知识点: 1. **Flex与JMS的结合**: Flex作为客户端技术,通过AMF(Action Message Format)或HTTP等...

    spring-jms 源代码包

    spring-jmsspring-jmsspring-jmsspring-jmsspring-jmsspring-jms

    JMS代码示例及配置相关资料

    在给出的博文链接中,可能包含了如何配置和使用JMS的示例代码,可能涵盖了上述概念的实践应用,对于理解JMS的工作原理和使用方法非常有帮助。如果你对JMS感兴趣,可以进一步阅读该博客以获取更详细的信息。由于没有...

    jms-1.1接口定义代码

    在JMS 1.1中,`jms-1.1`可能包含了这些接口的定义,如`javax.jms.Queue`, `javax.jms.Topic`, `javax.jms.MessageProducer`, `javax.jms.MessageConsumer`, `javax.jms.Session`等。通过这些接口,开发者可以构建...

    JMS简单示例1

    在实际开发中,开发者会使用JMS API或者第三方库(如Spring JMS)来简化上述步骤,提高代码的可读性和可维护性。通过学习和理解JMS的基础知识,我们可以构建出稳定、可靠的分布式系统,实现不同服务间的解耦和异步...

    JMS ActiveMQ演示代码

    总之,这个"JMS ActiveMQ演示代码"提供了学习和实践JMS与ActiveMQ集成的起点,通过分析和运行这个示例,你可以深入理解消息中间件在分布式系统中的作用,以及如何利用JMS和ActiveMQ实现高效、可靠的异步通信。

    WebLogic 11g JMS图文配置 和 详细的示例代码

    5. **部署示例代码**:Eclipse示例代码工厂通常包含发送和接收消息的客户端代码,这些代码展示了如何使用JMS API与WebLogic中的队列和主题进行交互。 在压缩包中,你可能会找到以下文件: 1. **配置截图**:这些...

    Jms做的一些的demo

    在你提到的"Jms做的一些的demo"中,我们可以推测这可能包含了一些使用ActiveMQ实现JMS功能的示例代码。在Maven项目结构下,通常会在`test`目录下存放单元测试或集成测试代码,这些测试代码可能演示了如何使用JMS API...

    JMS消息服务代码(java message service)

    Java Message Service(JMS)是Java平台中用于创建、发送、接收和读取消息的应用程序接口。它提供了一种标准的方式来解耦...在实践中,理解并熟练运用JMS消息服务代码,能够有效提升Java企业级应用的开发效率和质量。

    JMS消息传递信息 简单代码

    下面我们将深入探讨JMS的一些核心概念和API: 1. **消息**:JMS消息是一个数据结构,包含了要传递的信息以及元数据,如消息类型、优先级和时间戳。 2. **消息生产者(Message Producer)**:创建并发送消息到JMS...

    jms中间件设计源代码下载.zip

    在本压缩包文件中,我们主要关注的是JMS中间件的设计源代码以及与WebLogic服务器相关的JMS配置。WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持JMS服务,可以用于构建可伸缩、高可用性的分布式...

    JMS的Oreilly示例代码

    "JMS的Oreilly示例代码"是源自《Java消息服务》这本书的实践代码,对于初学者来说是一个很好的资源,可以帮助理解并掌握JMS的核心概念和用法。 1. **JMS基本概念** - **消息**:在JMS中,消息是数据的载体,可以...

    java 的Jms开源项目的源代码

    以下是一些关于Java JMS和开源项目可能涉及的关键知识点: 1. **消息模型**:JMS支持两种消息模型,即点对点(Queue)和发布/订阅(Topic)。点对点模型中,消息由一个生产者发送到一个队列,然后由一个消费者接收...

Global site tag (gtag.js) - Google Analytics