27 Temmuz 2023 Perşembe

ActiveMQ ActiveMQConnectionFactory Sınıfı

Giriş
Şu satırı dahil ederiz
import org.apache.activemq.ActiveMQConnectionFactory;
constructor - brokerUrl
Broker adresini parametre olarak alır

Örnek - tcp
Şöyle yaparız
@Bean
public ConnectionFactory connectionFactory() {
  return new ActiveMQConnectionFactory("tcp://localhost:4444");
}
Örnek
Şöyle yaparız
ActiveMQConnectionFactory cf =
new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false")
Örnek
Şöyle yaparız. Yerel makinede çalıştırır.
import org.apache.activemq.ActiveMQConnectionFactory;
import static org.apache.activemq.ActiveMQConnection.DEFAULT_BROKER_URL;

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(DEFAULT_BROKER_URL);
constructor - user + password + brokerUrl
Örnek
Şöyle yaparız
@Configuration
@EnableJms
public class JmsConfig {

  @Value("${activemq.url}")
  private String brokerUrl;

  @Value("${activemq.user}")
  private String user;

  @Value("${activemq.password}")
  private String password;

  @Bean
  public ActiveMQConnectionFactory connectionFactory() {
    if ("".equals(user)) {
      return new ActiveMQConnectionFactory(brokerUrl);
    }
    return new ActiveMQConnectionFactory(user, password, brokerUrl);
  }
  ...
}
createConnection metodu

ActiveMQ Client Kullanımı

Maven
Örnek - Jakarta
Jakarta isim alanını kullanan ilk sürüm 5.18 sürümü. Şu satırı dahil ederiz
<dependency>
<groupId>jakarta.jms</groupId> <artifactId>jakarta.jms-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client-jakarta</artifactId> <version>5.18.2</version> </dependency>
Örnek
Eğer Javax isim alanını kullanıyorsak şu satırı dahil ederiz
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>activemq-all</artifactId>
  <version>5.18.2</version>
</dependency>
ActiveMQConnectionFactory veya ActiveMQXAConnectionFactory nesnesi yaratılır

Artemis Server Kullanımı

Maven
Şu satırı dahil ederiz
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>artemis-server</artifactId>
  <version>2.29.0</version>
</dependency>
Gelen bağımlılıklar şöyle
artemis-jakarta-server
  artemis-commons
  artemis-core-client
  artemis-jakarta-client
  artemis-jakarta-service-extensions
  artemis-journal
  artemis-server
  jakarta-jms-api [provided]
  slf4j-api [provided]
EmbeddedActiveMQ ile sunucu yaratılır

Artemis Client Kullanımı

Maven
Örnek
Şu satırı dahil ederiz
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>artemis-jakarta-client</artifactId>
  <version>2.29.0</version>
</dependency>
Örnek  - Fat Jar
Şu satırı dahil ederiz
<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>artemis-jakarta-client-all</artifactId>
  <version>2.30.0</version>
</dependency>
ActiveMQConnectionFactory ile sunucuya bağlanılır

23 Temmuz 2023 Pazar

Jakarta EE Servlet Kullanımı

Maven
Örnek
Şu satırı dahil ederiz
<dependency>
<groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> </dependency>
Sınıflar şöyle
Cookie
HttpServletResponse
@WebListener Anotasyonu

21 Temmuz 2023 Cuma

Artemis ActiveMQConnectionFactory Sınıfı

Giriş
Şu satırı dahil ederiz
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
constructor
Şöyle yaparız
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616")

Artemis EmbeddedActiveMQ Sınıfı

Giriş
Şu satırı dahil ederiz
import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ;
Örnek
Şu satırı dahil ederiz
import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl;
Şöyle yaparız
public final class ActiveMQBroker {

  public static final String BROKER_URL = "tcp://localhost:61616";

  private EmbeddedActiveMQ broker;

  ActiveMQBroker() throws Exception {
    ConfigurationImpl configuration = new ConfigurationImpl();
    configuration.setSecurityEnabled(false);
    configuration.setPersistenceEnabled(false);
    configuration.addAcceptorConfiguration("my-acceptor", BROKER_URL);

    broker = new EmbeddedActiveMQ();
    broker.setConfiguration(configuration);
    broker.start();
  }

  public void stop() throws Exception {
    broker.stop();
  }
}

Jakarta JMS Kullanımı

Önceden
Maven
Şu satırı dahil ederiz
<dependency> <groupId>javax.jms</groupId> <artifactId>javax.jms-api</artifactId> <version>2.0.1</version> <scope>provided</scope> <optional>true</optional> </dependency>
Jakarta
Maven
Şu satırı dahil ederiz
<dependency> <groupId>jakarta.jms</groupId> <artifactId>jakarta.jms-api</artifactId> <version>3.1.0</version> <scope>provided</scope> <optional>true</optional> </dependency>

JPA @Converter Anotasyonu - Custom Conversion

Giriş
Şu satırı dahil ederiz.
import javax.persistence.Converter;
Kendi yazdığım AttributeConverter arayüzünden kalıtan sınıfı JPA'ya tanıtmak içindir.

autoApply Alanı False İse
İlgili alan üzerinde kullanmak gerekir. Şöyle yaparız
@Converter(converter=LocalDateTimePersitenceConverter.class)
autoApply Alanı True İse
Eğer her alana otomatik uygunlansın istersek şöyle yaparız.
@Converter(autoApply = true)
public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, Date> {

  @Override
  public Date convertToDatabaseColumn(LocalDate locDate) {
    return (locDate == null ? null : Date.valueOf(locDate));
  }

  @Override
  public LocalDate convertToEntityAttribute(Date sqlDate) {
    return (sqlDate == null ? null : sqlDate.toLocalDate());
  }
}
Örnek
Elimizde şöyle bir Enum olsun
public enum Status {
  ACTIVATED(1), DEACTIVATED(2), SUSPENDED(3);

