JMS入门(一)从简单示例开始

 一、准备环境

本文假设你还不知道什么是JMS,我们准备今天只完成一个简单示例以获取点感性认识,首先需要一个 ActiveMQ,可以在这里找到:
http://mirror.bit.edu.cn/apache/activemq/apache-activemq/5.7.0/apache-activemq-5.7.0-bin.zip
如果链接不可用,可尝试其他地址:
http://www.apache.org/dyn/closer.cgi?path=/activemq/apache-activemq/5.7.0/apache-activemq-5.7.0-bin.zip
我把它解压后丢在了E盘根目录下 ,然后运行 E:\apache-activemq-5.7.0\bin\activemq.bat 文件。
在此之前 可能有必要将 ActiveMQ 内存、磁盘、和临时存储空间的限制改小一些,如果环境不满足这个配置,那么启动时会收到错误提示。
将E:\apache-activemq-5.7.0\conf\activemq.xml 中如下limit值修改得恰当些即可
 <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="64 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="100 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="50 gb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>
OK,所有的环境都已经准备好了

二、示例预览

这是模拟三个用户聊天的一个示例,每个用户都将消息发送到JMS服务器,其他所有客户端都可以接收到消息:

这是来自《Java消息服务》的代码,这个示例只有这一个类

package ch02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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.InitialContext;

public class Chat implements MessageListener{

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

	public Chat(String topicFactory, String topicName, String username)
			throws Exception {

		InitialContext ctx = new InitialContext();

		// 查找一个JMS连接工厂并创建连接
		TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx
				.lookup(topicFactory);
		// TopicConnection表示和消息服务器的一个连接
		TopicConnection connection = conFactory.createTopicConnection();

		// 创建两个个JMS会话对象
		// 第一个参数:Session是不是事务性的;第二个参数:JMS客户端使用的确认模式
		TopicSession pubSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);
		TopicSession subSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);

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

		// 这两个对象专属于创建他们的TopicSession
		TopicPublisher publisher = pubSession.createPublisher(chatTopic);
		TopicSubscriber subscriber = subSession.createSubscriber(chatTopic,
				null, true);

		// JMS发布/订阅模型使用Java事件模型,以便TopicSubscriber通知它在同一过程中的MessageListener对象:一条来自消息服务器的消息已经到达
		subscriber.setMessageListener((MessageListener) this);

		this.connection = connection;
		this.pubSession = pubSession;
		this.publisher = publisher;
		this.username = username;

		connection.start();

		System.out.println("start");

	}

	/**
	 * 接收来自TopicSubscriber的消息
	 * 
	 * @param message
	 */
	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage) message;
			System.out.println(textMessage.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	public void writeMessage(String text) throws JMSException {
		TextMessage message = pubSession.createTextMessage();
		message.setText(username + ":" + text);
		publisher.publish(message);
	}

	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");
			}

			Chat chat = new Chat(args[0], args[1], args[2]);

			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 (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
它还带有一个配置文件

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
关于代码及这些配置 打算在下一篇再解释 因为我现在还没准备好 ( ̄﹏ ̄). z Z好懒

三、运行示例

为了方便编译,我为你准备了build.xml ,在主目录下运行 ant 即可
编译好后,打开一个cmd窗口,进入主目录(就是 build.xml 所在目录)运行:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Cameron
最后一个参数为 Cameron ,是个用户名,可以随便取,老卡刚好来华,就叫 Cameron 好了
光有老卡还不行,我们再添加两个中国网友,就叫 Obama 和 Times,分别再打开两个cmd窗口,运行:
JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Obama
JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Times
下面我们帮首相发一条微博:"Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon"
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Cameron
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start
Times:
Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon

这时 Obama 问首相先生了:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Obama
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start
Times:
Cameron:Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon
大英博物馆的中国文物什么时候还?

网友 Times 也留言了:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Times
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start


Cameron:Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon
Obama:大英博物馆的中国文物什么时候还?
请问转发微博抽奖送英国国籍的活动什么时候开始啊?

微博嘛,所以老卡肯定能看到这些留言了,看看老卡的窗口:
...JMS>java -classpath lib\activemq-all-5.7.0.jar;build\classes ch02.Chat TopicCF topic1 Cameron
log4j:WARN No appenders could be found for logger (org.apache.activemq.transport.WireFormatNegotiator).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
start


Times:
Hello my friends in China. I’m pleased to have joined Weibo and look forward to visiting China very soon
Obama:大英博物馆的中国文物什么时候还?
Times:请问转发微博抽奖送英国国籍的活动什么时候开始啊?

好 就是这个样子,你完全可以当它是个聊天室。 

我希望我的示例看上去就是可用的,所以附个图:



  • 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、付费专栏及课程。

余额充值