306.6. 고급 사용 정보


306.6.1. 플러그 가능한 연결 리소스 관리

SJMS는 내장 연결 풀링을 통해 JMS 연결 리소스 관리를 제공합니다. 이를 통해 타사 API 풀링 논리를 사용할 필요가 없습니다. 그러나 J2EE 또는 OSGi 컨테이너에서 제공하는 컨테이너와 같은 외부 연결 리소스 관리자를 사용해야 하는 경우가 있을 수 있습니다. 이 SJMS의 경우 내부 SJMS 연결 풀링 기능을 재정의하는 데 사용할 수 있는 인터페이스를 제공합니다. 이 작업은 ConnectionResource 인터페이스를 통해 수행됩니다.

ConnectionResource 는 필요에 따라 연결을 차용하고 반환하는 방법을 제공합니다. 이는 SJMS 구성 요소에 연결 풀을 제공하는 데 사용되는 계약입니다. 사용자가 SJMS를 외부 연결 풀링 관리자와 통합해야 하는 경우 를 사용해야 합니다.

표준 ConnectionFactory 공급자에 대해서는 이 구성 요소에 최적화된 SJMS as-is 또는 extend와 함께 제공되는 ConnectionFactoryResource 구현을 사용하는 것이 좋습니다.

다음은 ActiveMQ PooledConnectionFactory 와 함께 플러그 가능한 ConnectionResource를 사용하는 예입니다.

public class AMQConnectionResource implements ConnectionResource {
    private PooledConnectionFactory pcf;

    public AMQConnectionResource(String connectString, int maxConnections) {
        super();
        pcf = new PooledConnectionFactory(connectString);
        pcf.setMaxConnections(maxConnections);
        pcf.start();
    }

    public void stop() {
        pcf.stop();
    }

    @Override
    public Connection borrowConnection() throws Exception {
        Connection answer = pcf.createConnection();
        answer.start();
        return answer;
    }

    @Override
    public Connection borrowConnection(long timeout) throws Exception {
        // SNIPPED...
    }

    @Override
    public void returnConnection(Connection connection) throws Exception {
        // Do nothing since there isn't a way to return a Connection
        // to the instance of PooledConnectionFactory
        log.info("Connection returned");
    }
}
Copy to Clipboard Toggle word wrap

그런 다음 ConnectionResourceSjmsComponent 에 전달합니다.

CamelContext camelContext = new DefaultCamelContext();
AMQConnectionResource pool = new AMQConnectionResource("tcp://localhost:33333", 1);
SjmsComponent component = new SjmsComponent();
component.setConnectionResource(pool);
camelContext.addComponent("sjms", component);
Copy to Clipboard Toggle word wrap

사용의 전체 예를 보려면 ConnectionResourceIT 를 참조하십시오.

306.6.2. 일괄 메시지 지원

SjmsProducer는 목록을 캡슐화하는 Exchange를 만들어 메시지 컬렉션을 게시하도록 지원합니다. 이 SjmsProducer는 목록의 내용을 반복하여 각 메시지를 개별적으로 게시합니다.

일괄 메시지를 생성할 때 각 메시지에 고유한 헤더를 설정해야 하는 경우 SJMS BatchMessage 클래스를 사용할 수 있습니다. SjmsProducer가 BatchMessage 목록이 발생하면 각 BatchMessage 를 반복하고 포함된 페이로드와 헤더를 게시합니다.

다음은 BatchMessage 클래스를 사용하는 예입니다. 먼저 BatchMessage 목록을 생성합니다.

List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}
Copy to Clipboard Toggle word wrap

그런 다음 목록을 게시합니다.

template.sendBody("sjms:queue:batch.queue", messages);
Copy to Clipboard Toggle word wrap

306.6.3. 사용자 지정 가능한 트랜잭션 Strategies (로컬 JMS 트랜잭션만)

SJMS는 개발자에게 TransactionCommitStrategy 인터페이스를 사용하여 사용자 정의 및 플러그 가능한 트랜잭션 전략을 생성하는 수단을 제공합니다. 이를 통해 사용자는 SessionTransactionSynchronization 에서 세션을 커밋할 시기를 결정하는 데 사용할 고유한 상황 집합을 정의할 수 있습니다. 사용의 예로는 다음 섹션에서 자세히 설명하는 BatchTransactionCommitStrategy 가 있습니다.

306.6.4. 거래된 Batch Consumers & Producers

SJMS 구성 요소는 Producer 및 Consumer 끝점 모두에서 로컬 JMS 트랜잭션의 일괄 처리를 지원하도록 설계되었습니다. 그러나 각각을 처리하는 방법은 매우 다릅니다.

SJMS 소비자 엔드포인트는 연결된 세션으로 커밋하기 전에 X 메시지를 처리하는 간단한 구현입니다. 소비자에서 일괄 처리된 트랜잭션을 사용하려면 먼저 transacted 매개변수를 true로 설정한 다음 transactionBatchCount 를 추가하고 0보다 큰 값으로 설정하여 트랜잭션을 활성화합니다. 예를 들어 다음 구성은 10분마다 세션을 커밋합니다.

sjms:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10
Copy to Clipboard Toggle word wrap

소비자 끝점에서 일괄 처리를 처리하는 동안 예외가 발생하면 세션 롤백이 호출되어 다음 사용 가능한 소비자로 메시지가 다시 제공됩니다. 또한 관련 세션에 대한 BatchTransactionCommitStrategy 에 대해 카운터가 0으로 재설정됩니다. 사용자가 JMSRedelivered 헤더가 true로 설정된 메시지를 감시하기 위해 배치 메시지 프로세서에 후크를 배치해야 합니다. 이는 메시지가 어느 시점에서 롤백되었으며 성공적인 처리를 검증해야 함을 나타내는 지표입니다.

또한 트랜잭션된 배치 소비자는 Session에서 열려 있는 트랜잭션을 커밋하기 전에 메시지 간에 기본 시간(5000ms)을 대기하는 내부 타이머 인스턴스를 전달합니다. 기본값은 5000ms(최소 1000ms)는 대부분의 사용 사례에 적합해야 하지만 추가 튜닝이 필요한 경우 transactionBatchTimeout 매개변수를 설정합니다.

sjms:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10&transactionBatchTimeout=2000
Copy to Clipboard Toggle word wrap

컨텍스트 전환의 양이 이점을 얻지 않고 불필요한 성능에 영향을 미칠 수 있으므로 허용되는 최소 값은 1000ms입니다.

그러나 생산자 끝점은 훨씬 다르게 처리됩니다. 각 메시지가 목적지로 전달된 후 생산자를 사용하면 Exchange가 닫히고 해당 메시지에 대한 참조가 더 이상 없습니다. redelivery에서 사용할 수 있는 모든 메시지를 사용하려면 BatchMessages를 게시하는 Producer Endpoint에서 트랜잭션을 활성화할 수 있습니다. 트랜잭션은 일괄 처리 목록에 모든 메시지를 포함하는 교환의 결론을 커밋합니다. 추가 구성은 필요하지 않습니다. 예를 들면 다음과 같습니다.

List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
    String body = "Hello World " + i;
    BatchMessage<String> message = new BatchMessage<String>(body, null);
    messages.add(message);
}
Copy to Clipboard Toggle word wrap

이제 활성화된 트랜잭션을 사용하여 목록을 게시합니다.

template.sendBody("sjms:queue:batch.queue?transacted=true", messages);
Copy to Clipboard Toggle word wrap
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat