ActiveMQ JMS 实例

由于项目需要,我们要用JMS进行通信。于是就去网上看了一下相关的JMS。

什么是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:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean>

    <bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="myqueue"/>
    </bean>

    <bean id="userService"
          class="org.springframework.jms.remoting.JmsInvokerServiceExporter">
        <property name="serviceInterface" value="com.jynine.UserService"/>
        <property name="service">
            <bean class="com.jynine.UserServiceImpl"/>
        </property>
   </bean>

   <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
       <property name="connectionFactory" ref="connectionFactory"/>
       <property name="destination" ref="queue"/>
       <property name="concurrentConsumers" value="3"/>
       <property name="messageListener" ref="userService"/>
   </bean>
</beans>


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:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean>

    <bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="myqueue"/>
    </bean>
    <bean id="userService"
          class="org.springframework.jms.remoting.JmsInvokerProxyFactoryBean">
        <property name="serviceInterface" value="com.jynine.UserService"/>
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="queue" ref="queue"/>
    </bean>

</beans>

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连接池:
  <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
    <property name="connectionFactory">
      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL">
          <value>tcp://localhost:61616</value>
        </property>
      </bean>
    </property>
  </bean>


JNDI等等配置JMS可以自行研究。

如需例子,请留邮箱 。因为例子写在公司电脑里面的~~~O(∩_∩)O~

猜你喜欢

转载自jynine.iteye.com/blog/1876801