`
eddysheng
  • 浏览: 111781 次
  • 性别: 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的关键步骤如下: 1. **配置JMS连接工厂**:在Spring的配置文件中,我们需要定义一个JMS连接工厂bean,通常使用`weblogic.jndi.WLInitialContextFactory`作为初始上下文工厂类,并设置JNDI...

    spring,weblogic配置jms

    以上就是配置Spring与WebLogic JMS的基本流程,这个过程中可能涉及源码的阅读和调试,以及使用一些工具(如JConsole、VisualVM等)进行监控和调优。在实际应用中,还需要结合具体的业务场景和需求进行调整和优化。

    Spring整合Weblogic jms实例详解

    Spring 整合 Weblogic JMS 是一种非常有用的技术,可以为应用程序提供高性能、可靠性和灵活性的消息传递机制。 知识点: * Spring 整合 Weblogic JMS 的优点 * JMS 服务器配置 * Spring 配置 applicationContext-...

    Spring+weblogic接收JMS消息

    通过以上知识,开发者可以构建一个基于Spring的Java应用,有效地利用WebLogic Server的JMS服务进行消息传递,实现高效且可靠的异步通信。理解并熟练掌握这些概念和实践,对于在企业级环境中构建可扩展、高可用的系统...

    spring jms 整合 weblogic jms

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

    Spring+weblogic9.2发送JMS消息

    集成Spring和WebLogic 9.2发送JMS消息的步骤如下: 1. **配置JMS连接工厂**:在Spring的配置文件中,你需要定义一个JMS连接工厂。这通常通过`jee:jndi-lookup`标签完成,指定在WebLogic中注册的JMS连接工厂JNDI名称...

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

    WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持Java Message Service (JMS) 规范,允许在分布式环境中可靠地发送和接收消息。JMS是Java平台上的标准接口,用于实现应用程序间的异步通信。本文将...

    weblogic与jms+spring

    这可以验证WebLogic、JMS和Spring的整合是否成功。 **总结:** WebLogic与JMS+Spring的整合利用了WebLogic的稳定性和JMS的异步通信能力,结合Spring的灵活性和易用性,为开发高效、可扩展的企业级应用提供了强大的...

    springboot集成weblogic的jms源码.zip

    这个示例代码提供了从Spring Boot应用向WebLogic JMS发送和接收消息的基本结构,可以帮助开发者快速理解并实现自己的集成方案。通过深入研究和调整这些源码,你可以根据实际需求构建出更复杂的JMS应用场景,如事务性...

    jms.rar_weblogic8 spring jms

    本文将深入探讨如何在Spring框架下配置JMS,并结合WebLogic 8.1这个J2EE容器进行实践。我们将围绕标题“jms.rar_weblogic8_spring_jms”以及描述中的关键信息展开。 首先,让我们理解JMS的核心概念。Java消息服务...

    JMS入门小例子以及weblogic安装,并且在weblogic中配置JMS服务

    5. **配置应用程序**:在应用中引入JMS相关的依赖库,如JMS API、Spring框架的JMS支持和其他必要的库(如WebLogic客户端库)。 6. **编写接收端和发送端代码**:接收端通过监听器等待消息,发送端则负责创建消息并...

    Spring JMS 消息处理-基于JNDI

    通过学习这篇博客,开发者可以了解到如何利用Spring JMS和JNDI在Java应用程序中实现高效、可靠的异步通信,提升系统的可扩展性和稳定性。这种技术在微服务架构和分布式系统中尤其有价值,因为它们通常依赖于消息传递...

    weblogic 实用手册+Weblogic

    5. JMS和Web服务:WebLogic支持JMS(Java Message Service),用于异步消息传递,还支持SOAP和RESTful Web服务。 二、WebLogic管理 1. 管理控制台:WebLogic Server通过一个基于Web的管理控制台,提供图形化的界面...

    JavaEE实用开发指南(基于Weblogic+EJB3+Struts2+Hibernate+Spring)素材文件.zip

    Weblogic支持EJB、JMS、JSP、Servlet等标准,还具备集群、负载均衡和安全管理等功能,是企业级应用的首选服务器。 2. **EJB3(Enterprise JavaBeans 3)**:EJB是Java EE规范的一部分,用于构建可复用的、安全的、...

    WebLogic企业级运维实战

    WebLogic Server是基于Java平台的企业级中间件,它支持多种Java EE规范,如Servlet、JSP、EJB、JMS、JTA等。WebLogic提供了丰富的管理工具,如WebLogic Administration Console,用于配置、管理和监控WebLogic集群和...

    day2013-0110-webLogic配置和集群(赵强).zip

    1. JMS(Java Message Service):WebLogic支持JMS服务,可用于异步通信和消息队列,提高系统性能和稳定性。 2. JDBC数据源:配置和管理JDBC数据源,连接到数据库,提供统一的访问接口,支持数据源的连接池和事务...

    weblogic管理员指南

    WebLogic Server是一款由甲骨文公司提供的企业级Java应用程序服务器,是Java EE(Java Platform, Enterprise Edition)平台的实现,广泛用于构建、部署和管理分布式应用程序。本指南将深入探讨WebLogic Server的管理...

Global site tag (gtag.js) - Google Analytics