  int statusId;

  private Status(int statusId) {
    this.statusId = statusId;
  }

  public int getStatusId() {
    return statusId;
  }
};
Şöyle yaparız
@Converter
public class CustomerStatusConverter implements 
  AttributeConverter<Status, Integer> {
  @Override
  public Integer convertToDatabaseColumn(Status status) { 
    return status.getStatusId();
  }

  @Override
  public Customer.Status convertToEntityAttribute(Integer statusId) {
    return Arrays.stream(Status.values())
      .filter(s -> s.getStatusId() == statusId)
      .findFirst()
      .orElseThrow(IllegalArgumentException::new);
  }
}

@Entity
public class Customer {
  @Convert(converter = CustomerStatusConverter.class)
  private Status status;
  ...
}


JDBC Enum String İçin Posgtre'ye Özel Çözümler

Örnek
Elimizde şöyle bir PostgreSQL tablosu olsun. Burada order_status isimli yeni bir type yarattık.
CREATE TYPE order_status AS ENUM(
  'Ordered', 
  'Baking', 
  'Delivering', 
  'YummyInMyTummy');

CREATE TABLE pizza_order (
  id INT PRIMARY KEY,
  status order_status NOT NULL,
  order_time TIMESTAMP NOT NULL DEFAULT now()
);
Bu type aslında Java kodu olarak şöyle
public enum OrderStatus {
  Ordered,
  Baking,
  Delivering,
  YummyInMyTummy
}
Şu SQL çalışır, çünkü status tipi olarak CREATE TYPE ile belirtilen bir string verdik
INSERT INTO pizza_order (id, status, order_time) 
VALUES (1, 'Ordered', now());
Ama JDBC olarak çalışmaz
PreparedStatement statement = conn
  .prepareStatement("INSERT INTO pizza_order (id, status, order_time) VALUES(?,?,?)");

statement.setInt(1, 1);
statement.setString(2, OrderStatus.Ordered.toString());
statement.setTimestamp(3, Timestamp.from(Instant.now()));

statement.executeUpdate();
Hata şöyle. Yani veri tabanı varchar'ı status type'a nasıl çevireceğini bilmiyor.
org.postgresql.util.PSQLException: ERROR: column "status" is of type order_status but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Çözüm 1
java.sql.Types.OTHER kullanırız.
PreparedStatement statement = conn
  .prepareStatement("INSERT INTO pizza_order (id, status, order_time) VALUES(?,?,?)");

statement.setInt(1, 1);
statement.setObject(2, OrderStatus.Ordered, java.sql.Types.OTHER);
statement.setTimestamp(3, Timestamp.from(Instant.now()));

statement.executeUpdate();
Çözüm 2
String olarak geçebilmek için CAST yaratılır. 
CREATE CAST (varchar AS order_status) WITH INOUT AS IMPLICIT;
O zaman hem JDBC ile enum'u string olarak yazabiliriz, hem de String'i Java Enum olarak okuyabiliriz. Yazma için şöyle yaparız
PreparedStatement statement = conn
  .prepareStatement("INSERT INTO pizza_order (id, status, order_time) VALUES(?,?,?)");

statement.setInt(1, 1);
statement.setString(2, OrderStatus.Ordered.toString());
statement.setTimestamp(3, Timestamp.from(Instant.now()));

statement.executeUpdate();
Okuma için şöyle yaparız
PreparedStatement statement = conn.prepareStatement("SELECT id, status, order_time " +
	"FROM pizza_order WHERE id = ?");
statement.setInt(1, 1);

ResultSet resultSet = statement.executeQuery();
resultSet.next();

PizzaOrder order = new PizzaOrder();

order.setId(resultSet.getInt(1));
order.setStatus(OrderStatus.valueOf(resultSet.getString(2)));
order.setOrderTime(resultSet.getTimestamp(3));

JPA @Enumerated Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.persistence.Enumerated;
Açıklaması şöyle.
ORDINAL: Persist enumerated type property or field as an integer.
STRING: Persist enumerated type property or field as a string.
@Enumerated anotasyonu EnumType.X şeklinde kullanılır. EnumType.STRINGise enum'un string değeri veri tabanına yazılır. EnumType.ORDINAL ise sayısal bir değer yazılır.

Not : JPA @Converter Anotasyonu ile custom conversion da yapılabilir

1. EnumType.ORDINAL
Örnek
Şöyle yaparız.
@Enumerated(EnumType.ORDINAL)
private Role userRole;
2. EnumType.STRING

Örnek
Açıklaması şöyle.
Remember JPA uses the name() of the enum and not the toString() even if you have overridden the toString().
Elimizde şöyle bir enum olsun. Veritabanına "PRIMARY_ACCOUNT" string olarak yazılır. "Primary customer" değil.
public enum AccountRole {
  EMPLOYEE_CUSTOMER("Employee customer"),
  JOINTER_ACSCOUNT("Jointer customer"),
  PRIMARY_ACCOUNT("Primary customer"),
  TENANT_ACCOUNT("Tenant customer");

  private final String text;

  AccountRole(final String text) {
    this.text = text;
  }

  @Override
  public String toString() {
    return text;
  }
}
Örnek
Şöyle yaparız:
@Enumerated(EnumType.STRING)
@Column(name = "LOGIC")
public BusinessLogic getLogic(){...usual getter...}



Bean Validation @GroupSequence Anotasyonu

Örnek Elimizde şöyle bir kod olsun public class SampleRequest {   @NotNull   LocalDate startDate;   @NotNull   LocalDate endDate;   @AssertT...