JAVA的activeMQ

其实我对activeMQ 一点都不了解,也没用过,而且最近的项目里也不会使用。因为之前听同学说他们正在用,就搞出来看看是什么东西。顺便玩玩。

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

首先是下载部署,常用的目录结构如下

 +bin (windows下面的bat和unix/linux下面的sh)
 +conf (activeMQ配置目录,包含最基本的activeMQ配置文件)
 +data (默认是空的)
 +docs (index,replease版本里面没有文档,-.-b不知道为啥不带)
 +example (几个例子
 +lib (activemMQ使用到的lib)
   -apache-activemq-4.1-incubator.jar (ActiveMQ的binary)
  -LICENSE.txt
  -NOTICE.txt
  -README.txt
  -user-guide.html

然后是部署项目,example里面有现成的程序,放到本地跑跑。

补充一个红薯的文档。

http://www.oschina.net/question/12_19665

关于JMS的东西我在补充些资料,下面是JMS的主要接口

ConnectionFactory 接口(连接工厂) 用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码不需要进行修改。 管理员在JNDI名字空间中配置连接工厂,这样,JMS客户才能够查找到它们。根据消息类型的不同,用户将使用队列连接工厂,或者主题连接工厂。
Connection 接口(连接) 连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。根据不同的连接类型,连接允许用户创建会话,以发送和接收队列和主题到目标。
Destination 接口(目标) 目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。JMS管理员创建这些对象,然后用户通过JNDI发现它们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布者/订阅者模型的主题。
MessageConsumer 接口(消息消费者) 由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或异步(非阻塞)接收队列和主题类型的消息。
MessageProducer 接口(消息生产者) 由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。
Message 接口(消息) 是在消费者和生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序。一个消息有三个主要部分: 消息头(必须):包含用于识别和为消息寻找路由的操作设置。 一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。 一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。 消息接口非常灵活,并提供了许多方式来定制消息的内容。
Session 接口(会话) 表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。会话的好处是它支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以使用回滚操作取消这些消息。一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。
下面是一个JMS的流程图

 

下面是一个测试的代码

public class MyActiveMqTest {

	public static void main(String[] args) {
		Receiver receiver=new Receiver();
		Sender sender =new Sender();
		try {
			sender.send();
			receiver.receive();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	static class Receiver {
		public static void receive() throws Exception {
			ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
			Connection connection = connectionFactory.createConnection();
			connection.start();
			final Session session = connection.createSession(Boolean.TRUE,
					Session.AUTO_ACKNOWLEDGE);
			Destination destination = session.createQueue("my-queue");
			MessageConsumer consumer = session.createConsumer(destination);
			/*
			 * //listener 方式 consumer.setMessageListener(new MessageListener() {
			 * 
			 * public void onMessage(Message msg) { MapMessage message =
			 * (MapMessage) msg; //TODO something.... System.out.println("收到消息:"
			 * + new Date(message.getLong("count"))); session.commit(); }
			 * 
			 * }); Thread.sleep(30000);
			 */
			int i = 0;
			while (i < 3) {
				i++;
				MapMessage message = (MapMessage) consumer.receive();
				session.commit();
				// TODO something....
				System.out
						.println("收到消息:" + new Date(message.getLong("count")));
			}

			session.close();
			connection.close();
		}
	}

	static class Sender {
		public static void send() throws Exception {
			ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

			Connection connection = connectionFactory.createConnection();
			connection.start();

			Session session = connection.createSession(Boolean.TRUE,
					Session.AUTO_ACKNOWLEDGE);
			Destination destination = session.createQueue("my-queue");

			MessageProducer producer = session.createProducer(destination);
			for (int i = 0; i < 3; i++) {
				MapMessage message = session.createMapMessage();
				message.setLong("count", new Date().getTime());
				Thread.sleep(1000);
				// 通过消息生产者发出消息
				System.out.println("发送消息"+i+new Date());
				producer.send(message);
			}
			session.commit();
			session.close();
			connection.close();
		}
	}
}

下面是打印的结果
发送消息0Fri Jun 08 19:41:45 CST 2012
发送消息1Fri Jun 08 19:41:52 CST 2012
发送消息2Fri Jun 08 19:41:55 CST 2012
收到消息:Fri Jun 08 19:41:40 CST 2012
收到消息:Fri Jun 08 19:41:50 CST 2012
收到消息:Fri Jun 08 19:41:53 CST 2012


根据红薯的列子,我还应该试下和spring的结合,搭项目的spring环境。

先贴代码:

public class MyActiveMqSpringTest {

	public static void main(String[] args) {
		Receiver receiver = new Receiver();
		Sender sender = new Sender();
		try {
			sender.send();
			receiver.receive();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	static class Receiver {
		public static void receive() throws Exception {
			ApplicationContext ctx = new FileSystemXmlApplicationContext(
					"classpath:app*.xml");
			JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");
			jmsTemplate.send(new MessageCreator() {
				public Message createMessage(Session session)
						throws JMSException {
					MapMessage mm = session.createMapMessage();
					mm.setLong("count", new Date().getTime());
					return mm;
				}

			});
		}
	}

	static class Sender {
		public static void send() throws Exception {
			ApplicationContext ctx = new FileSystemXmlApplicationContext(
					"classpath:app*.xml");
			JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");
			while (true) {
				Map<String, Object> mm = (Map<String, Object>) jmsTemplate
						.receiveAndConvert();
				System.out.println("收到消息:" + new Date((Long) mm.get("count")));
			}
		}
	}
}

下面是spring的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<!-- 在非 web / ejb 容器中使用 pool 时,要手动 stop,spring 不会为你执行 destroy-method 的方法 -->
	<!-- 
	<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
		destroy-method="stop">
		<property name="connectionFactory">
			<bean class="org.apache.activemq.ActiveMQConnectionFactory">
				<property name="brokerURL" value="tcp://localhost:61616" />
			</bean>
		</property>
	</bean>
	 -->
	<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://localhost:61616" />
	</bean>
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="jmsFactory" />
		<property name="defaultDestination" ref="destination" />
		<property name="messageConverter">
			<bean
				class="org.springframework.jms.support.converter.SimpleMessageConverter" />
		</property>
	</bean>
	<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg index="0" value="my-queue" />
	</bean>

</beans>

失败了。。没有结果输出。有时间再搞吧。

总结一下,今天主要就是熟悉了下JMS的模型,还知道有个activeMQ的东西,简单的搭建了一下环境,能跑出个helloWorld。ActiveMq和Spring结合那块没有成功,有空再搞搞。

 

 

转载于:https://my.oschina.net/zimingforever/blog/59995

<think>好的,我现在需要帮助用户了解如何在Java中集成和使用ActiveMQ。根据用户提供的引用内容,我需要先整理相关的信息,并确保回答符合系统级指令,比如正确使用LaTeX格式和引用标记。 首先,用户提供的引用中提到了几个关键点: 1. 引用[1]提到ActiveMQ提供了JMS API与Spring集成,使用Spring AMQP开发消息应用。安装ActiveMQ服务器是第一步。 2. 引用[2]提到在Karaf中安装ActiveMQ的Spring支持功能。 3. 引用[3]提到了使用STOMP over WebSockets的简单消息传递,但需要注意Jetty版本的问题。 4. 引用[4]给出了设置ClientID和创建持久订阅的API示例。 用户的需求是JavaActiveMQ的集成和使用方法,所以可能需要从基础开始,比如添加依赖、创建连接、发送和接收消息,以及可能的Spring集成。 首先,我需要确认Java中使用ActiveMQ的基本步骤。通常需要引入ActiveMQ客户端库,创建连接工厂,建立连接,创建会话,然后生产者和消费者的实现。然后,根据引用[1],如果要与Spring集成,可能需要配置Spring JMS或者使用Spring AMQP,但这里用户可能更关注原生的JMS API使用,因为引用[4]中的代码示例是原生JMS的。 接下来,需要确保回答中的代码示例正确,比如创建ConnectionFactory时使用正确的broker URL,以及正确关闭资源。同时,引用中的信息可能需要分点引用,比如在安装ActiveMQ时引用[1],在设置ClientID时引用[4]。 另外,用户提供的引用[2]是关于在Karaf中安装activemq-spring特性,这可能属于更高级的集成,可能在Spring集成部分提到,但用户的问题可能主要关注基础集成,所以这部分可能作为扩展内容。 引用[3]提到的STOMP over WebSockets可能是一个不同的协议,用户的问题是关于Java集成,所以可能暂时不涉及,除非用户特别需要,但可以作为一个相关问题提出。 需要检查是否需要提到持久订阅,如引用[4]中的createDurableSubscriber,这在消费者部分可能需要说明。 在组织回答结构时,应分步骤:安装ActiveMQ、添加依赖、创建连接、发送消息、接收消息、Spring集成、注意事项等。每个步骤中适当插入引用来源。 同时,需要生成相关问题,比如性能优化、持久化配置、集群等,根据引用中的内容,可能可以提出关于Spring集成、ClientID设置、协议选择等问题。 最后,确保所有数学表达式或变量使用$...$格式,但在这个问题中可能涉及较少数学内容,但如果有比如配置参数中的变量,可能需要使用,比如设置broker URL的格式。 现在需要将这些思考整理成结构化的回答,确保每个部分正确引用,代码示例正确,并且符合用户的要求。</think>### JavaActiveMQ集成及使用方法 #### 1. 安装ActiveMQ服务器 首先需要下载并启动Apache ActiveMQ服务器[^1]。默认访问地址为$http://localhost:8161/admin$,默认端口为$61616$(JMS协议)。 #### 2. 添加依赖 在Maven项目中添加ActiveMQ客户端依赖: ```xml <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.16.5</version> </dependency> ``` #### 3. 基础JMS连接配置 ```java // 创建连接工厂 ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 建立连接并设置ClientID Connection connection = factory.createConnection(); connection.setClientID("ProducerClient"); // 引用[4] connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ``` #### 4. 消息生产者实现 ```java // 创建队列 Destination queue = session.createQueue("TEST.QUEUE"); // 创建生产者 MessageProducer producer = session.createProducer(queue); // 发送文本消息 TextMessage message = session.createTextMessage("Hello ActiveMQ!"); producer.send(message); ``` #### 5. 消息消费者实现 ```java // 创建消费者 MessageConsumer consumer = session.createConsumer(queue); // 设置消息监听器 consumer.setMessageListener(msg -> { if (msg instanceof TextMessage) { System.out.println("Received: " + ((TextMessage)msg).getText()); } }); // 持久化订阅示例(主题模式) MessageConsumer durableConsumer = session.createDurableSubscriber( session.createTopic("TEST.TOPIC"), "Subscriber1"); // 引用[4] ``` #### 6. Spring集成方法 通过Spring JMS模板简化操作[^2]: ```xml <!-- Spring配置 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> </bean> <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> </bean> ``` #### 7. 关键注意事项 - 连接必须显式关闭:`connection.close()` - 持久订阅需要唯一ClientID设置[^4] - WebSocket支持需要匹配Jetty版本[^3] - 事务会话需设置`createSession(true, ...)`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值