`
eddysheng
  • 浏览: 110223 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于spring和weblogic的jms

阅读更多

 

环境

 

1.weblogic 9.2.3

     已经创建JMS Connection Factory:jms/connectionFactory

                 JMS Queue:jms/TestQueue

                 JMS Topic:jms/TestTopic

 

 

实现一

 

通过spring的JmsTemplate发送消息到Queue,然后通过messageListener实现消息的异步接收.

 

完整的springl配置文件applicationContext-jms.xml如下:

<beans>
	<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>jms/connectionFactory</value>
		</property>
		<property name="jndiTemplate">
			<ref bean="jmsJndiTemplate"></ref>
		</property>
	</bean>
	<!-- define jms queue jndi -->
	<bean id="jmsDestination" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>jms/TestQueue</value>
		</property>
		<property name="jndiTemplate">
			<ref bean="jmsJndiTemplate"></ref>
		</property>
	</bean>
	<!-- define jms queue url -->
	<bean id="jmsJndiTemplate" class="org.springframework.jndi.JndiTemplate">
		<property name="environment">
			<props>
				<!-- com.sun.enterprise.naming.SerialInitContextFactory -->
				<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
				<prop key="java.naming.provider.url">t3://16.158.51.221:7001</prop>
			</props>
		</property>
	</bean>
	<!-- JMS Queue Send Template  -->
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory">
			<ref local="jmsConnectionFactory" />
		</property>
		<property name="defaultDestination">
			<ref local="jmsDestination" />
		</property>
	</bean> 
	
	<bean id="jmsProducer" class="org.springframework.samples.jpetstore.jms.JmsProducer">
		<constructor-arg ref="jmsTemplate" />
	</bean>
	
	<bean id="messageListener" class="org.springframework.samples.jpetstore.jms.JpetstoreJmsListener" />
	
	<bean id="listenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <!--property name="concurrentConsumers" value="5" /-->
        <property name="connectionFactory" ref="jmsConnectionFactory" />
        <property name="destination" ref="jmsDestination" />
        <property name="messageListener" ref="messageListener" />
        <property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE"/>
	</bean>
</beans>

 

消息发送JmsProducer代码如下

package org.springframework.samples.jpetstore.jms;

import org.springframework.jms.core.JmsTemplate;

public class JmsProducer {

	private JmsTemplate jmsTemplate;

    public JmsProducer(JmsTemplate jmsTemplate) {
            this.jmsTemplate = jmsTemplate;
    }

    public void sendMessage() {
            jmsTemplate.convertAndSend("Hello world!("+System.currentTimeMillis()+")");
    }
}

 

消息接收JpetstoreJmsListener代码如下

package org.springframework.samples.jpetstore.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class JpetstoreJmsListener implements MessageListener {

	public void onMessage(Message message) {
        if (message instanceof TextMessage) {
                try {
                        System.out.println("ok--"+((TextMessage)message).getText());
                } catch (JMSException e) {
                        throw new RuntimeException(e);
                }
        } else {
                throw new IllegalArgumentException(
                                "Message must be of type TestMessage");
        }
	}
}
 

测试代码

public class JmsConsole {
       
    public static void main(String[] args) throws IOException {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jms.xml");
        JmsProducer sender = (JmsProducer) context.getBean("jmsProducer");
               
        sender.sendMessage();

    }
}

 

运行JmsConsole,控制台输入如下:

 

ok--Hello world!(1250560961109)

 

将测试程序修改一下,如下

public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jms.xml");
        JmsProducer sender = (JmsProducer) context.getBean("jmsProducer");
           int i = 1;
           System.out.println(System.currentTimeMillis());
        while(i<10){
        	System.out.println("line:"+i);
        	sender.sendMessage(i);
        	i++;
        }
    }

 

同时修改一下JpetstoreJmsListener

public void onMessage(Message message) {
        if (message instanceof TextMessage) {
                try {
                        System.out.println("ok--"+((TextMessage)message).getText());
                } catch (JMSException e) {
                        throw new RuntimeException(e);
                }
        } else {
                throw new IllegalArgumentException(
                                "Message must be of type TestMessage");
        }
        System.out.println(System.currentTimeMillis());
	}

 将spring配置中的

<property name="concurrentConsumers" value="1" />

设置为1,运行测试程序,从开始往Queue发送消息开始到消息全部处理完毕结束平均耗时大概有600ms左右。

将spring配置中的

<property name="concurrentConsumers" value="9" />

设置为9,运行测试程序,从开始往Queue发送消息开始到消息全部处理完毕结束平均耗时大概也在600ms左右。

 

将循环加到100,设置为并发消费者数为1和为9的时间有10倍左右的差距。

因此对于大并发的Queue处理,设置concurrentConsumers是非常有必要的。

 

实现二

 

上面的例子是传输简单类型的消息,下面让我们看一下对象消息如何传输。

 

传输的对象如下

package org.springframework.samples.jpetstore.domain;

import java.io.Serializable;


public class Product implements Serializable {

  /* Private Fields */

  private String productId;
  private String categoryId;
  private String name;
  private String description;

  /* JavaBeans Properties */

  public String getProductId() { return productId; }
  public void setProductId(String productId) { this.productId = productId.trim(); }

  public String getCategoryId() { return categoryId; }
  public void setCategoryId(String categoryId) { this.categoryId = categoryId; }

  public String getName() { return name; }
  public void setName(String name) { this.name = name; }

  public String getDescription() { return description; }
  public void setDescription(String description) { this.description = description; }

  /* Public Methods*/

  public String toString() {
    return getName();
  }

}
 

spring的配置不变,需要改变的是发送端代码和messageListener代码,如下

JmsProducer

package org.springframework.samples.jpetstore.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.support.converter.SimpleMessageConverter;
import org.springframework.samples.jpetstore.domain.Product;

public class JmsProducer {

	private JmsTemplate jmsTemplate;

    public JmsProducer(JmsTemplate jmsTemplate) {
            this.jmsTemplate = jmsTemplate;
    }

    public void sendMessage() {    	
            jmsTemplate.send(new MessageCreator() {
            	public Message createMessage(Session session) throws JMSException {
            		Product p = new Product();
                	p.setCategoryId("1-2-3");
                	p.setName("TestP");
                	p.setProductId("P-1-2-3");
            		Message message = new SimpleMessageConverter().toMessage(p, session);
            		message.setLongProperty("startTime", System.currentTimeMillis());
            		return message;
            		}
            		});
    }
}

 

JpetstoreJmsListener

package org.springframework.samples.jpetstore.jms;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;

import org.springframework.jms.support.converter.SimpleMessageConverter;
import org.springframework.samples.jpetstore.domain.Product;

public class JpetstoreJmsListener implements MessageListener {

	public void onMessage(Message message) {
        if (message instanceof ObjectMessage) {
        	try {
        		Product p = (Product)(new SimpleMessageConverter().fromMessage(message));
                System.out.println("ok--"+p.getProductId());
	        } catch (Exception e) {
	                throw new RuntimeException(e);
	        }  
        } else  {
            throw new IllegalArgumentException(
                            "Message must be of type TestMessage");
        }
        
        System.out.println(System.currentTimeMillis());
	}
}

 

测试代码

public class JmsConsole {
       
    public static void main(String[] args) throws IOException {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jms.xml");
        JmsProducer sender = (JmsProducer) context.getBean("jmsProducer");
               
        sender.sendMessage();

    }
}

输入如下信息:

ok--P-1-2-3
1250585109375
 

 

 

 

附录

 

 

概念

 

JMS(Java Message Service)是Java程序与企业消息系统进行交互的规范,它提供了一组API用于创建、发送、接收和读取消息。JMS定义了一组通用的消息概念和功能,旨在降低开发者访问企业消息系统的难度,同时最大化应用程序的可移植性。


JMS消息模型

1、Pub/Sub模型:
一对多广播消息模式。在Pub/Sub模型中,消息发送方称为Publisher ,消息接收方称为Subscriber 。主题Topic 充当Publisher和Subscriber之间的中介,对某个Topic感兴趣的Subscriber在Topic上注册,Publisher将消息发送到指定的Topic,Topic上的消息将递送给所有注册的Subscriber。
Pub/Sub模型的主要特点:
对Topic上的一个消息,注册的每个Subscriber均得到该消息的一个拷贝。
Topic上的消息是自动递送给Subscriber的,不需要Subscriber去主动获取新消息,这种方式也称为推模式(Push Model)。
Publisher和Subscriber可以在运行时刻动态添加和删除。

2、P2P模型:
一对一消息模式。在P2P模型中,消息发送方称为Sender ,消息接收方称为Receiver 。队列Queue 充当Sender和Receiver之间的中介,Sender将消息发送到指定的Queue,Receiver从指定的Queue上获取消息。
P2P模型的主要特点:
对Queue上的每个消息,即使有多个Receiver请求该消息,有且只有一个Receiver接收到该消息。即每个消息只能被一个Receiver消费,消费之后消息就从Queue上删除了。
Receiver需要到Queue上请求消息,而不是自动递给它的,这种方式也称为拉模式(Pull Model)。
Queue上的消息是有顺序的,消息按照它发送到Queue上的顺序被Receiver取走。

 

 

3
0
分享到:
评论

相关推荐

    Spring+Weblogic JMS

    这是本人搭建的Spring框架,集成了Weblogic JMS,测试已经完成。现提供给大家下载学习。

    spring jms 整合 weblogic jms

    本人开发的spring jms项目,已经上线近一年了,这里是我项目jms配置文件,使用的是spring jms 整合weblogic jms。如果真的需要,请咨询我,并且附上我上传的这个配置文件,附近中没有带有这个文件,一律不作任何回答...

    Spring整合Weblogic jms实例详解

    主要介绍了Spring整合Weblogic jms实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    weblogic中使用JMS发送和接受消息

    weblogic中使用JMS发送和接受消息(Queue and TOPIC)

    spring,weblogic配置jms

    weblogic jms 配置过程 博文链接:https://liyiye.iteye.com/blog/240724

    Spring+weblogic9.2发送JMS消息

    NULL 博文链接:https://jackaney.iteye.com/blog/1276918

    Spring+weblogic接收JMS消息

    NULL 博文链接:https://a3mao.iteye.com/blog/313531

    weblogic与jms+spring

    weblogi 整合 服务器 jms 异步消息 spring 包含weblogic的安装与配置 和在weblogic中配置jms。并有spring和jms的一个测试用例

    jms.rar_weblogic8 spring jms

    在spring下配置jms。J2EE容器为weblogic8.1

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    6.6 JMS和事务 265 6.6.1 使用事务性Session 265 6.6.2 利用JTA全局事务 267 6.7 JMS服务器的异常监听 268 6.8 JMS集群 269 6.9 本章小结 270 第7章 利用JavaMail实现E-mail 271 7.1 E-mail简介 272 7.1.1 SMTP协议...

    Oracle WebLogic Server开发权威指南

    Spring MVC、EJB 3.0、JPA、JMS 和Web 服务等关键技术,展示了这些技术的应用。正文部分带 你经历这个应用程序设的计、开发和部署过程中每一个决策做出的过程,帮助你在自己的开发工 作中做出类似的决策。 读者对象 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器...

    Spring中文帮助文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring 2.0 开发参考手册

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack ...19.2. 使用Spring JMS ...

    spring-boot-reference.pdf

    Spring Boot Documentation 1. About the Documentation 2. Getting Help 3. First Steps 4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. ...

    apache-activemq-5.11.2

    ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位. ⒈ 多种语言和协议编写客户端。语言: Java,C,C++,C#,...

    springboot参考指南

    使用Spring Data JPA和Mongo仓库 x. 67.10. 将Spring Data仓库暴露为REST端点 vii. 68. 数据库初始化 i. 68.1. 使用JPA初始化数据库 ii. 68.2. 使用Hibernate初始化数据库 iii. 68.3. 使用Spring JDBC初始化数据库 ...

    ActiveMQ消息服务器-其他

    ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。 主要特点: 1、多种语言和协议编写客户端。语言:Java,C...

Global site tag (gtag.js) - Google Analytics