JMS를 사용하는 Apache CXF

앞서 언급했듯이 JMS 전송과 함께 CXF를 사용할 수 있습니다. 이 경우 클라이언트는 JMS 메시지를 알려진 Messaging Server로 보냅니다. 우리의 서버 응용 프로그램은 들어오는 메시지에 대해 메시징 서버를 지속적으로 수신합니다. 메시지가 도착하면 메시지를 처리하고 클라이언트 요청을 실행하고 응답을 다른 메시지로 클라이언트에 보냅니다.

이전과 같이 먼저 다음과 같은 단일 웹 메서드를 제공하는 샘플 서버 애플리케이션을 만듭니다. sayHi.

서비스 인터페이스 생성

우리의 서비스 인터페이스 HelloWorld 서비스는 여기에 표시됩니다-

//HelloWorld.java
package com.tutorialspoint.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface HelloWorld {
   @WebMethod
   String sayHi(@WebParam(name = "name") String name);
}

서비스 구현

서비스 인터페이스의 구현은 다음과 같이 정의됩니다-

//HelloWorldImpl.java
package com.tutorialspoint.service.impl;

import javax.jws.WebService;
import com.tutorialspoint.service.HelloWorld;

@WebService
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String sayHi(String name) {
      return "Hello " + name;
   }
}

구현은 단순히 사용자에게 Hello 메시지를 반환합니다. 보시다시피 인터페이스와 그 구현은 지금까지 공부 한이 튜토리얼의 모든 이전 프로젝트와 유사합니다.

이제 가장 중요한 점은 메시지 대기열을 설정하고 수신 메시지를 계속 수신하는 서버 응용 프로그램을 만드는 것입니다.

서버 생성

서버 애플리케이션에서 먼저 JMS 다음과 같이 끝점-

private static final String JMS_ENDPOINT_URI =
   "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000"
      + "&jndiConnectionFactoryName=ConnectionFactory"
      + "&jndiInitialContextFactory"
      + "= org.apache.activemq.jndi.ActiveMQInitialContextFactory"
      + "&jndiURL = tcp://localhost:61616";

지정된 시간 동안 유지되는 지정된 포트에 대기열을 설정했습니다. 이제 인스턴스화하여 메시징 서비스를 만듭니다.org.apache.activemq.broker.BrokerService수업. 이것은 서버 클래스입니다ActiveMQ 메시징 서버.

BrokerService broker = new BrokerService();

귀하가 선택한 다른 메시징 서버를 사용할 수 있습니다. ActiveMQ. 이제이 서버를 원하는 URI에 연결합니다.

broker.addConnector("tcp://localhost:61616");

수신 메시지의 데이터 저장을위한 디렉토리를 설정했습니다.

broker.setDataDirectory("target/activemq-data");

마지막으로 시작 방법을 사용하여 서버를 시작합니다.

broker.start();

다음으로 서비스 빈의 인스턴스를 만듭니다. HelloWorld 이전 POJO 애플리케이션에서 사용 된 서버 팩토리 빈 클래스 사용-

Object implementor = new HelloWorldImpl();
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloWorld.class);

다음으로, 공장에서 수신 메시지를 계속 수신하도록 공장에 JMS 엔드 포인트를 설정합니다.

