Arhn - архитектура программирования

Внедрение @EJB в JSF Bean после отработки отказа

Я использую Weblogic 10.3.6, Mojarra 2.0.9 и EJB3. У нас есть @ViewScoped и @SessionScoped JSF Managed bean-компоненты, и мы требуем, чтобы в случае сбоя сервера использование могло продолжаться. Я почти взломал его, пока не столкнулся с проблемой использования EJB-инъекции в JSF Beans. Вот упрощенные бобы

Интерфейс EJB

@JNDIName("our.ejb.jndiname")
@Remote
public interface OurEJBInterface {

    some methods...

}

Бин EJB

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ourBean implements OurEJBInterface {

    the methods...
}

Поддерживающий компонент JSF

@ManagedBean
@ViewScoped
public class OurBackingBean  {


    @EJB
    private OurBeanBeanInterface ourBeanBeanInterface ;


    public void submit()
    {
        ourBeanBeanInterface.doSomethingFromBean(); 
    }

}

Когда мы моделируем отработку отказа, сеанс правильно извлекается с нового сервера, однако ссылка на EJB по-прежнему указывает на старый сервер, и мы получаем эту ошибку:

javax.ejb.EJBException: Could not establish a connection with -1977369784351278190S:MCPVMWLS01:[7030,7030,-1,-1,-1,-1,-1]:Destin8ShowCase:JVM01, java.rmi.ConnectException: Destination unreachable; nested exception is: 
    java.io.IOException: Empty server reply; No available router to destination; nested exception is: 
    java.rmi.ConnectException: Destination unreachable; nested exception is: 
    java.io.IOException: Empty server reply; No available router to destination; nested exception is: java.rmi.ConnectException: Destination unreachable; nested exception is: 
    java.io.IOException: Empty server reply; No available router to destination
java.rmi.ConnectException: Destination unreachable; nested exception is: 
    java.io.IOException: Empty server reply; No available router to destination
    at weblogic.rjvm.ConnectionManager.bootstrap(ConnectionManager.java:470)
    at weblogic.rjvm.ConnectionManager.bootstrap(ConnectionManager.java:402)
    at weblogic.rjvm.RJVMImpl.ensureConnectionEstablished(RJVMImpl.java:306)
    at weblogic.rjvm.RJVMImpl.getOutputStream(RJVMImpl.java:350)
    at weblogic.rjvm.RJVMImpl.getRequestStreamInternal(RJVMImpl.java:612)
    at weblogic.rjvm.RJVMImpl.getRequestStream(RJVMImpl.java:563)
    at weblogic.rjvm.RJVMImpl.getOutboundRequest(RJVMImpl.java:789)
    at weblogic.rmi.internal.BasicRemoteRef.getOutboundRequest(BasicRemoteRef.java:159)
    at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:211)
    at com.mcpplc.destin8.ejbs.manifestenquiry.ManifestEnquiryFacadeBean_qzni2o_ManifestEnquiryFacadeBeanInterfaceImpl_1036_WLStub.doMEQ02(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusinessIntfProxy.java:85)
    at $Proxy286.doMEQ02(Unknown Source)
    at com.mcpplc.destin8.web.jsf.backingbeans.imports.Meq02BackingBean.customProcessing(Meq02BackingBean.java:49)
    at com.mcpplc.destin8.web.jsf.backingbeans.BackingBean.submit(BackingBean.java:179)

Есть ли способ заставить управляемый компонент повторно инициализировать новую ссылку EJB, указывающую на новый сервер?

Я знаю, что могу использовать локатор службы с инициализацией, помещенной в метод отправки, но хотел бы использовать @EJB, если это возможно.

Заранее спасибо.


  • Если я правильно понимаю, ваша проблема связана с тестированием вашего патча. Во время теста вы не сможете правильно создать экземпляр вашего EJB. В этом случае вы должны использовать MocKClasses, а также MockServer. Вы можете сделать это с помощью arquillian.org или code.google.com/p/mockito достаточно. Я надеюсь, это поможет вам. 09.04.2013
  • Спасибо за ответ, но это не связано с тестом. Это активный код в сценарии отработки отказа. 10.04.2013

Ответы:


1

Я пришел из мира JBoss, поэтому я не совсем уверен в этом. Но можно ли таким образом внедрить удаленный интерфейс? Я думаю, должен быть определен поиск. Однако для локального интерфейса ваш вызов должен работать. И если вы используете удаленные интерфейсы, вы должны использовать

@EJB(lookup="jnp://wholeclustername/YourBean/remote")

и ваш DNS должен указывать вашу сеть на обе машины.

Другим возможным обходным решением может быть метод @Produce и @Inject, где вы выполняете поиск в методе производителя.

Редактировать:

Да, к сожалению. Я тоже сталкиваюсь с этими хаками время от времени :(

Может быть, есть другой обходной путь или решение, я недостаточно уверен в Weblogic. Если вы хотите отделить его от своего источника, вы также можете использовать перехватчик и вводить экземпляр slsb при каждом вызове, возможно, из-за вашего отказа он также работает с @PostConstruct. Я не знаю:

public class LookUpEJBInterceptor {

@AroundInvoke
public Object around(InvocationContext ctx){
    try {
        Class<?> clazzOfEJBImplementation = ctx.getTarget().getClass();
        //look for your field, I just check for the EJB annotation but that's not enough
        for (Field f : clazzOfEJBImplementation.getDeclaredFields()){
            if(f.isAnnotationPresent(EJB.class)){
                f.setAccessible(true);
                f.set(ctx.getTarget(), lookupEJB());
            }
        }

        return ctx.proceed();
    } catch (Exception e) {
        e.printStackTrace();
        throw new EJBException();
    }

}

/**
 * get your ejb
 * 
 * @return
 * @throws NamingException
 */
private Object lookupEJB() throws NamingException{
    return new InitialContext().lookup("Your ejb lookup");
}

Второе редактирование:

If you can use AspectJ you can construct a hack like this:

pointcut checkEJB(OurEJBInterface r): call(void OurEJBInterface.yourVoid()) && target(r);

void around (OurEJBInterface r) : yourVoid(r){
    r = lookupYourEJB();
    return proceed(r);
}

private Object lookupEJB() throws NamingException{
    return new InitialContext().lookup("Your ejb lookup");
}

Но оба только хаки

09.04.2013
  • Спасибо за ответ. Поверьте мне, приведенный выше код — это рабочий код, который работает. Я мало знаю о @produce и @inject, но кажется, что если мне придется каждый раз вызывать метод, чтобы получить мой EJB, я могу также придерживаться локатора службы. 09.04.2013

  • 2

    Удалось решить это после некоторых проб и ошибок. Поскольку Ян ускользнул от моей установки, он вводил только локальное имя jndi. Чтобы возвращенный прокси-сервер EJB был глобальным, мне нужно было удалить аннотацию @JNDIname из интерфейса и указать mappedName для аннотаций @stateless и @ejb.

    @Stateless(mappedName = "MyFacadeBean")
    
    @EJB(mappedName = "MyFacadeBean")
    private MyFacadeBean myFacadeBean;
    
    29.05.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..