Java EE 7:带有Glassfish v4的JMS 2.0

Java EE 7最近已被执行委员会接受 。 这意味着我们很快将在市场上提供Java EE 7应用服务器。 构成Java EE 7的规范之一是JMS 2.0 。 自1.1版以来,引入了一些有趣的改进。

JMS有很多怪异的东西,例如: Connection#createSession(boolean Transacted,int acceptMode)方法。

第一个方法参数( transacted )定义是否应处理会话。 Java EE应用程序具有负责事务处理的JTA。 我们可以选择是否支持交易(默认)。 那么,为什么我们需要这个论点呢?
第二个方法参数( acknowledgeMode )是一个从Session对象获取的整数常量 。 认真地说,整数常量使该API看起来太过传统。 最后,Java EE环境中这些参数的含义是什么? JavaDoc的说, acknowledgeMode如果会话事务被忽略。

这是什么意思? 不外乎: 这些参数对于Java EE上下文中使用的JMS生产者没有任何意义 。 这就是为什么他们鼓励您使用(true, 0)参数值以避免不必要的混淆的原因。 这闻起来有遗味。

好的,让我们回到主要主题。 我想看一下JMS世界中的新功能,以及它如何使我能够更轻松,更可维护的方式进行编码。 我已经准备了一个使用JMS 2.0,JAX-RS和EJB(SLSB和MDB)的简单Web应用程序,并将其推送到这里的 github存储库中。

先决条件和基础架构

为了能够运行此代码,您应该创建一个示例队列。 我已经在jms/queue/myqueue JNDI名称下配置了它。

我正在使用Glassfish v4 build 87 。 要使用Java EE 7 API,我需要添加以下Maven依赖项:

<dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>7.0-b87</version><scope>provided</scope>
</dependency>

驻留在此存储库中:

<repository><id>Java EE 7</id><url>https://maven.java.net/content/groups/promoted/</url>
</repository>

这就是配置的全部内容。

有效负载和REST配置