factory.setTransportId
(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress(JMS_ENDPOINT_URI);

마지막으로 팩토리에서 구현 자 클래스를 설정하고 실행을 시작합니다.

factory.setServiceBean(implementor);
factory.create();

이 시점에서 서버가 실행 중입니다. POJO 애플리케이션에서와 같이 factory bean 클래스를 사용했기 때문에 CXFServlet 및 web.xml 파일이 필요하지 않습니다.

전체 서버 애플리케이션 코드는 다음과 같습니다.

//ServerJMS.java
package com.tutorialspoint.server;

import java.util.Collections;
import org.apache.cxf.ext.logging.LoggingFeature;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.transport.jms.spec.JMSSpecConstants;
import com.tutorialspoint.service.HelloWorld;
import com.tutorialspoint.service.impl.HelloWorldImpl;
import org.apache.activemq.broker.BrokerService;

public final class ServerJMS {

   private static final String JMS_ENDPOINT_URI = 
      "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000"
         + "&jndiConnectionFactoryName=ConnectionFactory"
         + "&jndiInitialContextFactory"
         + "= org.apache.activemq.jndi.ActiveMQInitialContextFactory"
         + "&jndiURL = tcp://localhost:61616";

   public static void main(String[] args) throws Exception {

      BrokerService broker = new BrokerService();
      broker.addConnector("tcp://localhost:61616");
      broker.setDataDirectory("target/activemq-data");
      broker.start();

      Object implementor = new HelloWorldImpl();
      JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
      factory.setServiceClass(HelloWorld.class);
      factory.setTransportId
      (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
      factory.setAddress(JMS_ENDPOINT_URI);
      factory.setServiceBean(implementor);
      factory.setFeatures(Collections.singletonList(new LoggingFeature()));
      factory.create();

      System.out.println("Server ready...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting");
      System.exit(0);
   }
}

종속성 추가

우리가 만든 서버 응용 프로그램은 ActiveMQ 메시징 서버를 사용합니다. 따라서 프로젝트에 몇 가지 종속성을 추가해야합니다. 추가로 필요한 종속성을 이해할 수 있도록 전체 pom.xml 파일이 여기에 표시됩니다.

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>cxf-jms</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
   </properties>

   <profiles>
      <profile>
         <id>server</id>
         <build>
            <defaultGoal>test</defaultGoal>
            <plugins>
               <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <version>1.6.0</version>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>java</goal>
                        </goals>
                        <configuration>
                           <mainClass>
                              com.tutorialspoint.server.ServerJMS
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
      <profile>
         <id>client</id>
         <build>
            <defaultGoal>test</defaultGoal>
            <plugins>
               <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>java</goal>
                        </goals>
                        <configuration>
                           <mainClass>
                              com.tutorialspoint.client.ClientJMS
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>

   <dependencies>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>activemq-broker</artifactId>
         <version>5.15.8</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>activemq-kahadb-store</artifactId>
         <version>5.15.8</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>3.3.0</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-jms</artifactId>
         <version>3.3.0</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-features-logging</artifactId>
         <version>3.3.0</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
</project>

실행중인 서버

서버 실행을 시작하려면 이전 사례에서와 같이 명령 창에 다음 명령을 입력하십시오.

mvn -Pserver

그러면 ActiveMQ 메시지 서버가 시작되고 메시징 큐가 설정되며이 큐를 계속 수신하는 팩토리 빈이 생성됩니다.

다음 작업은 클라이언트 애플리케이션을 만드는 것입니다.

클라이언트 생성

클라이언트 애플리케이션에서 먼저 서버 애플리케이션에서 사용되는 것과 동일한 JMS 엔드 포인트를 설정합니다.

private static final String JMS_ENDPOINT_URI =
   "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000"
      + "&jndiConnectionFactoryName=ConnectionFactory"
      + "&jndiInitialContextFactory"
      + " = org.apache.activemq.jndi.ActiveMQInitialContextFactory"
      + "&jndiURL = tcp://localhost:61616";

POJO 애플리케이션 에서처럼 공장을 생성합니다.

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

엔드 포인트 URI와 구현 자 클래스를 다음과 같이 설정합니다.

factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress (JMS_ENDPOINT_URI);
HelloWorld client = factory.create(HelloWorld.class);

마지막으로 서비스 메서드를 호출하고 결과 출력을 인쇄합니다.

String reply = client.sayHi("TutorialsPoint");
System.out.println(reply);

전체 클라이언트 코드는 다음과 같습니다.

// ClientJMS.java
package com.tutorialspoint.client;

import com.tutorialspoint.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.jms.spec.JMSSpecConstants;

public final class ClientJMS {
   private static final String JMS_ENDPOINT_URI =
   "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000"
   + "&jndiConnectionFactoryName=ConnectionFactory"
   + "&jndiInitialContextFactory"
   + " = org.apache.activemq.jndi.ActiveMQInitialContextFactory"
   + "&jndiURL = tcp://localhost:61616";

   public static void main(String[] args) throws Exception {
      JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
      factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
      factory.setAddress(JMS_ENDPOINT_URI);
      HelloWorld client = factory.create(HelloWorld.class);
      String reply = client.sayHi("TutorialsPoint");
      System.out.println(reply);
      System.exit(0);
   }
}