- 浏览: 830134 次
- 性别:
- 来自: 北京、四川
文章分类
最新评论
-
sunbeamzheng:
总结的很好,好好看看。 拷贝问题确实很需要注意,特别是影不影响 ...
java深拷贝与浅拷贝 -
xmh8023:
...
获取POST数据的值 -
xmh8023:
我访问别的服务器怎么办?急求
获取POST数据的值 -
xmh8023:
String urlString="http://l ...
获取POST数据的值 -
lv12312:
Tomcat 7的老版本么?有bug的,https://iss ...
JMX问题
通过这里的例子,可以把消息进行分组,然后进行分组的方式进行发送出去,即相当于不同级别的用户可以收取到不同的消息
现在对于消息的基于推的方式还没有想明白,即服务器向客户端推送消息还不是太明白
监听的方式是可以实现,但这是必须先运行接收端
在发送端代码可以使用 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;
剩下的工作就只剩下接收和发送的jsp页面了,页面里仅仅只是调用上面的两个类中的方法而已。
第二个例子是基于队列的有选择器应用的,还传递对象的例子,
发送消息:
接收消息:
现在对于消息的基于推的方式还没有想明白,即服务器向客户端推送消息还不是太明白
监听的方式是可以实现,但这是必须先运行接收端
在发送端代码可以使用 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并发编程:volatile关键字解析
2015-07-30 11:30 637转:http://www.cnblogs.com/dolp ... -
Java内存模型
2015-07-29 13:55 9161. 概述 多任务和 ... -
自定义classloader
2015-07-29 13:54 692转:http://tiantian911.iteye.com ... -
自定义ClassLoader实现java应用核心逻辑模块热部署
2015-07-29 13:51 1023转:http://blog.csdn.net/zhangda ... -
java classloader原理初探
2015-07-29 10:14 669转:http://www.cnblogs.com/ ... -
Java 内存分配全面浅析
2015-07-29 08:52 609转:http://blog.csdn.net/shimi ... -
http stream
2014-07-29 16:38 1145StringBuilder sb = new String ... -
Tomcat远程调试
2011-04-09 12:33 1062需要在Tomcat中的catalina.bat中添加如下的一行 ... -
用jmx监控多台服务器(tomcat)
2010-09-08 18:25 4577因为需要写一个后台监控服务器的程序,涉及到jmx,也涉 ... -
call cmd /c start 一点疑问
2010-09-01 10:16 2250call "cmd /c start aaa.bat ... -
Windows计划任务之schtasks
2010-08-30 13:21 3596创建:SCHTASKS /Create /RU SYSTEM ... -
ajax返回值中有中文存在的乱码现象
2010-08-27 16:28 1447ajax返回值中有中文存在的乱码现象,解决就加入下面一行代码即 ... -
MIME TYPE
2010-08-26 16:23 7262最近要做需要在页面上放音频的东西,因此需要用到mime typ ... -
JMX问题
2010-08-20 17:20 5507这个问题貌似是启动tomcat之后就获取不到jmx的链接了,不 ... -
Eclipse控制台乱码
2010-08-05 15:18 4894安装了Eclipse,在运行tomcat时,控制台的中文显示乱 ... -
JMX服务端和客户端的代码
2010-07-27 15:37 3575服务端代码如下 package com.rmi; i ... -
JMX连接Tomcat的JMX测试类
2010-07-27 15:33 3301首先是为了使tomcat支持JMX,必须在tomcat的启动项 ... -
JMX的一个链接类
2010-07-27 09:37 1465package com.pachira.oamp.jmxS ... -
java中文转unicode码
2010-07-22 11:04 43412转载地址:http://www.iteye.com/topic ... -
获取POST数据的值
2010-07-21 14:17 9925当method为POST,Content-Type为 ...
相关推荐
下面我们将通过一个简单的Java JMS代码示例来理解其基本用法: 1. **JMS提供者选择** 在开始之前,你需要选择一个JMS提供者,例如Apache ActiveMQ、IBM WebSphere MQ或RabbitMQ。这里假设我们使用ActiveMQ,首先...
本示例代码将帮助我们深入理解JMS的基本用法和概念。 JMS的核心组件包括生产者(Producer)、消费者(Consumer)和消息队列(Message Queue)。生产者创建并发送消息,消费者接收并处理这些消息,而消息队列则作为...
在本文中,我们将深入探讨SpringJMS的基本概念、如何与ActiveMQ集成,以及如何通过示例代码理解其工作原理。 1. **SpringJMS简介** SpringJMS是Spring框架对JMS API的包装,它简化了生产者和消费者之间的消息通信...
从给定的代码片段来看,主要涉及到JMS消息驱动Bean(MDB)的实现,这在Java EE环境中是处理消息队列的一种常见方式。 ### JMS与消息驱动Bean JMS是一种Java平台中的消息中间件规范,允许分布式系统中的组件通过...
总结起来,`javax.jms.jar` 包提供了Java开发人员与JMS兼容的消息中间件进行通信的工具,而`demo` 文件中的实例代码展示了如何在实际应用中使用这些工具。通过学习和实践这些示例,你可以更好地理解和掌握Java消息...
基于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规范培训教程》可能是包含以下几个核心知识点的文档: 1. **JMS概念**:解释了消息队列、消息生产者、消息消费者...
在“flex用到JMS代码下载”这个主题中,我们讨论的是如何在Flex应用中集成JMS来实现分布式通信。以下是一些关键知识点: 1. **Flex与JMS的结合**: Flex作为客户端技术,通过AMF(Action Message Format)或HTTP等...
spring-jmsspring-jmsspring-jmsspring-jmsspring-jmsspring-jms
在给出的博文链接中,可能包含了如何配置和使用JMS的示例代码,可能涵盖了上述概念的实践应用,对于理解JMS的工作原理和使用方法非常有帮助。如果你对JMS感兴趣,可以进一步阅读该博客以获取更详细的信息。由于没有...
在JMS 1.1中,`jms-1.1`可能包含了这些接口的定义,如`javax.jms.Queue`, `javax.jms.Topic`, `javax.jms.MessageProducer`, `javax.jms.MessageConsumer`, `javax.jms.Session`等。通过这些接口,开发者可以构建...
在实际开发中,开发者会使用JMS API或者第三方库(如Spring JMS)来简化上述步骤,提高代码的可读性和可维护性。通过学习和理解JMS的基础知识,我们可以构建出稳定、可靠的分布式系统,实现不同服务间的解耦和异步...
总之,这个"JMS ActiveMQ演示代码"提供了学习和实践JMS与ActiveMQ集成的起点,通过分析和运行这个示例,你可以深入理解消息中间件在分布式系统中的作用,以及如何利用JMS和ActiveMQ实现高效、可靠的异步通信。
5. **部署示例代码**:Eclipse示例代码工厂通常包含发送和接收消息的客户端代码,这些代码展示了如何使用JMS API与WebLogic中的队列和主题进行交互。 在压缩包中,你可能会找到以下文件: 1. **配置截图**:这些...
在你提到的"Jms做的一些的demo"中,我们可以推测这可能包含了一些使用ActiveMQ实现JMS功能的示例代码。在Maven项目结构下,通常会在`test`目录下存放单元测试或集成测试代码,这些测试代码可能演示了如何使用JMS API...
Java Message Service(JMS)是Java平台中用于创建、发送、接收和读取消息的应用程序接口。它提供了一种标准的方式来解耦...在实践中,理解并熟练运用JMS消息服务代码,能够有效提升Java企业级应用的开发效率和质量。
下面我们将深入探讨JMS的一些核心概念和API: 1. **消息**:JMS消息是一个数据结构,包含了要传递的信息以及元数据,如消息类型、优先级和时间戳。 2. **消息生产者(Message Producer)**:创建并发送消息到JMS...
在本压缩包文件中,我们主要关注的是JMS中间件的设计源代码以及与WebLogic服务器相关的JMS配置。WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持JMS服务,可以用于构建可伸缩、高可用性的分布式...
"JMS的Oreilly示例代码"是源自《Java消息服务》这本书的实践代码,对于初学者来说是一个很好的资源,可以帮助理解并掌握JMS的核心概念和用法。 1. **JMS基本概念** - **消息**:在JMS中,消息是数据的载体,可以...
以下是一些关于Java JMS和开源项目可能涉及的关键知识点: 1. **消息模型**:JMS支持两种消息模型,即点对点(Queue)和发布/订阅(Topic)。点对点模型中,消息由一个生产者发送到一个队列,然后由一个消费者接收...