使用的是eclipse4.5.2+apache-activemq-5.13.3-bin.zip(笔者建项目时这二者都是官网最新版的)
简述:
1.官网下载安装activeMQ
2.建立java Project,导入相关jar
3.写publisher.java 和subscriber.java
4.配置jndi,写jndi.properties或者直接在publisher.java和subscriber.java中写
详述:
1.安装及运行activeMQ
去官方网站下载:http://activemq.apache.org/
解压缩apache-activemq-5.13.3-bin.zip,然后双击apache-activemq-5.13.3\bin\activemq.bat运行ActiveMQ程序,来启动服务
这个服务会打开服务端口 tcp://localhost/127.0.0.1:61616 (若有报错或警告,双击apache-activemq-5.13.3\bin\win64\activemq.bat,根据自己的电脑位数选择)
启动ActiveMQ以后,登陆:http://localhost:8161/admin/,初始用户名和密码都是admin
注意以后运行自己的publisher.java和subscriber之前都要打开activeMQ服务。
2.建立java Project,导入相关jar
在工程下新建lib文件,导入以下栈包,然后在buildpath里引入这些jar
3.写publisher.java 和subscriber.java
直接上代码,第一次写的小测试,可能有些声明或方法不合乎规范
这是发布者的代码
<span style="font-size:18px;"><span style="font-size:18px;">import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class TextPublisher {
public static void main(String[] args) throws JMSException, NamingException {
/*相当于jndi.properties的作用
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
p.put(Context.PROVIDER_URL, "tcp://localhost:61616");
p.put(Context.SECURITY_PRINCIPAL, "system");
p.put(Context.SECURITY_CREDENTIALS, "manager");
p.put("connectionFactoryNames", "MyTopicConnectionFactory");
p.put("topic.WeatherData", "jms.WeatherData"); */
try {
//通过JNDI创建ConnectionFactory 和 Destination对象(Topic 或Queue)
Context jndiContext = new InitialContext();
TopicConnectionFactory factory =(TopicConnectionFactory) jndiContext.lookup("topicConnectionFactry");
Topic textTopic =(Topic) jndiContext.lookup("text");
//创建一个Session 供发送或接收消息
TopicConnection topicConnection =factory.createTopicConnection();
topicConnection.setClientID("1");
//创建一个Session 供发送或接收消息
TopicSession session =topicConnection.createTopicSession (false,Session.CLIENT_ACKNOWLEDGE);
//创建一个MessageProducer (TopicPublisher 或QueueSender)
TopicPublisher publisher =session.createPublisher(textTopic);
topicConnection.start();
TextMessage message =session.createTextMessage();
//发送文本
message.setText("text:35 degrees");
System.out.println("sent: " + message.getText());
publisher.publish(message);
//此处是使用持久化的方式,持久化的方式需要设置ClientID
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
session.close();
topicConnection.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
</span></span>
这是订阅者的代码
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:14px;">import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class TextSubscriber {
public static void main(String[] args) throws JMSException, NamingException {
try {
Context jndiContext = new InitialContext();
TopicConnectionFactory factory =(TopicConnectionFactory) jndiContext.lookup("topicConnectionFactry");
Topic textTopic =(Topic) jndiContext.lookup("text");
TopicConnection topicConnection =factory.createTopicConnection();
//若用到持久化,需要设置ClientID
topicConnection.setClientID("1");
TopicSession session =topicConnection.createTopicSession (false,Session.CLIENT_ACKNOWLEDGE);
TopicSubscriber subscriber = session.createDurableSubscriber(textTopic,"11");
//WeatherListener myListener= new WeatherListener();
subscriber.setMessageListener(new MessageListener(){
public void onMessage(Message msg){
try
{
TextMessage textMsg = (TextMessage) msg;
System.out.println("DurableSubscriber get:" + textMsg.getText());
} catch (JMSException e)
{
e.printStackTrace();
}
}
});
topicConnection.start();
/*session.close();
topicConnection.close(); */
}catch(Exception e){
e.printStackTrace();
}
}
} </span></span></span>
关于持久化:
<span style="font-size:14px;"><span style="font-size:18px;"><span style="font-size: 14px;">//当使用DurableSubscription时,必须在建立connection时设置Client。对于每一个生产者和消费者来说,其ClientID必须唯一</span></span></span>
4.配置jndi,写jndi.properties或者直接在publisher.java和subscriber.java中写
jndi.properties务必要直接放在src下
<span style="font-size:18px;"><span style="font-size:18px;">## ---------------------------------------------------------------------------
## Licensed to the Apache Software Foundation (ASF) under one or more
## contributor license agreements. See the NOTICE file distributed with
## this work for additional information regarding copyright ownership.
## The ASF licenses this file to You under the Apache License, Version 2.0
## (the "License"); you may not use this file except in compliance with
## the License. You may obtain a copy of the License at
##
## http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
## ---------------------------------------------------------------------------
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
connectionFactoryNames = topicConnectionFactry
java.naming.security.principal=system
java.naming.security.credentials=manage
topic.obj = jms.obj
topic.text = jms.text</span></span>
5.运行结果
先启动activeMQ服务,再运行publisher.java,然后运行subscriber.java
因为我发布了五次,所以收到五条消息
由于消息是持久的,同一个ClientID发布的消息,activeMQ重启后subscriber都会接收到
补充:JMS+activeMQ的知识在前一篇文章中给出
JMS+jndi,使用topic、持久化的方式传递ObjectMessage在下一篇文章中给出