EJB аналог Spring @Profile - PullRequest
       5

EJB аналог Spring @Profile

0 голосов
/ 26 сентября 2018

Spring Profiles обеспечивают способ разделения частей конфигурации приложения и делают его доступным только в определенных средах.Хотел узнать, можно ли это как-нибудь сделать в EJB?

Основная формулировка проблемы:

У меня есть две разные инфраструктуры JMS в двух разных средах.Я хочу, чтобы соответствующий бин был загружен и введен.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Использование env-entry в вашем EJB-проекте для конфигурации среды

Пример ejb-jar.xml (он находится в папке «META-INF»)

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd" version="3.2">
<display-name>MSInterceptorMDBSimpleOrderHandler </display-name>

<enterprise-beans>
<message-driven>
    <ejb-name>InterceptorMDBSimpleOrderHandler</ejb-name>
    <transaction-type>Container</transaction-type>

    <env-entry>
        <description>Variables to distinguish between prod, uat and qa environments</description>
        <env-entry-name>isQA</env-entry-name>
        <env-entry-type>java.lang.Boolean</env-entry-type>
        <env-entry-value>false</env-entry-value>
    </env-entry>

    <env-entry>
        <description>Variables to distinguish between prod, uat and qa environments</description>
        <env-entry-name>isUAT</env-entry-name>
        <env-entry-type>java.lang.Boolean</env-entry-type>
        <env-entry-value>false</env-entry-value>
    </env-entry>

    <!-- Not QA or UAT means it's prod -->

    <env-entry>
        <description>Variable to distinguish between linux and windows for file access</description>
        <env-entry-name>isLinux</env-entry-name>
        <env-entry-type>java.lang.Boolean</env-entry-type>
        <env-entry-value>true</env-entry-value>
    </env-entry>

    <env-entry>
        <description>Variable to use as linux folder path file access</description>
        <env-entry-name>linuxPath</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>/home/jboss/XML_JMS_Responses</env-entry-value>
    </env-entry>

    <env-entry>
        <description>Variable to use as windows folder path file access</description>
        <env-entry-name>windowsPath</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>C:\\local_git_repo\\PSD_Interceptor\\XML_JMS_Responses</env-entry-value>
    </env-entry>        
</message-driven>

Пример кода (обратите внимание, это MDB):

@MessageDriven
public class InterceptorMDBSimpleOrderHandler implements MessageListener {
        @Resource(name="isQA")
        boolean isQA;
        @Resource(name="isUAT")
        boolean isUAT;
        @Resource(name="isLinux")
        boolean isLinux;
        @Resource(name="linuxPath")
        String linuxPath;
        @Resource(name="windowsPath")
        String windowsPath;

        //other vars modified by resource injected values
        String path = "";
        boolean isWindows = false;
        boolean isProd = false;

        @PostConstruct
        public void initialize() {
            LOGGER.info("InterceptorMDBSimpleOrderHandler:->PostConstruct:->initialize");

            if(!isQA && !isUAT){
                isProd = true;
            }

            if(!isLinux){
                isWindows = true;
                path = windowsPath;
            }else{
                path = linuxPath;
            }

            LOGGER.info("InterceptorMDBSimpleOrderHandler Constructed with following settings:");
            LOGGER.info("isQA: " + isQA);
            LOGGER.info("isUAT: " + isUAT);
            LOGGER.info("isProd: " + isProd);
            LOGGER.info("isLinux: " + isLinux);
            LOGGER.info("isWindows: " + isWindows);
            LOGGER.info("linuxPath: " + linuxPath);
            LOGGER.info("windowsPath: " + windowsPath);
            LOGGER.info("Path to use: " + path);

            //this is where you'd call a method or whatever that cares 
            //about the environment settings.

            LOGGER.info("InterceptorMDBSimpleOrderHandler:->PostConstruct:->Finish initialized");
        }

}

Это не обязательно должен быть компонент, управляемый сообщениями, это может быть просто EJB, в этом случае вы должны изменить «управляемый сообщениями» на «сеанс» в файле ejb-jar.xml следующим образом:

<enterprise-beans>
<session>
  <ejb-name>Configuration</ejb-name>
  <init-on-startup>true</init-on-startup>
  <transaction-type>Container</transaction-type>

Выше приведен фрагмент из класса EJB под названием «Конфигурация», который содержит целую кучу записей env, связанных с конфигурацией для приложения.Для получения дополнительной информации Соглашения об использовании ENC Environment_Entries оно немного старое, но 80% или более все еще остается в силе.

0 голосов
/ 27 сентября 2018

Вы можете использовать альтернативы CDI и использовать @Inject вместо @EJB для внедрения. Примеры: 1) если вам нужно указать реализацию во время развертывания, вы можете использовать альтернативный

интерфейс:

import javax.ejb.Local;

@Local
public interface MyserviceInterface2 {
    String doSomthing();
}

реализаций

@Alternative
@Stateless
public class Interface2Impl1 implements MyserviceInterface2{
    @Override
    public String doSomthing() {
        return "Impl1";
    }
}


@Alternative
@Stateless
public class Interface2Impl2 implements MyserviceInterface2{
    @Override
    public String doSomthing() {
        return "Impl2";
    }
}

выберите вашу реализацию в beans.xml

<alternatives>
    <class> [your package].Interface2Impl1</class>
</alternatives>

Точка внедрения:

inject in client class

public class ClientClass {
    @Inject
    MyserviceInterface2 myserviceInterface2;
    ...

2), если вы хотите выбрать реализацию во время выполнения, вы могли бы использовать производит

создать следующие квалификаторы

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Impl1Qulifier {
}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Impl2Qulifier {
}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface SelectedImpQulifier {
}

интерфейс:

@Local
public interface MyServiceInterface {
    String doSomthing();
}

реализации:

@Impl1Qulifier
@Stateless
public class MyServiceImpl1 implements MyServiceInterface{
    @Override
    public String doSomthing() {
        return "Impl1";
    }
}

@Impl2Qulifier
@Stateless
public class MyServiceImpl2 implements MyServiceInterface{
    @Override
    public String doSomthing() {
        return "impl2";
    }
}

производит:

public class ImplProvider {
    @Inject @Impl1Qulifier
    MyServiceInterface impl1;

    @Inject @Impl2Qulifier
    MyServiceInterface imp2;

    @Produces @SelectedImpQulifier
    MyServiceInterface createServiceInterface(InjectionPoint injectionPoint ) {
//        if( your conditions ){
//            return impl1
//        }
        return imp2;
    }
}

точка ввода:

public class ClientClass {
    @Inject @SelectedImpQulifier
    MyServiceInterface myServiceInterface;
    ...

вы также можете использовать поиск JNDI для второй ситуации

Вы также можете поместить каждую реализацию в отдельный модуль (jar) и использовать подходящийдля каждой среды в ухе, созданной для этой среды (выполняя правильную сборку для каждой из них)

...