25 Eylül 2019 Çarşamba

SpringJMS DefaultMessageListenerContainer Sınıfı

Giriş
Şu satırı dahil ederiz.
import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.jms.connection.SingleConnectionFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;
constructor
Şöyle yaparız.
DefaultMessageListenerContainer defaultMessageListenerContainer =
  new DefaultMessageListenerContainer();
setConcurrentConsumers metodu
Örnek
Şöyle yaparız.
<bean id="jmsContainer"
  class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory"/>
  <property name="destination" ref="destination"/>
  <property name="messageListener" ref="transactionMessageListener"/>
  <property name="sessionTransacted" value="true"/>
  <property name="concurrentConsumers" value="1"/>
</bean>
Örnek
Şöyle yaparız.
ConnectionFactory connectionFactory = ...;
defaultMessageListenerContainer.setConnectionFactory(connectionFactory);
Örnek
IBM'e bağlanmak için şu satırı dahil ederiz.
import com.ibm.mq.jms.MQQueueConnectionFactory;
Şöyle yaparız.
public MQQueueConnectionFactory connectionFactory3() {
  MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory();
  ...
  return connectionFactory;
}

@Bean
public DefaultMessageListenerContainer listenerContainer() throws JMSException {
  DefaultMessageListenerContainer defMsgListCont = new DefaultMessageListenerContainer();
  defMsgListCont.setConnectionFactory(connectionFactory3());
  defMsgListCont.setDestination(jmsDestinationResolverReceiver());
  defMsgListCont.setMessageListener(messageListenerReciever1);
  defMsgListCont.afterPropertiesSet();
  return defMsgListCont;
}
setDestination metodu
Örnek
Şöyle yaparız.
Topic topic = ...;
defaultMessageListenerContainer.setDestination(topic);
Örnek
IBM'e bağlanmak için elimizde şöyle bir kod olsun
@Bean
public Destination jmsDestinationResolverSender() throws JMSException {
  return new MQQueue(updateQueue);
}
Şöyle yaparız.
@Bean
public DefaultMessageListenerContainer listenerContainer() throws JMSException {
  DefaultMessageListenerContainer defMsgListCont = new DefaultMessageListenerContainer();
  ...
  defMsgListCont.setDestination(jmsDestinationResolverReceiver());
  return defMsgListCont;
}
setMessageConverter metodu
Örnek
Şöyle yaparız.
SimpleMessageConverter messageConverter = ...;
defaultMessageListenerContainer.setMessageConverter(messageConverter);

17 Eylül 2019 Salı

SpringStomp AbstractWebSocketMessageBrokerConfigurer Sınıfı

Giriş
AbstractSecurityWebSocketMessageBrokerConfigurer sınıfı ile kardeştir.

Broker ve Controller'ı Birleştirmek
3 tane anotasyon var
- @SubscribeMapping
@MessageMapping - Stomp istemcisi tarafından gönderilen mesajı okur
- @MessageMapping + @SendTo
- @MessageExceptionHandler
- Broker'dan mesaj göndermek için MessageSendingOperations arayüzü kullanılır. Bu arayüzü gerçekleştiren sınıf SimpMessagingTemplate 

Örnek
Controller 'a gelen mesajı broker 'a göndermek için şöyle yaparız.
@Controller
public class GreetingController {
  @MessageMapping("/hello")
  @SendTo("/topic/greetings")
  public TestResponse greeting(HelloMessage message) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new TestResponse("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
  }
}
Kullanım
Örnek
En basit haliyle kullanmak için şöyle yaparız
- Burada Stomp istemcilerinin bağlanacağı adres "/websocket-sockjs-stomp". 
- Stomp mesajlarının yayınlanacağı (publish) adres ise "/queue" ve "/topic". Stomp istemcileri bu adreslere abone olurlar.
- Eğer Stomp istemcisi mesaj dinlemek yanında, mesaj da yayınlıyorsa, Stomp istemcilerinin mesaj gönderebilecekler adres ise "/app" ile başlıyor. 
Örneğin 
- "/app/request"
- "/app/subscribe"
@Configuration
@EnableWebSocketMessageBroker
public class StompWebSocketConfig implements WebSocketMessageBrokerConfigurer {
  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/websocket-sockjs-stomp").withSockJS();
  }
  @Override
  public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/queue", "/topic");
    registry.setApplicationDestinationPrefixes("/app");
  }
}
configureClientInboundChannel metodu
Örnek
Şöyle yaparız
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

  @Override
  public void configureClientInboundChannel(ChannelRegistration channelRegistration) {
    channelRegistration.taskExecutor().corePoolSize(4).maxPoolSize(8);
  }
  ...
}
configureMessageBroker metodu
- enableSimpleBroker() çağrısına genellikle "/topic" ve "/queue" verilir. Topic ile spring kodundan herkese mesaj gönderilir. "/queue" ile spring kodundan sadece belli bir kullanıcıya mesaj gönderilir.

- setApplicationDestinationPrefixes() çağrısı ile verilen string, aynı string'e sahip @MessageMapping anotasyonuna sahip kodların tetiklenmesini sağlar. Yani mesaj gönderilecek endpoint'lerin ismidir. Bu sınıflar aynı zamanda @SendTo anotasyonuna da sahiptirler. Böylece kendisine gelen mesajı işleyerek bir başka topic'e yayınlarlar.

Örnek
Şöyle yaparız.
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
  @Override
  public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
  }
  ...
}
registerStompEndpoints metodu - Bağlanılacak adresi belirtir
websocket istemcisi bu adrese bağlanır. WebSocket, Stomp, SockJS İlişkisi yazısına bakabilirsiniz.

Örnek
Elimizde şöyle bir kod olsun
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
  registry.addEndpoint("/greeting");
}
websocket istemcisi bu adrese bağlanır. Şöyle yaparız
var socket = new WebSocket('ws://localhost:8080/greeting');
ws = Stomp.over(socket);
Örnek - SockJS ile
Şöyle yaparız.
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
  registry.addEndpoint("/gs-guide-websocket").withSockJS();
}