BusinessObject是一个简单的对象,将充当我们的JMS消息的有效负载。 它将由生产者发送并由消费者接收。 这里没什么好想的,所以让我们继续前进。 RESTConfiguration甚至更简单–它只是为我们的应用程序定义了JAX-RS端点前缀。 该前缀是:“ / rest”。 您可以通过访问应用程序URL / rest / producer / jms11或/ rest / producer / jms20(例如http://localhost:8080/jms2_0_spike/rest/producer/jms20 )来调用生产者EJB。

JMS生产者

现在,这里开始变得有趣。 在下面,您可以找到SLSB JMS消息产生器的JMS 1.1代码:

@Stateless 
public class JMS11Producer {@Resource(lookup = "jms/__defaultConnectionFactory")private ConnectionFactory connectionFactory;@Resource(lookup = "jms/queue/myqueue")private Queue queue;@Path("/jms11")@GETpublic String produce() {String status = "OK";Connection connection = null;try {connection = connectionFactory.createConnection();Session session = connection.createSession(true, 0);MessageProducer producer = session.createProducer(queue);BusinessObject payload = new BusinessObject(UUID.randomUUID().toString());ObjectMessage message = session.createObjectMessage();message.setObject(payload);producer.send(message);} catch (JMSException e) {status = e.getMessage();} finally {if (connection != null) {try {connection.close();} catch (JMSException e) {status = e.getMessage();}}}return status;}
}

尽管JAX-RS结果状态出现问题,但这是一个令人费解的样板代码,模糊了方法的主要职责。 它应该只向队列发送一条消息,但是它却做了很多事情。 它会创建一个连接,会话(包括讨厌的,忽略的参数在内),对象类型的消息,将其初始化,然后最终将消息发送到队列中……哦,是的–当然,不要忘记检查异常和嵌套的try / catch块。 我们可以尝试去优化它-通过创建连接移动到一些如@PostConstruct方法和关闭,以@PreDestroy -但它仍然有很多unnecesary噪音。

现在,让我们看一下功能上与JMS 2.0中表达的代码相同的代码:

@Stateless 
public class JMS20Producer {@Resource(lookup = "jms/queue/myqueue")private Queue queue;@Injectprivate JMSContext jmsContext;@Path("/jms20")@GETpublic String produce() {BusinessObject payload = new BusinessObject(UUID.randomUUID().toString());jmsContext.createProducer().send(queue, payload);return "OK";}
}

很整洁吧? 弄清楚此方法的作用要容易得多:它创建有效负载并将其发送到队列。 就这样–这就是方法的全部内容。 异常处理,连接和会话创建,消息类型–一切都为我们完成。 如果可以将这些职责转移到容器上以减轻开发人员的生活负担,那么为什么不这样做呢?

让我们看一下此示例中使用的一些JMS 2.0功能:

  • 不需要ConnectionFactory
  • 无需ConnectionSession
  • JMSContext是结合了ConnectionSession功能的新对象。 它可以通过容器注入,
  • 没有检查的异常–仅JMSRuntimeException
  • 用于消息生成的链调用使其更易于阅读。

JMS消费者

自JMS 1.1以来,Message Consumer并未发生太大变化。 它仍然是MDB,但是现在由于使用message.getBody(Clazz)进行消息投射,更容易达到预期的有效负载:

@MessageDriven(mappedName = "jms/queue/myqueue") 
public class Consumer implements MessageListener {@Overridepublic void onMessage(Message message) {try {// In JMS 1.1://          ObjectMessage objectMessage = (ObjectMessage)message;//          BusinessObject payload = (BusinessObject)objectMessage.getObject();BusinessObject payload = message.getBody(BusinessObject.class);System.out.println("Message received: " + payload);} catch (JMSException e) {System.err.println("Error while fetching message payload: " + e.getMessage());}}
}

结论

这只是对JMS 2.0的快速浏览。 但是,我发现有趣的是,与JMS 1.1相比,可以产生多少更清晰的代码。 有关JMS 2.0的更多详细信息,请查看其正式规范 。

参考:来自Piotr Nowicki博客博客的JCG合作伙伴 Piotr Nowicki的Java EE 7:带有Glassfish v4的JMS 2.0 。

翻译自: https://www.javacodegeeks.com/2013/05/java-ee-7-jms-2-0-with-glassfish-v4.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css的优先级笔记

个人小站点&#xff1a;https://sundjly.github.io/ 来自《精彩绝伦的css》 1.css的优先级我们是用选择器的“特殊程度”&#xff1a; 每个元素的描述贡献&#xff08;如div&#xff0c;ul&#xff09;为0,0,0,1每个类&#xff08;class&#xff09;、伪类&#xff08;如:ho…

linux上验证cudnn是否安装成功_deepin15.7中安装tensorflow+cuda9.0+cudnn7的步骤

这次deepin15.7大更新&#xff0c;特别是深度学习环境搭建屡屡失败&#xff0c;很是恼火。本次按照下面的步骤做成功了&#xff0c;以下是deepin15.7下安装tensorflowcuda9.0cudnn7的全部流程。硬件1.神舟战神z7-kp7s1&#xff0c;双显卡双硬盘2.独显是gtx1060 6G系统安装1.下载…

AES加密和解密

来源1 来源2 1 { JsonSerializer serializer new JsonSerializer(); string[] strArray { "111","222","333","444","555","666"}; Boy boy new Boy(); boy.Age 15; boy.bir Convert.ToDateTime("1999…

[心平气和读经典]The TCP/IP Guide(003)

The TCP/IP Guide [Page 43, 44] Scope of The TCP/IP Guide | 本书的讨论范围 The first step to dealing with a problem is recognizing that you have one. So, I have to come clean with you, my reader. I have a problem: an addiction to... detail. :-) Every time I…

使用jclouds在S3上分段上传

1.目标 在上一篇文章中 &#xff0c;我们研究了如何使用jclouds中的通用Blob API将内容上传到S3。 在本文中&#xff0c;我们将使用jclouds的S3特定的异步API上传内容并利用S3提供的分段上传功能。 2.准备 2.1。 设置自定义API 上传过程的第一部分是创建jclouds API-这是针对…

【ichart】简单的统计图表ichart.js的使用

1、首先下载&#xff0c;点击下载 2、只需要这一个js&#xff0c;粘贴赋值到自己项目中即可。 3、引入js <script type"text/javascript" src"../js/ichart.1.2.min.js"></script> <script type"text/javascript" src"..…

java单击切换div_[Java教程]点击同一按钮实现div的隐藏与现实切换

[Java教程]点击同一按钮实现div的隐藏与现实切换0 2016-01-16 21:00:12点击同一按钮实现div的隐藏与现实切换:在很多应用中&#xff0c;都有这样的功能&#xff0c;点击同一个按钮可以实现div的隐藏或者现实&#xff0c;当然操作的并非必须是按钮或者div&#xff0c;不过原理是…

python链表的实现,有注释

class Node(): #node实现,每个node分为两部分:一部分含有链表元素,成数据域;另一部分为指针,指向下一个 __slots__[_item,_next] #限定node实例的属性??? 这个元素就是有两部分组成,,,一个指针一个数据,,,但是链表头就不是这样了 def __init__(self…

ActiveMQ——activemq的使用java代码实例(精选)

ActiveMQ 在java中的使用&#xff0c;通过单例模式、工厂实现 Jms规范里的两种message传输方式Topic和Queue&#xff0c;两者的对比如下表()&#xff1a; TopicQueue概要Publish Subscribe messaging 发布订阅消息Point-to-Point 点对点有无状态topic数据默认不落地&#xff…

Java 8:正在运行的CompletableFuture

在Java 8中全面研究了CompletableFuture API之后&#xff0c;我们准备编写一个简单的Web搜寻器。 我们已经使用ExecutorCompletionService &#xff0c; Guava ListenableFuture和Scala / Akka解决了类似的问题。 我选择了相同的问题&#xff0c;以便轻松比较方法和实现技术。 …

java能不能修改文件大小信息_java上机考试3

考号: 000128000091 姓名: 张天義 学号: 1040610329 班级: 本科(计算机、微电、电工、经管)->计算机科学与技术 00:13:25一、单选(共80分)1. int count1;for(int i1;i<5;i){countcounti;}System.out.println(count);上述代码执行后的输出结果是A、15B、1C、16D、5标记此题…

(网页)中的简单的遮罩层

html: <div id"test"></div><div id"log_window"> <!--<a href"javascript:cancel_shield()">关闭</a>--> <!--<img src"assets/css/images/loading.gif" />--> <p style"fo…

即使在jdk中也有错误的代码

Java 7&#xff0c;TreeSet和NullPointerException。 最近&#xff0c;我尝试用Java 7编译一个用Java 6开发的项目。在执行测试过程中发生了很多有趣的事情&#xff0c;在Java 6中使用Java 7平稳运行的测试失败了&#xff01; 因此&#xff0c;我必须理解为什么&#xff0c;这就…

Eclipse+GitHub 提交代码错误 -“rejected - non-fast-forward”

Eclipse Push出现rejected - non-fast-forward错误 在 Push到服务器时有时会出现 rejected - non-fast-forward 错误&#xff0c;这是由于远端发生改变&#xff0c;此时再提交之前你需要将远端的改变合并到本地上错误原因&#xff1a;文件冲突&#xff0c;本地的代码和远程Repo…

两天学会css基础(一)

什么是css&#xff1f;css的作用是什么&#xff1f; CSS 指层叠样式表 (Cascading Style Sheets)主要作用就是给HTML结构添加样式&#xff0c;搭建页面结构&#xff0c;比如设置元素的宽高大小&#xff0c;颜色&#xff0c;位置等等。 学习css之前先了解一下css代码在HTML中的…

在Android项目中使用AspectJ

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 转载请表明出处&#xff1a;http://www.cnblogs.com/cavalier-/p/8888459.html 什么是AOP AOP是 Aspect Oriented Programming 的缩写&#xff0c;即面向切面编程&#xff0c;和平常遇到的面向对象O…

LVM 逻辑卷 (logica volume manager)

逻辑卷轴管理员 (Logical Volume Manager) 想像一个情况&#xff0c;你在当初规划主机的时候将 /home 只给他 50G &#xff0c;等到使用者众多之后导致这个 filesystem 不够大&#xff0c; 此时你能怎么作&#xff1f; 多数的朋友都是这样&#xff1a;再加一颗新硬盘&#xff0…

java中u怎么用_Java中interrupt的使用

通常我们会有这样的需求&#xff0c;即停止一个线程。在java的api中有stop、suspend等方法可以达到目的&#xff0c;但由于这些方法在使用上存在不安全性&#xff0c;会带来不好的副作用&#xff0c;不建议被使用。具体原因可以参考Why is Thread.stop deprecated。在本文中&am…

当Maven依赖插件位于

问题&#xff1a; 我们进行了一个集成测试&#xff0c;该测试创建了一个Spring ClassPathXmlApplicationContext &#xff0c;同时这样做导致NoSuchMethodError爆炸。 事实证明&#xff0c;我们对Spring构件的依赖版本存在冲突。 这本身不是一个不寻常的问题-使用Maven依赖插件…

sql查询语句for xml path语法

【原地址】 for xml path作用&#xff1a;将多行的查询结果&#xff0c;根据某一些条件合并到一行。 例&#xff1a;现有一张表 执行下面语句 select Department,(SELECT Employee, FROM People b WHERE b.Departmenta.Department For XML Path()) Student from People as a g…