EJB_消息驱动发展bean
消息驱动发展bean
Java信息服务(Java MessageService)
Java 信息服务(Java Message Service,简称 JMS)是用于訪问企业消息系统的开发商中立的API。
企业消息系统能够协助应用软件通过网络进行消息交互。
JMS的编程过程非常easy,概括为:应用程序A发送一条消息到消息server的某个目地(Destination),然后消息server把消息转发给应用程序B。
由于应用程序A和应用程序B没有直接的代码关连,所以两者实现了解偶。
JMS中的消息
消息传递系统的中心就是消息。一条 Message 由三个部分组成:
头(header),属性(property)和主体(body)。
消息有以下几种类型。他们都是派生自 Message 接口。
StreamMessage:一种主体中包括 Java 基元值流的消息。其填充和读取均按顺序进行。
MapMessage:一种主体中包括一组名-值对的消息。
未定义条目顺序。
TextMessage:一种主体中包括 Java 字符串的消息(比如,XML 消息)。
ObjectMessage:一种主体中包括序列化 Java 对象的消息。
BytesMessage:一种主体中包括连续字节流的消息。
消息的传递模型
JMS 支持两种消息传递模型:点对点(point-to-point。简称 PTP)和公布/订阅(publish/subscribe,简称 pub/sub)。
这两种消息传递模型很相似。但有下面差别:
PTP 消息传递模型规定了一条消息仅仅能传递给一个接收方。 採用javax.jms.Queue 表示。
Pub/sub 消息传递模型同意一条消息传递给多个接收方。
採用javax.jms.Topic表示
这两种模型都通过扩展公用基类来实现。比如:javax.jms.Queue 和javax.jms.Topic 都扩展自javax.jms.Destination 类。
点对点PTP 消息传递模型
谁先监听,谁就先收到。
公布/订阅消息传递模型
配置目标地址
開始JMS编程前。我们须要先配置消息到达的目标地址(Destination)。由于仅仅有目标地址存在了,我们才干发送消息到这个地址。由于每一个应用server关于目标地址的配置方式都有所不同,以下以jboss为例,配置一个queue类型的目标地址。
<?xml version="1.0"encoding="UTF-8"?>
<mbeancode="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=foshanshop">
<attributename="JNDIName">queue/foshanshop</attribute>
<dependsoptional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
Jboss使用一个XML文件配置队列地址。文件的取名格式应遵守*-service.xml
<attribute name="JNDIName">属性指定了该目标地址的全局JNDI名称。假设你不指定JNDIName属性,jboss会为你生成一个默认的全局JNDI,其名称由“queue”+“/”+目标地址名称组成。
另外在不论什么队列或主题被部署之前,应用server必须先部署Destination Manager Mbean。所以我们通过<depends>节点声明这一依赖。
加粗自己定义设置,黑色不用更改。
步骤:
在桌面新建一个hqu-service.xml复制上面xml代码改动加粗部分:
<?
xml version="1.0"encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=hquQueue">
<attribute name="JNDIName">queue/hquQueue</attribute>
<depends optional-attribute-name="DestinationManager">
jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
公布:复制到Jboss的server\default\deploy下就公布了。能够在控制台看到公布信息。
能够在Jboss管理页面看:http://localhost:8080/jmx-console/
jboss.mq.destination 下的name=hquQueue,service=Queue
目标地址建立完毕后。我们就能够进行消息的发送。
在Java类中发送消息
一般发送消息有下面步骤:
(1) 得到一个JNDI初始化上下文(Context)
InitialContextctx = new InitialContext();
(2) 依据上下文查找一个连接工厂QueueConnectionFactory 。
该连接工厂是由JMS提供的,不需我们自己创建。每一个厂商都为它绑定了一个全局JNDI,我们通过它的全局JNDI便可获取它;
QueueConnectionFactoryfactory = (QueueConnectionFactory)
ctx.lookup("QueueConnectionFactory");
(3) 从连接工厂得到一个连接QueueConnection
conn= factory.createQueueConnection();
(4) 通过连接来建立一个会话(Session);
session= conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
这句代码意思是:建立不须要事务的而且能自己主动确认消息已接收的会话。
(5) 查找目标地址:
样例相应代码:Destinationdestination = (Destination ) ctx.lookup("queue/hquQueue");
(6) 依据会话以及目标地址来建立消息生产者MessageProducer(QueueSender和TopicPublisher都扩展自MessageProducer接口)
样例相应代码:
MessageProducer producer =session.createProducer(destination);
TextMessage msg =session.createTextMessage("您好,这是我的第一个消息驱动Bean");
producer.send(msg);
步骤:
新建一个消息驱动bean项目,新建JavaProject:MessageDrivenBean。加入EJB需的jar文件, 新建一个java类:QueueSender在cn.hqu.app下,用于发送queue。
package cn.hqu.app;import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.naming.InitialContext;public class QueueSender {public static void main(String[] args) {try {//1.首先初始化一个JNDI上下文对象InitialContext ctx = new InitialContext();//2.依据上下文查找一个连接工厂 QueueConnectionFactoryQueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");//3.通过连接工厂能够创建一个queue连接QueueConnection。QueueConnection conn = factory.createQueueConnection();//4.通过连接创建一个到目的地址的会话QueueSession session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);//5.查找目标地址Destination destination = (Destination) ctx.lookup("queue/hquQueue");//6.得到消息的发送者MessageProducer producer = session.createProducer(destination);//通过这个发送者我们就能够发送消息了:producer.send(session.createTextMessage("你好,苏志达"));session.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
在方法内部。编写发送代码。
拷贝上一个项目的jdni.properties到src下,在类QueueSender的mian里面
InitialContextctx = newInitialContext();
2.依据上下文查找一个连接工厂 QueueConnectionFactory
QueueConnectionFactory factory =(QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");
3.通过连接工厂能够创建一个queue连接QueueConnection。
QueueConnectionconn = factory.createQueueConnection();
4.通过连接创建一个到目的地址的会话:第一个參数指定是否须要事务。第二个參数指定消息确定模式。
QueueSession session= conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Destination destination= (Destination) ctx.lookup("queue/hquQueue");
MessageProducerproducer = session.createProducer(destination);
producer.send(session.createTextMessage("你好。苏志达"));
调用程序往目标地址发送一条消息。执行main。消息发送完。接下来编写消息接收者。
採用消息驱动Bean接收消息
一个MDB通常要实现MessageListener接口,该接口定义了onMessage()方法。Bean通过它来处理收到的JMS消息。
public interface MessageListener {
public void onMessage(Message message);
新建一个消息驱动Bean:MessageDrivenBean在cn.hqu.message下实现MessageListener。
当容器检測到这个JavaBean所监听的目标地址有消息到达的时候,会帮我们获得这个消息传到onMessage这种方法。
通过注解能够指定消息驱动bean它监听目标地址的类型是什么类型,和目标地址的JNDI名称。
@MessageDriven(activationConfig=
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/hquQueu"),
@ActivationConfigProperty(propertyName="acknowledgeMode",
propertyValue="Auto-acknowledge")
})
public classMessageDrivenBean implements MessageListener{
从queue类型的目标地址去寻找JNDI为queue/hquQueu所绑定的目的地址。
消息接收到的时候消息的确认模式为自己主动确认。acknowledgeMode是默认的所以这个能够去掉。
在onMessage方法里面处理接收到的消息
public void onMessage(Message msg) {
TextMessage message = (TextMessage) msg;
try {
System.out.println(message.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
进行打包,部署。
拷贝上一个项目的ant,改动配置文件build.xml的name为
运行deploy,把消息驱动bean公布到Jboss中。在控制台打印
16:07:57,999 INFO [JmxKernelAbstraction] installing MBean:jboss.j2ee:jar=Messa
geDrivenBean.jar,name=MessageDrivenBean,service=EJB3with dependencies:
16:07:58,015 INFO [EJBContainer] STARTED EJB:cn.hqu.message.MessageDrivenBean
16:07:58,039 INFO [EJB3Deployer] Deployed:file:/F:/Java/jboss-4.2.2.GA/server/
default/deploy/MessageDrivenBean.jar
16:07:58,060 INFO [STDOUT] 你好,苏志达
Jms同意发送者和接收方能够不同一时候在线。两者之间没有代码的关联,实现了非常好的解耦。
代码:http://pan.baidu.com/s/1bn2DgPT
Topic的发送和接收。
第一步配置目标地址。类型不是queue类型,是Topic类型,在配置文件hqu-service.xml加一个Topic配置
<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.mq.destination:service=Topic,name=hquTopic">
<attribute name="JNDIName">topic/hquTopic</attribute>
<depends optional-attribute-name="DestinationManager">
jboss.mq:service=DestinationManager</depends>
</mbean>
配置好,将它公布到Jboss中(复制进去)。
新建类TopicSender在cn.hqu.app下,用于公布topic 类型的消息。
JNDI名称能够在公布后的控制台看到。
package cn.hqu.app;import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.InitialContext;public class TopicSender {/*** @param args*/public static void main(String[] args) {try {//1.首先初始化一个JNDI上下文对象InitialContext ctx = new InitialContext();//2.依据上下文查找一个连接工厂 QueueConnectionFactoryTopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("TopicConnectionFactory");//3.通过连接工厂能够创建一个queue连接QueueConnection。TopicConnection conn = factory.createTopicConnection();//4.通过连接创建一个到目的地址的会话TopicSession session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);//5.查找目标地址Destination destination = (Destination) ctx.lookup("topic/hquTopic");//6.得到消息的发送者MessageProducer producer = session.createProducer(destination);//通过这个发送者我们就能够发送消息了:producer.send(session.createTextMessage("你好,苏志达"));session.close();conn.close();} catch (Exception e) {e.printStackTrace();}}}
执行main。
开发消息的接收方。由于会被多方接收,所以建立两个消息驱动Bean
新建ReceiveBean实现MessageListener在cn.hqu.message下。
package cn.hqu.message;import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig =
{@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"),@ActivationConfigProperty(propertyName="destination",propertyValue="topic/hquTopic")
})
public class ReceiveBean implements MessageListener {@Overridepublic void onMessage(Message msg) {TextMessage message = (TextMessage) msg;try {System.out.println(this.getClass()+message.getText());} catch (JMSException e) {e.printStackTrace();}}}
package cn.hqu.message;import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig =
{@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"),@ActivationConfigProperty(propertyName="destination",propertyValue="topic/hquTopic")
})
public class ReceiveOtherBean implements MessageListener {@Overridepublic void onMessage(Message msg) {TextMessage message = (TextMessage) msg;try {System.out.println(this.getClass()+message.getText());} catch (JMSException e) {e.printStackTrace();}}}
如今我们再运行一下topic的发送,就能够在控制台看到多个接收方接受到发送的消息了。
代码:http://pan.baidu.com/s/1nthubNF
版权声明:本文博客原创文章,博客,未经同意,不得转载。
转载于:https://www.cnblogs.com/hrhguanli/p/4614644.html
EJB_消息驱动发展bean相关推荐
- EJB 3.0中会话Bean,实体Bean,消息驱动Bean的作用和例子
关键词:EJB 3.0,会话Bean,实体Bean,消息驱动Bean EJB 3.0规范使开发EJB比过去更容易,可能诱惑你考虑开发第一个EJB.如果真是这种情况,那么祝贺你,你已经成功避免了在你以前 ...
- aws sqs_在Spring使用AWS SQS创建消息驱动Bean
aws sqs 在我之前的文章中,我展示了一个简单的示例,该示例如何将AWS SQS与Spring Framework结合使用以将消息放入队列并从队列中读取消息. 在本文中,我将更进一步,并使用Spr ...
- 在Spring使用AWS SQS创建消息驱动Bean
在我之前的文章中,我展示了一个简单的示例,该示例如何将AWS SQS与Spring Framework结合使用以将消息放入队列中并从队列中读取消息. 在本文中,我将更进一步,并使用Spring创建一个 ...
- bean创建异常_快速提示:消息驱动Bean中的异常处理
bean创建异常 让我们快速回顾一下关于消息驱动Bean的特殊处理. MDB的入口点是重写的onMessage方法. 它不提供引发检查异常的作用域,因此,如果要处理错误情形,则需要从代码中传播未检查异 ...
- 快速提示:消息驱动Bean中的异常处理
让我们快速回顾一下有关消息驱动Bean的特殊处理. MDB的入口点是重写的onMessage方法. 它不提供引发检查异常的任何作用域,因此,如果要处理错误情形,则需要从代码中传播未检查异常(java. ...
- SpringCloud微服务-服务注册发现-负载均衡-服务调用-服务降级-服务网关-配置中心-消息总线-消息驱动-链路追踪-alibaba-nacos-sentinel-seata理论原理分析
SpringCloud理论技术 概述 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总 ...
- Spring Cloud构建微服务架构:消息驱动的微服务(消费组)【Dalston版】
通过之前的<消息驱动的微服务(入门)>一文,相信很多朋友已经对Spring Cloud Stream有了一个初步的认识.但是,对于<消息驱动的微服务(核心概念)>一文中提到的一 ...
- 【2016年第4期】大数据应用系统的消息驱动架构
贵芳1,李廉1,杨静1,武永卫2 1.合肥工业大学计算机与信息学院,安徽 合肥 230009: 2.清华大学计算机科学与技术系,北京 100084 摘要:基于消息驱动框架的软件开发成为大数据应用系统的 ...
- 自主驱动发展 创新引领未来丨第九届数据技术嘉年华大会全议程精彩呈现
简介 时光荏苒,转眼又到了一年一度的总结时刻.第八届数据技术嘉年华大会的精彩演讲还历历在目, 第九届数据技术嘉年华大会在紧锣密鼓的筹备中,即将拉开帷幕.本次大会于2019年11月15日-16日在北京新 ...
最新文章
- token验证失败_ASP.NET CORE WEBAPI JWT 带BEARER的TOKEN
- 学校APP太难用,码农爸妈们自己做出开源程序,官方却要报警
- JS中自定义replace可替换特殊符号$等,但无法忽略大小写的函数
- dfs题目这样去解题,秒杀leetcode题目
- hibernate保存失败_Hibernate:保存与保存并保存或更新
- Android 代码实现查看SQLite数据库中的表
- 2002勘察设计收费标准_上海装修设计师的收费标准是什么?
- springboot引入外部yml配置文件
- ASP.NET URL重写浅析
- 【5分钟 Paper】Deep Reinforcement Learning with Double Q-learning
- Ansible配置文件
- python 判定n阶方矩是否为上三角矩阵
- linux pulseaudio模块关系,ALSA和PulseAudio有何关系?
- linux虚拟机界面菜单栏和任务栏不见了,已解决
- SharePoint 2013 开发中JavaScript本地化方案
- Unirech腾讯云代充-关于腾讯云国际版云服务器实例调整配置常见问题
- 潭州课堂25班:Ph201805201 django 项目 第一课 (课堂笔记)
- Java 的 IDEA 神级插件!
- XML解析器及相关概念介绍
- Android第三方QQ登录、获取个人信息、分享实现
热门文章
- [Tip: iShare Site] Move file/folder on iShare Site
- [RN] React Native 自定义 底部 弹出 选择框 实现
- Java2WSDL 和 WSDL2Java(Axis)
- Mybatis【一对多、多对一、多对多】知识要点
- codefirst数据库迁移
- 2800:垂直直方图
- 使用CAShapeLayer实现一个音量大小动态改变的控件
- (转)PHP EOF(heredoc)的使用方法
- No identities are available for signing的解决方法
- 一刻钟精通正则表达式