tomee_Apache TomEE + JMS。 从未如此简单。

tomee

我记得J2EE (1.3和1.4)的过去,使用JMS启动项目非常困难。 您需要安装JMS 代理 ,创建主题队列 ,最后使用服务器配置文件和JNDI开始自己的战斗。

感谢JavaEE 6及其它,使用JMS确实非常简单。 但是,使用Apache TomEE更加容易上手。 在本文中,我们将了解如何创建和测试一个简单的应用程序,该应用程序使用Apache TomEEJMS队列发送消息或从JMS队列接收消息。

Apache TomEE使用Apache Active MQ作为JMS提供程序。 在此示例中,您不需要下载或安装任何东西,因为所有元素都将作为Maven依赖项提供,但是如果您计划(并且应该)使用Apache TomEE服务器,则需要下载Apache TomEE plus或Apache TomEE plume。 您可以在http://tomee.apache.org/comparison.html中了解有关Apache TomEE风味的更多信息。

依存关系

首先要做的是添加javaee-api作为提供的依赖关系,并添加junitopenejb-core作为测试依赖关系。 请注意,添加了openejb-core依赖项以使其具有运行时来执行测试,我们将在测试部分中对其进行深入了解。

<dependencies><dependency><groupId>org.apache.openejb</groupId><artifactId>javaee-api</artifactId><version>6.0-6</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.apache.openejb</groupId><artifactId>openejb-core</artifactId><version>4.7.1</version><scope>test</scope></dependency>
</dependencies>

商业代码

下一步是创建负责发送消息和从JMS 队列接收消息的业务代码。 它还包含一种从队列接收消息的方法。 对于此示例,我们将使用无状态 EJB

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;@Stateless
public class Messages {//Standard @Resource annotation is used to inject the ConnectionFactory. //If no name is provided using lookup or name attribute, //the fully qualified name of the class with an slash (/) and the name of the attribute is used. //In this example: java:comp/env/org.superbiz.jms.Messages/connectionFactory.@Resource private ConnectionFactory connectionFactory;//Standard @Resource annotation is used to inject the Queue. //If no name is provided using lookup or name attribute, //the fully qualified name of the class with an slash (/) and the name of the attribute is used. //In this example: java:comp/env/org.superbiz.injection.jms.Messages/chatQueue.@Resource private Queue chatQueue;public void sendMessage(String text) throws JMSException {Connection connection = null;Session session = null;try {connection = connectionFactory.createConnection();//Connection is get from ConnectionFactory instance and it is started.connection.start(); //Creates a session to created connection.session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //Creates a MessageProducer from Session to the Queue.MessageProducer producer = session.createProducer(chatQueue);producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); TextMessage message = session.createTextMessage(text);//Tells the producer to send the messageproducer.send(message); } finally {if (session != null) session.close(); if (connection != null) connection.close();}}public String receiveMessage() throws JMSException {Connection connection = null;Session session = null;MessageConsumer consumer = null;try {connection = connectionFactory.createConnection();connection.start();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);consumer = session.createConsumer(chatQueue); //Waits for a message with timeout. Note that because a TextMessage is sent, the receive method expects a TextMessage too.TextMessage message = (TextMessage) consumer.receive(1000); return message.getText(); } finally {if (consumer != null) consumer.close();if (session != null) session.close();if (connection != null) connection.close();}}
}

Messages类的最重要部分是注意注入ConnectionFactory
在代码内将实例排队 。 您只需要使用@Resource批注,容器将为您完成其余工作。 最后请注意,由于我们尚未使用namelookup属性来设置名称,因此该字段的名称将用作资源名称。

测试

最后,我们可以编写一个测试来断言使用JMS队列发送和接收消息。 例如,我们可以使用Arquilian编写测试,但是由于这种情况,由于简单起见,我们将使用嵌入式OpenEJB实例来部署JMS示例并运行测试。

