使用JMS发布订阅topic,传送TextMessage

本文介绍了如何使用ActiveMQ进行JMS Topic的TextMessage发布订阅。首先,从官网下载并运行ActiveMQ服务,然后创建Java项目,导入相关依赖。接着,编写publisher.java和subscriber.java,配置JNDI,实现消息发布与接收。消息具有持久性,即使ActiveMQ重启,subscriber也能接收到之前发布的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用的是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在下一篇文章中给出


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值