
Contents
Topic to Queue Mapping 이란?Topic to Queue Mapping 이란?

Q라는 이름의 큐가 있을 때, Q에 직접 메세지를 보내 것 뿐 아니라, 토픽의 형식으로 큐에 구독을 추가할 수 있다.
큐가 이미 존재할 때, 큐에 토픽 추가하기


- 만들어진 큐에서 Subscription 탭으로 접속하여
- +Subscription 버튼을 눌
- 원하는 토픽( 슬래시를 delimiter로 한다)을 작성한뒤 create를 눌러 갱신한다.
Client Profile 생성하기


실습 시간에 애를 먹었던 부분인데, Broker Manager Quick Setting에 들어가면 클라이언트 프로필 설정만 가능하다.
콘솔에 있는 Client Profile 탭에서만 클라이언트 프로필 생성이 가능한 것 같다.
들어가서 이름만 설정하고 생성하면, 나머지의 설정은 Access Control 탭에서 설정이 가능하다.
Access Control List 생성하기


Access Control탭에서 ACL Profiles탭으로 이동한 뒤, +ACL Profile 버튼을 누른다.
원하는 이름을 입력한 후, 생성해준다.

Edit 버튼을 누르면 Client Connect, Publish Topic, Subscribe Topic을 Disallow/Allow로 변경할 수 있다.
Least Privilege를 지키기 위해서는 Publish를 위한 ACL과 Subscribe를 위한 ACL을 따로 만드는 것이 좋겠지만, 실습을 위해서는 한꺼번에 만들도록 하겠다.
Client Usernames 생성하기

Create Username을 눌러 Username을 입력할 수 있다.


생성을 한 초기에는 Client Profile과 ACL Profile이 default로 설정되어 있다.
Edit버튼을 눌러 방금 만든 ACL과 Client Profile을 매핑시켜주고
Change Password 버튼을 클릭하여 사용할 비밀번호를 정의해주면 설정이 완료된다.

위의 설정을 완료한 다음, 콘솔로 돌아와 Connect탭으로 이동한다.
Username과 password는 Client Usernames에서 설정한 값으로 대체가 가능하고, SMF Host같은 프로토콜 별 Host는 각 탭을 눌러보면 확인 가능하다.
실습은 JCSMP API를 사용하여 Spring boot 3환경에서 진행하였다.
디펜더시는 다음과 같다.

package com.example.donation.config;
import com.solacesystems.jcsmp.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SolaceConfig {
@Value("${spring.solaceUsername}")
private String username;
@Value("${spring.solacePassword}")
private String password;
@Value("${spring.solaceHost}")
private String host;
@Value("${spring.solacePort}")
private int port;
@Value("${spring.queueName}")
private String queueName;
@Value("${spring.vpnName}")
private String vpn;
@Bean
public JCSMPSession session() throws JCSMPException {
JCSMPProperties properties = new JCSMPProperties();
properties.setProperty(JCSMPProperties.HOST,host);
properties.setProperty(JCSMPProperties.USERNAME,username);
properties.setProperty(JCSMPProperties.PASSWORD,password);
properties.setProperty(JCSMPProperties.VPN_NAME,vpn);
JCSMPSession session = JCSMPFactory.onlyInstance().createSession(properties);
session.connect();
if(session.isCapable(CapabilityType.PUB_GUARANTEED)&&
session.isCapable(CapabilityType.SUB_FLOW_GUARANTEED)&&
session.isCapable(CapabilityType.ENDPOINT_MANAGEMENT)&&
session.isCapable(CapabilityType.QUEUE_SUBSCRIPTIONS)){
System.out.println("All required capabilites supported!");
}else {
System.out.println("Capabilities not met!");
System.exit(1);
}
return session;
}
@Bean Queue queue(){
return JCSMPFactory.onlyInstance().createQueue("Q.GWANGBU1");
}
@Bean
public XMLMessageProducer producer() throws JCSMPException {
XMLMessageProducer prod = session().getMessageProducer(new JCSMPStreamingPublishEventHandler() {
@Override
public void handleError(String s, JCSMPException e, long l) {
System.out.printf("Producer received error for msg: %s@%s - %s%n", s, l, e);
}
@Override
public void responseReceived(String s) {
System.out.println("Producer received response for msg: " + s);
}
});
return prod;
}
}
위의 사이트를 참고하며 작성하였다.
기능들을 세션이 충족하는지 if문을 사용하여 확인하였으며 Session을 빈으로 등록해주었다.

JCSMPFactory에서 createSession을 호출하여 세션을 생성하게되는데, 해당 메서드를 따라가보자.

매개변수로 JCSMPProperties 객체만 넘겨주었더니 다른 값을 null로 채운후, 매개변수 3개를 필요로 하는 createSession 매서드를 호출하였다.
JCSMPBasicSession
Share article