public class MessagesTest {//Messages EJB is injected.@EJBprivate Messages messages;@Beforepublic void setUp() throws Exception {Properties p = new Properties();//Embedded OpenEJB container is started.//And current test added inside created container//So we can use javaee annotations insideEJBContainer.createEJBContainer(p).getContext().bind("inject", this); }@Testpublic void shouldSendAndReceiveMessages() throws Exception {//Three messages are sent.messages.sendMessage("Hello World!"); messages.sendMessage("How are you?");messages.sendMessage("Still spinning?");//Three messages are received.assertThat(messages.receiveMessage(), is("Hello World!")); assertThat(messages.receiveMessage(), is("How are you?"));assertThat(messages.receiveMessage(), is("Still spinning?"));}}

请注意,测试确实非常简单明了,您只需要以编程方式启动EJB容器并将当前测试绑定到其中,这样我们就可以在测试中使用JavaEE批注。 其余的是一个简单的JUnit测试。

而且,如果您运行测试,您将收到绿色的子弹。 但是,等等,您可能想知道JMS 代理及其配置在哪里? ConnectionFactoryJMS 队列的定义在哪里? 这就是OpenEJB (和Apache TomEE )发挥作用的地方。

在这种情况下, OpenEJB (和Apache TomEE )将以嵌入式模式使用Apache Active MQ ,因此您无需在计算机上安装Apache Active MQ即可运行测试。 此外, Apache TomEE将为您创建所有必需的资源。 例如,它会创建一个连接工厂和一个队列为你使用默认参数和预期的名称(org.superbiz.Messages / connectionFactory的用于连接工厂org.superbiz.Messages / chatQueue队列 ),所以你不必担心到在测试阶段配置JMSApache TomEE足够聪明,可以为您创建和配置它们。

您可以通过阅读下一条日志消息来检查控制台输出,以了解资源是自动创建的: INFO:自动创建资源

Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig processResourceRef
INFO: Auto-linking resource-ref 'java:comp/env/org.superbiz.Messages/connectionFactory' in bean Messages to Resource(id=Default JMS Connection Factory)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.ConfigurationFactory configureService
INFO: Configuring Service(id=org.superbiz.Messages/chatQueue, type=Resource, provider-id=Default Queue)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig logAutoCreateResource
INFO: Auto-creating a Resource with id 'org.superbiz.Messages/chatQueue' of type 'javax.jms.Queue for 'Messages'.
Jan 10, 2015 10:32:48 AM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Resource(id=org.superbiz.Messages/chatQueue)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig processResourceEnvRef
INFO: Auto-linking resource-env-ref 'java:comp/env/org.superbiz.Messages/chatQueue' in bean Messages to Resource(id=org.superbiz.Messages/chatQueue)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.ConfigurationFactory configureService
INFO: Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig createContainer
INFO: Auto-creating a container for bean javaee.MessagesTest: Container(type=MANAGED, id=Default Managed Container)

就这样,借助Java EETomEEJMS真的非常容易上手 。 在下一篇文章中,我们将看到如何使用消息驱动Bean (MDB)进行相同的操作。

翻译自: https://www.javacodegeeks.com/2015/01/apache-tomee-jms-it-has-never-been-so-easy.html

tomee

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

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

相关文章

娄底二中高考2021成绩查询,2021年娄底高考状元名单公布,娄底高考状元学校资料及最高分...

2019年高考已经落下帷幕&#xff0c;高考放榜时刻就要到来&#xff0c;每年的高考状元都会被各界高度关注&#xff0c;那么今年娄底高考状元花落谁家呢&#xff1f;娄底高考状元会给人带来惊喜吗&#xff0c;让我们一起期待2019年娄底高考状元的诞生。下面小编为给为梳理下历年…

C 常指针

C 指向对象的常指针C 定义指向对象的常指针的一般形式为 类名 * const指针变量名&#xff1b;也可以在定义指针变量时使之初始化在C 中&#xff0c;虽然指向对象的常指针变量的值不能改变&#xff0c;但可以改变其所指向对象的值&#xff0c;如果想将一个指针变量固定地与一个对…

microsoftexchange邮箱容量怎样看_企业邮箱申请注册的要求有哪些?_网站建设_创客网络...

随着现在互联网信息化发展的速度不断加快&#xff0c;企业邮箱作为企业之间信息传输的重要工具&#xff0c;其重要性不亚于企业网站&#xff0c;但市场上企业邮箱种类繁多&#xff0c;包含的功能也各不相同&#xff0c;稍有差异&#xff0c;你知道怎么去选择好企业邮箱吗&#…

java 登陆验证失败_使用Java 8流进行快速失败的验证

java 登陆验证失败我已经失去了看过使用快速失败验证代码状态的代码的次数&#xff0c;方法如下&#xff1a; public class PersonValidator {public boolean validate(Person person) {boolean valid person ! null;if (valid) valid person.givenName ! null;if (valid) v…

Unity中Shader观察空间推导(在Shader中实现)

文章目录 前言一、观察空间矩阵推导1、求观察空间基向量2、求观察空间的基向量在世界空间中的矩阵 的 逆矩阵2、求平移变换矩阵3、相乘得出 观察空间转化矩阵4、得到顶点的世界空间坐标&#xff0c;然后转化到观察空间5、把观察空间坐标转化为齐次裁剪坐标输出到屏幕 二、最终效…

计算机应用技术一级考试成绩,《计算机应用基础》课程与等级考试成绩的关系...

《闽南师范大学关于计算机应用基础课程成绩的暂行规定》(闽南师大〔2016〕197号)已于2016年7月12日下发&#xff0c;但在执行过程总有包括教务员及学生在内各种人员的种种疑问及错误理解与传达&#xff0c;现在梳理如下&#xff1a;一、开设有《计算机应用基础》课程的学生&…

C 常引用

C 对象常引用在C 中&#xff0c;常用常指针和常引用作函数参数&#xff0c;既能保证数据安全&#xff0c;使数据不能被随意修改&#xff0c;在调用函数时又不必建立实参的拷贝。用常指针和常引用作函数参数&#xff0c;可以提高程序运行效率。在C 中&#xff0c;如果变量名和引…

jasonencode php_PHP的json_encode()函数与JSON对象

一、问题描述这周搬砖的时候&#xff0c;前端通过ajax获取后端的数据后&#xff0c;照例用 对象.属性 的方式取值&#xff0c;然而结果总是总是不能如预期般展示在页面上。先写个 demo 还原下场景&#xff1a;选中一个下拉框列表选项后&#xff0c;会在下拉框下面展示文字。这是…

intext:企业_企业中的微服务:敌是友?

intext&#xff1a;企业宏观问题的微观解决方法&#xff1f; 微服务的炒作无处不在&#xff0c;尽管业界似乎无法就确切的定义达成共识&#xff0c;但我们一再被告知&#xff0c;从单一应用程序转向由小型服务组成的面向服务的体系结构&#xff08;SOA&#xff09;是正确的方法…

mui hello html5 安装,HBuilder开发App Step1——环境搭建,HelloMUI 以及真机调试(示例代码)...

No1. 必须搭建java环境只需要最基础的java环境&#xff0c;也就是cmd下可以运行java和javac即可&#xff0c;具体教程请自行百度&#xff0c;都会有很详细的教程&#xff0c;这里不重点介绍。No2. 下载安装HBuilder下载完成后请将zip包解压缩到自定义的目录(windows)&#xf…

C 析构函数

C 析构函数概述C 析构函数是一个特殊的成员函数&#xff0c;作用与构造函数相反&#xff0c;它的名字是类名的前面加一个&#xff5e;符号&#xff0c;析构函数是与构造函数作用相反的函数&#xff0c;当对象的生命期结束时&#xff0c;会自动执行析构函数。C 执行析构函数的情…

前后端分离的项目部署到tomcat_前后端分离后,tomcat服务器部署和发布

打包服务端&#xff1a;IDEA打开项目&#xff0c;等待项目初始化完成&#xff0c;点击Build- Build Artifacts&#xff0c;进行打包image.png点击之后会出现下面这个小窗口&#xff0c;选择红框中部分&#xff1a;image.png这个过程就是打包了&#xff0c;等待打包完成之后&…

vue 侦听器侦听对象属性_不删除侦听器–使用ListenerHandles

vue 侦听器侦听对象属性听一个可观察的实例并对它的变化做出React很有趣。 做一些必要的事情来打断或结束这种聆听会变得很有趣。 让我们看看问题的根源和解决方法。 总览 这篇文章将首先讨论这种情况&#xff0c;然后再讨论常见的方法和问题所在。 然后&#xff0c;它将提供解…

华硕笔记本桌面没有显示计算机,华硕笔记本的桌面不见了,急求高手解答

满意答案下放工人2013.04.06采纳率&#xff1a;54% 等级&#xff1a;12已帮助&#xff1a;5701人★桌面&#xff0d;点击鼠标右键&#xff0d;点击排列图标&#xff0d;点击显示桌面图标★在桌面上右键点击→“属性”→桌面项→左下有个“自定义桌面”进入设置&#xff0c;把…

Facebook开源 C++11 组件库,真香!

Folly是Facebook open source library的缩写&#xff0c;提供了类似 Boost 和 std 库的功能。包括散列、字符串、向量、内存分配、位处理等&#xff0c;满足大规模高性能的需求。逻辑设计Folly 是一组相对独立的组件&#xff0c;有的简单到几个符号。对内部依赖没有限制&#x…

sentinel接入网关应用_接入容器服务Kubernetes版应用

server:port: 8090# Eurekaeureka:instance:leaseRenewalIntervalInSeconds: 10leaseExpirationDurationInSeconds: 30client:enabled: true #若希望开启Euerka支持&#xff0c;则置为true并将其它服务发现置为false。serviceUrl:defaultZone: http://my-eureka-ack-springclou…

undertow ssl_SSL与WildFly 8和Undertow

undertow ssl我一直在研究WildFly 8的一些安全性主题&#xff0c;偶然发现了一些没有很好记录的配置选项。 其中之一是用于新的Web子系统Undertow的TLS / SSL配置。 有很多关于较旧的Web子系统的文档&#xff0c;并且确实仍然可以使用&#xff0c;但是这里是使用新方法进行配置…

div alert html,基于jQuery的弹出消息插件 DivAlert之旅(一)

想着自己学习Javascript&#xff0c;以及Ajax、jQuery等已经有一段时间了&#xff0c;不过貌似还没有写过一个插件&#xff0c;看到jQuery官网上那么多令人眼前一亮的插件&#xff0c;自己今天也动心说是不是能够写一个类似的插件来瞧瞧&#xff0c;了解了jQuery插件的基本格式…

C++对象的动态建立

C对象的动态建立和释放在C中&#xff0c;如果定义的对象是静态的&#xff0c;在程序运行过程中&#xff0c;对象所占的空间是不能随时释放的。为提高内存空间的利用率&#xff0c;希望在需要用到对象时才建立对象&#xff0c;在不需要用该对象时就撤销它&#xff0c;释放它所占…

java字符连接字符串数组_Java中连接字符串的最佳方法

java字符连接字符串数组最近有人问我这个问题–在Java中使用运算符连接字符串是否对性能不利&#xff1f; 这让我开始思考Java中连接字符串的不同方法&#xff0c;以及它们如何相互对抗。 这些是我要研究的方法&#xff1a; 使用运算符 使用StringBuilder 使用StringBuffer…