Spring사용해서 POJO로 JMS하기 (ActiveMQ)

1. ActiveMQ 프로젝트를 다운로드 받습니다.(브로커를 실행해야 하기 때문에…)
2. Writer 작성하기
3. Reader 작성하기
4. bean 설정하기
    4-1. MessageListenerAdapter 로 Reader 등록하기.
    4-2. Writer 등록하기.
    4-3. ActiveMQConnectionFactory 등록하기.
    4-4. ActiveMQQueue 등록하기.
    4-5. Message Converter 등록하기.
    4-6. JMS Template 등록하기.
    4-7. Message Listener Container 등록하기.
5. 테스트.
    5-1. ActiveMQ 브로커 실행.
    5-2. 테스트 클래스 실행.

등록할 bean들이 조금 많지만, 다들 몇 줄 안 되고 필요한 이유를 알게 된다면 그리 어렵지 않습니다.

1. ActiveMQ 다운로드
http://activemq.apache.org/activemq-411-release.html

2. Writer 작성하기.

public class MessageWriter {

    private JmsTemplate jmsTemplate;

    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void write(DTO dto){
        jmsTemplate.convertAndSend(dto);
    }
}

3. Reader 작성하기.

public class MessageReader {

    public void readMessage(DTO dto){
        DTO recievedDto = (DTO)dto;
        System.out.println(recievedDto.getName());
    }
}

Writer의 경우 스프링 API(JmsTemplate)에 종속성이 생겨서 사알짝 POJO라고 할 수 있지만, Reader의 경우는 완전한 POJO입니다.

4. bean 설정하기.

4-1. MessageListenerAdapter 로 Reader 등록하기.

    <bean id=”messageReader”
        class=”org.springframework.jms.listener.adapter.MessageListenerAdapter”>
        <property name=”delegate”>
            <bean class=”MessageReader” />
        </property>
        <property name=”defaultListenerMethod” value=”readMessage” />
        <property name=”messageConverter” ref=”dtoConverter” />
    </bean>

4-2. Writer 등록하기.

    <bean id=”messageWriter” class=”MessageWriter”>
        <property name=”jmsTemplate” ref=”jmsTemplate” />
    </bean>

4-3. ActiveMQConnectionFactory 등록하기.

    <bean id=”connectionFactory”
        class=”org.apache.activemq.ActiveMQConnectionFactory”>
        <property name=”brokerURL” value=”tcp://localhost:61616″ />
    </bean>

4-4. ActiveMQQueue 등록하기.

    <bean id=”queue”
        class=”org.apache.activemq.command.ActiveMQQueue”>
        <constructor-arg index=”0″ value=”whitehsip.test.queue1″ />
    </bean>

4-5. Message Converter 등록하기.
    <bean id=”dtoConverter” class=”DtoConverter” />

4-6. JMS Template 등록하기.

    <bean id=”jmsTemplate”
        class=”org.springframework.jms.core.JmsTemplate”>
        <property name=”connectionFactory” ref=”connectionFactory” />
        <property name=”defaultDestination” ref=”queue” />
        <property name=”messageConverter” ref=”dtoConverter” />
    </bean>

4-7. Message Listener Container 등록하기.

    <bean
        class=”org.springframework.jms.listener.SimpleMessageListenerContainer”>
        <property name=”connectionFactory” ref=”connectionFactory” />
        <property name=”destination” ref=”queue” />
        <property name=”messageListener” ref=”messageReader” />
    </bean>

5. 테스트.

5-1. ActiveMQ 브로커 실행.
다운받은 ActiveMQ의 bin 폴더의 activemq.bat 파일을 실행합니다.

5-2. 테스트 클래스 실행.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={“/springContext.xml”})
public class QueueTest {

    @Autowired
    private MessageWriter messageWriter;

    @Test
    public void testActiveMQJMS() throws Exception {
        DTO sendingDto = new DTO();
        sendingDto.setName(“기선”);
        messageWriter.write(sendingDto);
    }

}

콘솔창에 “기선” 이라고 찍히면 됩니다.

RMI + Spring

Remoting 기능을 지원해줍니다. 스프링을 사용하면 매우 간단하게 RMI를 사용할 수 있습니다.

서비스를 제공하는 쪽

1. POJO로 서비스 인터페이스 구현체 개발
2. RmiServiceExporter 등록하기

인터페이스는 더이상 Remote 인터페이스를 확장하지 않아도 됩니다.

package chapter8.client;

public interface EchoService {

    // word를 세 번 반복한 문자열을 반환합니다.
    String say(String word);
}

