JMS实现简单的聊天程序

  实现这个简单的聊天程序,使用了JMS的开源实现activemq-5.5消息中间件。分为如下几步完成。

 

  第一步:安装activemq

  (1)下载解压到E:\open_source\activeMQ\apache-activemq-5.5.0,并在环境变量配置ACTIVEMQ_HOME

  (2)因为apache-activemq-5.5.0需要使用slf4j-1.5.11版本的jar包,下载slf4j

 

  第二步:编写相应的代码,如下:

  package ch02.chat;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Properties;

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.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;


public class Chat implements MessageListener {

	private TopicSession pubSession;
	private TopicPublisher publisher;
	private TopicConnection connection;
	private String username;

	// 用于初始化chat的构造函数
	public Chat(String topicFactory, String topicName, String username)
			throws Exception {
//		Properties env=new Properties();
//		env.put(Context.SECURITY_PRINCIPAL, "system");
//		env.put(Context.SECURITY_CREDENTIALS, "manager");
//		env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
//		env.put(Context.PROVIDER_URL, "tcp://localhost:61616");
		
		// 使用jndi.properties文件获得一个JNDI连接
		InitialContext ctx = new InitialContext();

		// 查找一个jms连接工厂并创建连接
		TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx
				.lookup(topicFactory);
		TopicConnection connection = conFactory.createTopicConnection();

		// 创建两个JMS会话对象
		TopicSession pubSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);
		TopicSession subSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);

		// 查找一个JMS主题
		Topic chatTopic = (Topic) ctx.lookup(topicName);

		// 创建一个JMS发布者和订阅者,createSubscriber中附加的参数是一个消息
		// 选择器(null)和noLocal标记的一个真值,它表明这个发布者生产的消息不应被他自己所消费
		TopicPublisher publisher = pubSession.createPublisher(chatTopic);
		TopicSubscriber subscriber = subSession.createSubscriber(chatTopic,
				null, true);

		// 设置一个JMS消息侦听器
		subscriber.setMessageListener(this);

		// 初始化Chat应用程序变量
		this.connection = connection;
		this.pubSession = pubSession;
		this.publisher = publisher;
		this.username = username;

		// 启动JMS连接,允许传递消息
		connection.start();
	}

	// 接受来自TopicSubscriber的消息
	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage) message;
			System.out.println(textMessage.getText());

		} catch (JMSException jmse) {
			jmse.printStackTrace();
		}
	}

	// 使用发布者创建并发送消息
	protected void writeMessage(String text) throws JMSException {
		TextMessage message = pubSession.createTextMessage();
		message.setText(username + " : " + text);
		publisher.publish(message);
	}

	// 关闭JMS连接
	public void close() throws JMSException {
		connection.close();
	}

	// 运行聊天客户端
	public static void main(String[] args) {
		try {
			if (args.length != 3) {
				System.out.println("Factory.Topic.or username missing");
			}
			String topicFactory="TopicCF";
			String topicName="topic1";
			String username="lyb";
			Chat chat = new Chat(topicFactory, topicName, username);

			// 从命令行读取
			BufferedReader commandLine = new BufferedReader(
					new InputStreamReader(System.in));

			// 循环
			while (true) {
				String s = commandLine.readLine();
				if (s.equalsIgnoreCase("exit")) {
					chat.close();
					System.exit(0);
				} else {
					chat.writeMessage(s);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		;
	}

}


     将以上的类复制一份,放在同一个包下面。一份代码作为消息的发布方,一份代码作为消息的订阅方。

     整个程序的工程结构组织见下图

 

    

    二

 

  第三步、配置jndi文件

 

  java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory

  java.naming.provider.url=tcp://localhost\:61616

  java.naming.security.principal=system

  java.naming.security.credentials=manager

  connectionFactoryNames=TopicCF

  topic.topic1=jms.topic1

 

 第四步、启动activeMQ,分别运行Chat.java和CopyChat.java,可以在两个程序之间交互信息

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单JMS 示例: 1. 首先,我们需要定义一个 JMS 连接工厂,用于创建 JMS 连接: ```java @Configuration public class JmsConfig { @Bean public ConnectionFactory connectionFactory() { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); factory.setBrokerURL("tcp://localhost:61616"); return factory; } } ``` 2. 接着,我们需要定义一个消息队列,用于存储消息: ```java @Configuration public class JmsConfig { @Bean public ConnectionFactory connectionFactory() { // ... } @Bean public Queue queue() { return new ActiveMQQueue("test.queue"); } } ``` 3. 然后,我们可以使用 JmsMessagingTemplate 发送消息: ```java @RestController public class MessageController { private final JmsMessagingTemplate jmsMessagingTemplate; private final Queue queue; public MessageController(JmsMessagingTemplate jmsMessagingTemplate, Queue queue) { this.jmsMessagingTemplate = jmsMessagingTemplate; this.queue = queue; } @PostMapping("/send") public String sendMessage(@RequestParam String message) { jmsMessagingTemplate.convertAndSend(queue, message); return "Message sent successfully!"; } } ``` 在上面的示例中,我们使用 JmsMessagingTemplate 发送消息到名为 "test.queue" 的消息队列中。通过 JmsMessagingTemplate 发送消息时,可以指定目的地和消息内容,这里我们直接将消息内容作为参数传入了 convertAndSend 方法中。而且,JmsMessagingTemplate 还提供了许多其他的方法,如异步发送消息、发送消息时指定消息头等等,可以根据具体需求选择使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值