什么是JMS?
jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Java消息服务有两种消息模式,点对点(PTP)和发布者/订阅者(pub/sub)。
JMS主要接口如下 :
JMS Parent | PTP | Pub/Sub |
ConnectionFactory | QueueConnectionFactory | TopicConnectionFactory |
Connection | QueueConnection | TopicConnection |
Destination | Queue | Topic |
Session | QueueSession | TopicSession |
MessageProducer | QueueSender | TopicPublisher |
MessageConsumer | QueueReceiver | TopicSubscriber |
以下是对这些接口的简单描述 :
ConnectionFactory :连接工厂,JMS 用它创建连接
Connection :JMS 客户端到JMS Provider 的连接
Destination :消息的目的地
Session: 一个发送或接收消息的线程
MessageProducer: 由Session 对象创建的用来发送消息的对象
MessageConsumer: 由Session 对象创建的用来接收消息的对象
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性 。
1) StreamMessage -- Java原始值的数据流
2) MapMessage--一套名称-值对
3) TextMessage--一个字符串对象
4) ObjectMessage--一个序列化的 Java对象
5) BytesMessage--一个未解释字节的数据流
消息确认模式
非事务性会话中,应用程序创建的会话有5 种确认模式,而在事务性会话中,确认模式被忽略。
五种确认模式说明:
♣ AUTO_ACKNOWLEDGE:自动确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收。
♣ CLIENT_ACKNOWLEDGE:客户端确认模式。会话对象依赖于应用程序对被接收的消息调用一个acknowledge()方法。一旦这个方法被调用,会话会确认最后一次确认之后所有接收到的消息。这种模式允许应用程序以一个调用来接收,处理并确认一批消息。注意:在管理控制台中,如果连接工厂的Acknowledge Policy(确认方针)属性被设置为"Previous"(提前),但是你希望为一个给定的会话确认所有接收到的消息,那么就用最后一条消息来调用acknowledge()方法。
♣ DUPS_OK_ACKNOWLEDGE:允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。注意:如果你的应用程序无法处理重复的消息的话,你应该避免使用这种模式。如果发送消息的初始化尝试失败,那么重复的消息可以被重新发送。
♣ NO_ACKNOWLEDGE:不确认模式。不确认收到的消息是需要的。消息发送给一个
NO_ACKNOWLEDGE 会话后,它们会被WebLogic 服务器立即删除。在这种模式下,将无法重新获得已接收的消息,而且可能导致下面的结果:1. 消息可能丢失;和(或者)另一种情况:2. 如果发送消息的初始化尝试失败,会出现重复消息被发送的情况。
♣ MULTICAST_NO_ACKNOWLEDGE:IP组播下的不确认模式,同样无需确认。发送给一个MULTICAST_NO_ACKNOWLEDGE会话的消息, 会共享之前所述的NO_ACKNOWLEDGE 确认模式一样的特征。这种模式支持希望通过IP 组播方式进行消息通信的应用程序,而且无需依赖会话确认提供的服务质量。注意:如果你的应用程序无法处理消息的丢失或者重复,那么你应该避免使用这种模式。如果发送消息的初始化尝试失败的话,重复的消息可能会被再次发送。
其他有关于JMS的知识自己就百度好了 。下面我们来写一个例子:
准备工作:
先去 http://activemq.apache.org/download.html 下载最新版本的ActiveMQ 5.8.0 Release并解压。
在系统环境变量里面配置ACTVIEMQ_HOME和PATH。
打开cmd 输入activemq启动。
在浏览器输入http://localhost:8161/admin 看到如下界面:
ps:账号和密码是admin,admin 你也可以自己创建账号和密码,配置文件在conf/jetty-realm.properties
用户名和密码的格式是:
用户名 : 密码 ,角色名
服务端代码:
1.先创建一个接口
package com.jynine; public interface UserService { void getUserName(String name); }
2.创建一个类,实现上面的接口
package com.jynine; public class UserServiceImpl implements UserService { public void getUserName(String name) { System.out.println("用户名称:"+name); } }
3.配置server.xml:
4 编写main方法
package com.jynine; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Server { public static void main(String[] args) throws Exception { new ClassPathXmlApplicationContext(new String[]{"com/jynine/server.xml"}); } }
客户端代码:
1.先创建一个接口
package com.jynine; public interface UserService { void getUserName(String name); }
2.配置client.xml:
3 编写main方法:
package com.jynine; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client { public static void main(String[] args) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext( new String[] {"com/jynine/client.xml"}); UserService service = (UserService)ctx.getBean("userService"); service.getUserName("Test"); } }
这样一个简单的通信都完成了 。
其他配置如JMS连接池:
tcp://localhost:61616
JNDI等等配置JMS可以自行研究。
如需例子,请留邮箱 。因为例子写在公司电脑里面的~~~O(∩_∩)O~