구현체의 메소드들은 더이상 RemoteException을 던지지 않아도 됩니다.

package chapter8.server;

import chapter8.client.EchoService;

public class EchoServiceImpl implements EchoService {

    public String say(String word) {
        StringBuilder builder = new StringBuilder(word);
        for (int i = 0; i < 2; i++) {
            builder.append(word);
        }
        return builder.toString();
    }

}

스프링 설정 파일에 서비스 구현체와 Exporter를 설정해줍니다.

    <bean id=”echoService” class=”chapter8.server.EchoServiceImpl” />

    <bean class=”org.springframework.remoting.rmi.RmiServiceExporter”>
        <property name=”service” ref=”echoService” />
        <property name=”serviceName” value=”EchoService” />
        <property name=”serviceInterface”
            value=”chapter8.client.EchoService” />
    </bean>

RmiServiceExporter가 기본으로 로컬에 1099 포트에 RMI 레지스트리가 있는지 확인하고 있으면 서비스를 등록하고, 없으면 RMI 레지스트리를 새로 만들어 실행한 다음 서비스를 추가합니다. 이 모든일을 알아서 해주기 때문에 개발자는 할 일이 없습니다.(하고 싶다면, 레지스트리 위치 설정과 포트 설정을 할 수 있겠죠. 그 때는 registryHost 속성과 registryPort 속성에 원하는 값을 설정해 주면 됩니다.)

서비스를 사용하는 쪽

1. 마치 서비스가 로컬에 존재하는 듯이 코딩합니다.
2. 스프링 설정 파일에서 RmiProxyFactoryBean을 사용하여 원하는 서비스를 bean으로 설정합니다.

테스트 코드입니다.

package chapter8;

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import chapter8.client.Keesun;

public class KeesunTest extends AbstractDependencyInjectionSpringContextTests {

    @Override
    protected String[] getConfigLocations() {
        return new String[] { “chapter8/client/springContext.xml” };
    }

    private Keesun keesun;

    public void setKeesun(Keesun keesun) {
        this.keesun = keesun;
    }

    public void testDI() throws Exception {
        assertNotNull(keesun);
    }

    public void testEcho() throws Exception {
        String echoResult = keesun.yaahoo(“Spring”);
        assertEquals(“SpringSpringSpring”, echoResult);
    }
}

Keesun 이란 클래스가 EchoService를 사용하고 있습니다.

package chapter8.client;

public class Keesun {

    private EchoService echoService;

    public void setEchoService(EchoService echoService) {
        this.echoService = echoService;
    }

    public String yaahoo(String word){
        return echoService.say(word);
    }
}

마지막으로 스프링 설정 파일에 Keesun과 EchoService를 bean으로 등록해 줍니다.

    <bean id=”keesun” class=”chapter8.client.Keesun” />

    <bean id=”echoService”
        class=”org.springframework.remoting.rmi.RmiProxyFactoryBean”>
        <property name=”serviceUrl”
            value=”rmi://localhost/EchoService” />
        <property name=”serviceInterface”
            value=”chapter8.client.EchoService” />
    </bean>

확인하기

1. Server 실행하기
2. Test 코드(Client) 실행하기.

레지스트리 서버를 동작시키려면 서비스를 제공하는 측 스프링 설정 파일을 읽어들이면서 Exporter bean을 생성하면되겠죠.

package chapter8;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EchoServiceServer {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“chapter8/server/springContext.xml”);
    }
}

다음은 위에서 작성했던 KeesunTest를 실행해 줍니다.

사용자 삽입 이미지

스프링 스터디 소스코드 공유

스프링 스터디에서 사용할 소스코드를 구글코드로 공유합니다. 한 동안 프로젝트의 크기가 10메가를 넘지 않아서 그냥 압축파일로 올려드렸었는데요, 이제는 거의 20메가가 다 되가기 때문에 티스토리에 올리려면 분할압축을 해야합니다. 그게 너무 귀찮아서 그냥 svn에 올리도록 하겠습니다.

이제부터는 스프링 스터디 하루나 이틀전에 체크아웃 받으셔서 발표 때 사용할 소스코드도 미리 참조하고 오실 수 있습니다.

http://whiteship.googlecode.com/svn/

이 주소를 SVN Repositories 뷰에서 추가해 주시면 됩니다. 이클립스에서 subversive를 사용하여 프로젝트를 체크아웃 받는 방법은 다음 글을 참조하시면 됩니다.

2007/07/02 – [Good Tools] – Subversive 사용하기