前一节讲到Petals ESB使用JMS连接ActiveMQ到总线 ,其中因为开发版本的不同和一些细节的配置不到,很难能够正确的使用JMS,如果遇到复杂的JMS需求时,这种方式操作太多,太发太多,而且不容易控制。Petals ESB 4.2支持的要比4.1版本好些。
这一节讲述一下使用JSR181标准的开发方法,完成Petals ESB与ActvieMQ的交互。开发者可能按照这个实现思路来实现多种MQ的接入,或者就叫做Queue Manager.
如下是操作步骤:
一、创建一个JSR181标准的生产者
1)New->Service Provider(SU)->选择JSR181,如图:
2)保存为su-Jsr181-ActiveMq-provide,下一步,如下图:(注意驼峰命名规则)
3),修改自动生成的ActiveMq.java文件。
import javax.jws.WebMethod; import javax.jws.WebResult; import javax.jws.WebService; /** * Here is a sample JAX-WS implementation. * <p> * For more information about JAX-WS, please visit * <b>https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html</b>. * </p> * */ @WebService(serviceName = "ActiveMq", targetNamespace = "http://itownet.com", portName = "ActiveMqPort") public class ActiveMq { /** * Displays "Hello World!". */ @WebMethod(operationName = "putMessage") public void putMessage() { Sender sender = new Sender(); sender.putMesssage(); } @WebMethod(operationName = "getMessage") @WebResult(name = "returnMessage") public String getMessage() { Receiver receiver = new Receiver(); return receiver.getMessage(); } }
4)发送到ActiveMq的示例类Sender.java
import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class Sender { private static final int SEND_NUMBER = 5; public static void putMesssage() { // ConnectionFactory :连接工厂,JMS 用它创建连接 ConnectionFactory connectionFactory; // Connection :JMS 客户端到JMS Provider 的连接 Connection connection = null; // Session: 一个发送或接收消息的线程 Session session; // Destination :消息的目的地;消息发送给谁. Destination destination; // MessageProducer:消息发送者 MessageProducer producer; // TextMessage message; // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://192.168.21.247:61616"); try { // 构造从工厂得到连接对象 connection = connectionFactory.createConnection(); // 启动 connection.start(); // 获取操作连接 session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 destination = session.createQueue("QM_000000"); // 得到消息生成者【发送者】 producer = session.createProducer(destination); // 设置不持久化,此处学习,实际根据项目决定 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 构造消息,此处写死,项目就是参数,或者方法获取 sendMessage(session, producer); session.commit(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } } public static void sendMessage(Session session, MessageProducer producer) throws Exception { for (int i = 1; i <= SEND_NUMBER; i++) { TextMessage message = session .createTextMessage("ActiveMq 发送的消息" + i); // 发送消息到目的地方 System.out.println("发送消息:" + "ActiveMq 发送的消息" + i); producer.send(message); } } }
5)接收消息的实现类Receiver.java
import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class Receiver { public static String getMessage() { // ConnectionFactory :连接工厂,JMS 用它创建连接 ConnectionFactory connectionFactory; // Connection :JMS 客户端到JMS Provider 的连接 Connection connection = null; // Session: 一个发送或接收消息的线程 Session session; // Destination :消息的目的地;消息发送给谁. Destination destination; // 消费者,消息接收者 MessageConsumer consumer; connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://192.168.21.247:61616"); try { // 构造从工厂得到连接对象 connection = connectionFactory.createConnection(); // 启动 connection.start(); // 获取操作连接 session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 destination = session.createQueue("QM_000000"); consumer = session.createConsumer(destination); String returnMessage = ""; while (true) { // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s TextMessage message = (TextMessage) consumer.receive(100000); if (null != message) { System.out.println("收到消息" + message.getText()); returnMessage += ";" + message.getText(); } else { break; } } return returnMessage; } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } return "无消息!"; } }
注意,要把activeMQ相关的jar包导入到项目当中。也就是Build Path里。
最后,生成通过Petals->Fast Export to Petals,生成zip文件,先检查一下ZIP文件下有没有ActiveMq相关的jar包。如果没有,请手动把ActiveMq相关的包放在ZIP里,然后部署在Petals ESB当中。
二、JSR181的生产者生成WSDL服务
操作如下:
三、创建一个消费者
1)New->Service Consumer(SU),选择刚才的SOAP,本文想借消费者的调用放入到ActiveMqj里消费或者取回消息。
2)把项目保存为su-SOAP-ActiveMq-consume。
最后,通过Petals->Fast Export to Petals,生成zip文件,部署在Petals ESB当中。
通过观察Petals ESB的容器的部署情况,会发现生成一个Web service在ESB当中,比如:
http://192.168.21.187:8084/petals/services/ActiveMq?wsdl
四、使用soapUI完成测试。
创建soapUI的项目,并打开activeMq的控制台,观察结果。看看是否预期。
注意图示当中的观察点。
如上只为开发者提供JMS客户端调用的方法完成的实现,好处是可控性好,适合复杂业务逻辑。
相关推荐
JSR181(JavaTM Web Services Metadata for the JavaTM Platform)是Java社区进程发布的一个规范,它定义了一套注解,使得开发基于Java的WebService变得更加简洁和直观。本篇文章将深入探讨JSR181注解式WebService的...
org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar
标题 "xfire-jsr181-api-1.0-实例化webservic" 指的是使用XFire框架结合JSR 181规范来创建和实例化Web服务的过程。XFire是一款早期的Java Web服务实现,它提供了一种简单、高性能的方式来创建和消费SOAP服务。JSR ...
标题中的"使用jsr168标准开发portlet"是指基于Java Specification Request (JSR) 168标准来创建portlet应用程序。JSR 168是Java社区进程(Java Community Process)提出的一个标准,旨在规范portlet在企业级portlet...
webservice中用到的jar,xfire-jsr181-api-1.0-M1.jar,xfire-jsr181-api-1.0-M1.jar
xfire-jsr181-api-1.0-M1.jar xfire-jsr181-api-1.0-M1.jar
IBM Portal Portlet表明它是为IBM的Portal产品设计的,JSR168标签表示其遵循portlet开发的标准,而"js"则暗示了项目中使用了JavaScript技术,特别是用于前端交互和数据呈现。 从【压缩包子文件的文件名称】...
JSR286增强了事件处理能力,允许portlet通过发送和接收事件来与其他portlet进行更复杂的交互。这极大地提高了portlet之间的协作能力,并促进了更复杂应用场景的实现。 - **发送事件**:一个portlet可以向另一个...
在Eclipse中创建一个基于JSR181的Web服务涉及到Java Web Service(JWS)的开发,JSR181是Java Specification Request 181,它定义了用于Java平台的Web服务元数据标准。这个标准使得在Java中创建、部署和发现Web服务...
标签:apache-cfx-jsr181-jaxb-http-example-1.0.0.jar.zip,apache,cfx,jsr181,jaxb,http,example,1.0.0,jar.zip包下载,依赖包
《JSR 181 Web Services Metadata for the Java Platform》是针对Java平台的一套简化Web服务开发模型的标准规范。它旨在降低开发人员在实现企业级Web服务时所需掌握的技术知识量,通过减少对J2EE标准部署技术、API和...
JSR168和JSR268是两个与Java Portal技术相关的标准,它们主要涉及如何创建和管理可重用的、模块化的Web内容组件,这些组件可以在门户应用中集成和展示。 JSR168,全称为“portlet API 1.0”,于2003年发布,是...
基于JSR168的portlet精彩范例
文章专门针对具有 JSR 168 Portlet 开发基础,并且想了解 JSR 286 Portlet 新特性和开发流程的开发人员。在学习完本系列后,您将了解相对于 JSR 168 Portlet,JSR 286 Portlet 究竟提供了哪些增强功能, 以及这些...
【WebLogic Portal 8.1 开发 JSR 168 Portlets】是关于使用BEA WebLogic Portal 8.1版本开发遵循JSR 168标准的portlet的实践指南。JSR 168(Java Portlet)规范旨在促进portlet与门户之间的可移植性,确保portlet...
Portlet规范和API是Web应用程序开发中的重要组成部分,主要用于构建可重用的、交互式的Web组件。JSR(Java Specification Request)168和286是定义portlet标准的两个关键版本,它们由Java Community Process(JCP)...
jar包,亲测可用