activeMQ
1.ActiveMQ的消息形式
对于消息的传递有两种类型:
一种是点对点的,即一个生产者和一个消费者一一对应;
另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
· StreamMessage -- Java原始值的数据流
· MapMessage--一套名称-值对
· TextMessage--一个字符串对象
· ObjectMessage--一个序列化的 Java对象
· BytesMessage--一个字节的数据流
- 点对点(point-to-point,简称PTP)Queue消息传递模型:
- 发布/订阅(publish/subscribe,简称pub/sub)Topic消息传递模型:
2. ActiveMQ的使用方法
依据消息的传递有两种模型,所以它的使用也是按照点对点(ptp)和发布/订阅(topic)来进行的。
<!-- ActiveMQ客户端 依赖的jar--> <!-- 如果ActiveMQ整合spring使用不要使用activemq-all-5.12.0.jar包。建议使用5.11.2 --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> </dependency>
2.1. Queue(PTP)
@Test public void testQueueProducer() throws JMSException{ //第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.129:61616"); //第二步:使用ConnectionFactory对象创建一个Connection对象。 Connection connection = connectionFactory.createConnection(); //第三步:开启连接,调用Connection对象的start方法。 connection.start(); //第四步:使用Connection对象创建一个Session对象。 //第一个参数:是否开启事务。true:开启事务,第二个参数忽略。 //第二个参数:当第一个参数为false时,才有意义。消息的应答模式。1、自动应答2、手动应答。一般是自动应答。 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Queue对象。 //参数:队列的名称。 Queue queue = session.createQueue("test-queue"); //第六步:使用Session对象创建一个Producer对象。 MessageProducer producer = session.createProducer(queue); //第七步:创建一个Message对象,创建一个TextMessage对象。 /*TextMessage message = new ActiveMQTextMessage(); message.setText("hello activeMq,this is my first test.");*/ TextMessage message = session.createTextMessage("hello activeMq,this is my first test."); //第八步:使用Producer对象发送消息。 producer.send(message); //第九步:关闭资源。 producer.close(); session.close(); connection.close(); } @Test public void testQueueConsumer() throws JMSException, IOException{ //消费者:接收消息。 //第一步:创建一个ConnectionFactory对象。 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.129:61616"); //第二步:从ConnectionFactory对象中获得一个Connection对象。 Connection connection = connectionFactory.createConnection(); //第三步:开启连接。调用Connection对象的start方法。 connection.start(); //第四步:使用Connection对象创建一个Session对象。 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。 Queue queue = session.createQueue("test-queue"); //第六步:使用Session对象创建一个Consumer对象 MessageConsumer consumer = session.createConsumer(queue); //第七步:接收消息。 consumer.setMessageListener(new MessageListener(){ @Override public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; String text = null; // 取消息的内容 text = textMessage.getText(); // 第八步:打印消息。 System.out.println(text); } catch (JMSException e) { e.printStackTrace(); } } }); System.out.println("topic的消费端03。。。。。"); // 等待键盘输入 System.in.read(); //第九步:关闭资源 consumer.close(); session.close(); connection.close(); }
2.2Topic
/** * Topic * @throws JMSException */ @Test public void testTopicProducer() throws JMSException{ //第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.129:61616"); //第二步:使用ConnectionFactory对象创建一个Connection对象 Connection connection = connectionFactory.createConnection(); //第三步:开启连接,调用Connection对象的start方法 connection.start(); //第四步:使用Connection对象创建一个Session对象 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Topic对象 Topic topic = session.createTopic("test-topic"); //第六步:使用Session对象创建一个Producer对象。 MessageProducer producer = session.createProducer(topic); //第七步:创建一个Message对象,创建一个TextMessage对象。 TextMessage message = session.createTextMessage("hello activeMq,this is my topic test"); //第八步:使用Producer对象发送消息。 producer.send(message); //第九步:关闭资源 producer.close(); session.close(); connection.close(); } @Test public void testTopicConsumer() throws JMSException, IOException{ ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.129:61616"); Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("test-topic"); MessageConsumer consumer = session.createConsumer(topic); //接收消息 consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; String text = null; // 取消息的内容 text = textMessage.getText(); // 第八步:打印消息。 System.out.println(text); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); System.out.println("topic的消费端03。。。。。"); // 等待键盘输入 System.in.read(); // 第九步:关闭资源 consumer.close(); session.close(); connection.close(); }
3. Activemq整合spring
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,
或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
第一步:引用相关的jar包。(activeMQ默认已经添加)
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency>
因为追求卓越,成功在不经意间追上了你