- 浏览: 131233 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (80)
- 常见问题 (14)
- spring (10)
- HttpClient (2)
- 数据库 (4)
- Excel操作 (4)
- FtpClient (3)
- SpringMvc (2)
- Hessian (0)
- JasperReport (0)
- 其他 (5)
- js (4)
- css (4)
- jquery (0)
- Java (4)
- 反射 (1)
- CSV操作 (2)
- freemarker (3)
- hibernate (1)
- mongoDB (1)
- DB2 (2)
- 业务 (1)
- MAVEN (1)
- 权限控制 (1)
- 技术文档 (2)
- 生活琐事 (3)
- 性能问题 (1)
- UML (1)
- 工作总结 (1)
- 安卓 (1)
最新评论
-
菜鸟900101:
真心谢谢,解决了我头疼好几天的问题,谢谢谢谢
使用Ftpclient从FTP上进行下载时文件少一个字节,打不开 -
一生荣耀白:
[u][/u]
Freemarker分页的宏 -
liyang678:
这样不就得要求 被请求一方必须按您的这种XML格式解析吗。
使用HttpClient、注解、动态代理、Spring的Bean后处理器实现Http消息发送 -
liyang678:
可以演示一下如何调用吗。不是很明白呢。
使用HttpClient、注解、动态代理、Spring的Bean后处理器实现Http消息发送 -
hzxlb910:
...
使用TransactionTemplate来完成Spring的编程式事务管理
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd" default-lazy-init="false"> <!-- MQ消息监听接口服务 --> <bean id="jmsReceiverListenerServer" class="com.iteye.jms.receive.JmsReceiverListenerServer"></bean> <!-- MQ队列连接工厂配置 --> <bean id="connectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"> <property name="queueManager" value="队列管理器名称" /> <property name="hostName" value="IP" /> <property name="port" value="端口" /> <property name="channel" value="通道" /> <property name="transportType" value="传输方式" /> </bean> <!-- MQ队列连接工厂配置适配器 --> <bean id="connectionFactoryAdapter" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> <property name="targetConnectionFactory" ref="connectionFactory" /> </bean> <!-- 订单接收队列 --> <bean id="orderReceiveQueue" class="com.ibm.mq.jms.MQQueue"> <property name="baseQueueName" value="OrderReceive_Queue" /> </bean> <!-- 商品接收队列 --> <bean id="productReceiveQueue" class="com.ibm.mq.jms.MQQueue"> <property name="baseQueueName" value="ProductReceive_Queue" /> </bean> <!-- 订单消息监听器 --> <bean class="com.iteye.jms.receive.OrderQueueMessageListener"></bean> <!-- 商品消息监听器 --> <bean class="com.iteye.jms.receive.ProductQueueMessageListener"></bean> </beans>
package com.iteye.jms.receive; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Retention; import java.lang.annotation.Target; @Target(TYPE) @Retention(RUNTIME) public @interface JmsReceiveMsgAnno { /** * 监听的链接工厂 */ String connectionFactory() default ""; /** * 监听队列 */ String receiveQueue() default ""; /** * 监听端消费者数量 */ int consumers() default 1; /** * 消息选择器 */ String messageSelector() default ""; /** * 是否开启事务 */ boolean sessionTransacted() default false; }
package com.iteye.jms.receive; import java.util.HashSet; import java.util.Set; import javax.jms.ConnectionFactory; import javax.jms.MessageListener; import javax.jms.Queue; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.jms.listener.DefaultMessageListenerContainer; /** * * 〈一句话功能简述〉<br> * MQ消息监听接口服务 * * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ @SuppressWarnings("rawtypes") public class JmsReceiverListenerServer implements BeanPostProcessor, ApplicationContextAware, ApplicationListener, DisposableBean { private ApplicationContext applicationContext; private boolean started = false; /** * 服务端监听器容器列表(Set集合不允许重复) */ private Set<DefaultMessageListenerContainer> messageListenerContainers = new HashSet<DefaultMessageListenerContainer>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // 扫描所有使用了@JmsReceiveMsgAnno的bean,将其注册为服务端监听器容器列表 registerMQServerBean(bean); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } /** * 在所有的Spring加载工作完成之后会执行onApplicationEvent方法,启动消息监听器进行消息监听 */ @Override public void onApplicationEvent(ApplicationEvent event) { if (isCurrentApplicationContextRefresh(event)) { if (started) { return; } started = true; // 遍历所有消息监听器列表,启动消息监听 for (DefaultMessageListenerContainer container : messageListenerContainers) { container.afterPropertiesSet(); container.start(); } } } /** * * 是否是当前上下文,防止重复加载和过早加载 <br> * 〈功能详细描述〉 * * @param event * @return * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ private boolean isCurrentApplicationContextRefresh(ApplicationEvent event) { return event instanceof ContextRefreshedEvent && ((ContextRefreshedEvent) event).getApplicationContext() == applicationContext; } /** * 容器销毁时停止消息监听器监听 */ @Override public void destroy() throws Exception { if (started) { for (DefaultMessageListenerContainer container : messageListenerContainers) { container.shutdown(); } } } /** * * 扫描所有使用了@JmsReceiveMsgAnno的bean,将其注册为服务端监听器容器列表 <br> * 〈功能详细描述〉 * * @param bean * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ private void registerMQServerBean(Object bean) { Class<?> clazz = bean.getClass(); // 该类是否使用了JmsReceiveMsgAnno注解 if (clazz.isAnnotationPresent(JmsReceiveMsgAnno.class) == false) { return; } else { // 该类必须实现MessageListener接口 if (!MessageListener.class.isAssignableFrom(clazz)) { throw new RuntimeException("消息监听器必须实现MessageListener接口"); } } // 消息监听器 MessageListener listener = (MessageListener) bean; // 注解信息类对象 JmsReceiveMsgAnno anno = clazz.getAnnotation(JmsReceiveMsgAnno.class); // 默认的消息监听容器 DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); // 队列连接工厂 container.setConnectionFactory(applicationContext.getBean(anno.connectionFactory(), ConnectionFactory.class)); // 监听队列 container.setDestination(applicationContext.getBean(anno.receiveQueue(), Queue.class)); // 服务端消费者数量 container.setConcurrentConsumers(anno.consumers()); // 消息监听器 container.setMessageListener(listener); // 是否开启事务 container.setSessionTransacted(anno.sessionTransacted()); if (StringUtils.isNotEmpty(anno.messageSelector())) { // 消息选择器 container.setMessageSelector(anno.messageSelector()); } messageListenerContainers.add(container); } }
package com.iteye.jms.receive; import javax.jms.BytesMessage; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @JmsReceiveMsgAnno(receiveQueue = "orderReceiveQueue", connectionFactory = "connectionFactoryAdapter") public class OrderQueueMessageListener implements MessageListener { @Override public void onMessage(Message message) { // 报文消息 String msgstr = null; try { if (message instanceof TextMessage) { TextMessage tm = (TextMessage) message; msgstr = tm.getText(); } else if (message instanceof BytesMessage) { BytesMessage bm = (BytesMessage) message; byte[] bys = null; bys = new byte[(int) bm.getBodyLength()]; bm.readBytes(bys); msgstr = new String(bys); } else { // 日志 } } catch (Exception e) { // 日志 } System.out.println(msgstr); } }
package com.iteye.jms.receive; import javax.jms.BytesMessage; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @JmsReceiveMsgAnno(receiveQueue = "productReceiveQueue", connectionFactory = "connectionFactoryAdapter") public class ProductQueueMessageListener implements MessageListener { @Override public void onMessage(Message message) { // 报文消息 String msgstr = null; try { if (message instanceof TextMessage) { TextMessage tm = (TextMessage) message; msgstr = tm.getText(); } else if (message instanceof BytesMessage) { BytesMessage bm = (BytesMessage) message; byte[] bys = null; bys = new byte[(int) bm.getBodyLength()]; bm.readBytes(bys); msgstr = new String(bys); } else { // 日志 } } catch (Exception e) { // 日志 } System.out.println(msgstr); } }
当向OrderReceive_Queue队列发送消息时会触发订单导入消息监听接口,执行onMessage方法。
当向ProductReceive_Queue队列发送消息时会触发商品导入消息监听接口,执行onMessage方法。
发表评论
-
如何使用spring中的定时任务
2017-10-20 15:00 436<!-- spring 定时任务 begin--&g ... -
spring事务深入理解和案例分析
2017-08-15 19:30 678http://www.cnblogs.com/fjding ... -
使用HttpClient、注解、动态代理、Spring的Bean后处理器实现Http消息发送
2014-05-15 17:47 2641<beans xmlns="http:// ... -
使用Jmstemplate向队列中发送数据
2014-05-15 16:43 5022<?xml version="1.0&qu ... -
Spring文件上传
2014-04-15 18:25 902文件上传可以使用普通的表单提交,也可以使用AJAX异步提交,如 ... -
Spring文件下载
2014-04-15 15:47 756@Controller public class MyC ... -
Spring定时任务调度
2014-04-14 16:57 789第1种方式: public class PayJob e ... -
对TransactionTemplate进行封装,使用程序调用更加简单
2014-03-19 14:18 3456<!-- DB2 dataSource--> ... -
使用TransactionTemplate来完成Spring的编程式事务管理
2014-03-19 14:14 4233<!-- 资源文件 --> <!-- ...
相关推荐
本篇文章将详细介绍三种不同的方法,帮助Java客户端从MQ队列接收消息。 1. **IBM WebSphere MQ JMS API** IBM的WebSphere MQ提供了一套Java Message Service (JMS) API,允许Java应用程序与MQ队列进行通信。首先,...
6. **消息监听器**:学习使用MessageListener接口实现异步消息接收,提升系统性能。 7. **错误处理和异常处理**:理解在发送和接收过程中可能出现的异常,以及如何优雅地处理这些异常。 8. **分组和设置**:根据...
JMS是Java平台上的一个标准接口,用于访问各种消息中间件,包括IBM MQ。在IBM MQ中,JMS被封装在com.ibm.mq.allclient.jar库中,我们需要将其添加到项目依赖中。 发送消息到IBM MQ的步骤如下: 1. **初始化...
综上所述,"MQ客户端消息发送接收程序"涉及了消息队列的核心概念和使用技巧,包括客户端接口、消息模型、确认机制、事务处理、系统设计以及编程实践。这个程序的实现对于学习和理解MQ通信机制具有很高的价值。
通过`connection.CreateSession()`方法创建一个新的会话,同时设置消息确认模式为`AcknowledgementMode.AutoAcknowledge`,表示当客户端成功接收到消息后,会自动向MQ服务器确认消息已被消费。 #### 获取目的地(`...
本文将详细介绍如何使用C#语言来连接并操作IBM MQ,特别是实现消息的发送与接收功能。 #### IBM MQ基础知识简介 在深入讨论具体实现细节之前,我们首先需要了解一些关于IBM MQ的基本概念: 1. **队列(Queue)**...
1. **消息发布与订阅**:生产者通过API接口发送消息到MQ服务器,订阅了相应主题的消费者会接收到这些消息。 2. **路由规则**:需要设置路由键来决定消息如何被路由到特定的队列,这可能涉及到Direct、Fanout、Topic...
在IT行业中,Java消息服务(Java Message Service,简称JMS)是一种标准,它定义了应用程序如何创建、发送、接收和读取消息的标准API。IBM MQ是IBM提供的一个强大的消息中间件,它允许分布式系统中的不同组件通过...
通过MQ,不同组件之间可以通过发送和接收消息进行通信,而无需直接调用对方的接口。本教程将重点讨论如何在Java中实现与MQ的接口交互。 首先,理解MQ的基本概念是至关重要的。MQ允许应用程序通过发布和订阅消息进行...
在IBM MQ中,JMS接口提供了发送和接收消息的标准化方法。 - JMS包含两种主要类型的消息模型:点对点(Queue)和发布/订阅(Topic)。 3. **MQUtil**: - `MQUtil`可能是一个工具类,包含通用的IBM MQ操作函数,如...
本项目"mqTest"是一个关于MQ消息发送和接收的实践案例,特别关注了JMS(Java Message Service)接口的使用以及消息接收的两种不同方式。 JMS是Java平台上的标准API,它为各种消息传递提供商提供了一种统一的接口,...
本实例将深入探讨如何使用C#语言来实现与IBM WebSphere MQ的交互,进行消息的发送和接收。 首先,我们需要了解IBM WebSphere MQ的基本概念。MQ是一种中间件,通过消息队列作为中介,使得应用程序可以在不直接互相...
在MQ中,一个关键的角色是消息代理(Message Broker),它负责接收、存储和转发消息。Apache ActiveMQ是Apache软件基金会开发的一款开源的消息中间件,支持Java消息服务(Java Message Service,JMS)。ActiveMQ作为...
4. 定义消息监听器:在Controller或单独的服务类中,创建一个实现了`MessageListener`接口的类,用于接收消息。通常,我们使用`SimpleMessageListenerContainer`来管理和调度监听器。 5. 发送消息:在需要发送消息...
JMS是Java平台上的一个标准接口,用于访问各种消息中间件。对于IBMMQ,我们需要IBM的`com.ibm.mq.allclient.jar`库,这是JMS客户端API的一部分。 以下是使用Java和JMS发送消息到IBMMQ的基本步骤: 1. **配置MQ连接...
JMS(Java Message Service)是Java平台中定义的一种标准接口,用于在分布式环境中发送和接收消息。 1. **Spring与ActiveMQ的集成**:Spring框架通过其`spring-jms`模块提供对JMS的支持,使得开发者可以轻松地在...
2. 消息中间件客户端API抽象出一套统一的消息发送、接收接口,简化使用。 3. 消息两阶段提交基于持久化事件框架模拟消息两阶段提交,确保数据库操作和消息发送的一致性。 主要特性 事件持久化可以选择是否持久化...
你可以定义一个实现了`MessageListener`接口的类,用于接收和处理消息。配置`DefaultMessageListenerContainer`,指定ActiveMQ的接收队列和你的`MessageListener`。 4. **消息类型**:JMS支持两种消息模型:点对点...
- MQ Interface (MQI) 是为应用程序与MQ系统交互提供的标准接口,支持多种编程语言,如C、Java等,使得不同平台和语言的系统可以无缝交换消息。 3. **时间无关的应用程序** - MQ允许应用程序在任何时间读取或写入...