Вы нарушаете ограничения программирования (см. Спецификацию EJB 16.2.2):
Корпоративный компонент не должен использовать статические поля для чтения / записи.Использование статических полей только для чтения разрешено.Поэтому рекомендуется объявлять все статические поля в классе корпоративного компонента как окончательные.
Удалите свои (не окончательные) статические поля, статический инициализатор и конструктор.Инициализация выполняется в методе обратного вызова жизненного цикла postConstruct.
Ваш EJB может выглядеть следующим образом:
@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
public class DecisionServiceMDB implements MessageListener
{
private Logger responseTimeLogger;
private Logger errorLogger;
private Logger ruleExceptionLogger;
private String RULEAPP_NAME;
private String RULESET_NAME;
private InitialContext ic;
private ConnectionFactory cf;
private Destination destination;
private String qcfLookup;
private String qLookup;
private Connection c;
private Session s;
private MessageProducer mp;
private boolean isInitializedOkay = true;
private IlrEJB3SessionFactory factory;
private IlrStatelessSession ruleSession;
private IlrPath path;
private IlrSessionRequest sessionRequest;
@PostConstruct
public void init() {
responseTimeLogger = Logger.getLogger(PropertyManager.getResponseTimeLogger());
errorLogger = Logger.getLogger(PropertyManager.getErrorLogger());
ruleExceptionLogger = Logger.getLogger(PropertyManager.getRuleExceptionLogger());
RULEAPP_NAME = PropertyManager.getRuleAppName();
RULESET_NAME = PropertyManager.getRuleSetName();
qcfLookup = PropertyManager.getQueueFactoryJndiName();
qLookup = PropertyManager.getQueueDestinationJndiName();
ic = new InitialContext();
cf = (ConnectionFactory) ic.lookup(qcfLookup);
destination = (Destination) ic.lookup(qLookup);
factory = new IlrEJB3SessionFactory();
factory.setStatelessLocalJndiName("ejblocal:ilog.rules.res.session.ejb3.IlrStatelessSessionLocal");
ruleSession = factory.createStatelessSession();
sessionRequest.setRulesetPath(path);
}
public void onMessage(Message receivedMsg)
{
// onMessage code goes here.
}
}
Я удалил статический инициализатор.Похоже, вы пытаетесь настроить ведение журнала, что не должно быть сделано в вашем EJB.Обратитесь к документации вашего сервера приложений, чтобы узнать, как это сделать правильно.
Это просто пример кода, основанного на исходном коде.
Предоставленная вами реализация выглядит как простая реализация Java.Помните о требованиях в корпоративной среде (например, жизненный цикл EJB, ответственность поставщиков EJB, ...).Прежде чем продолжить, прочитайте спецификацию EJB и некоторые учебные пособия по JEE.
Имея это в виду, впоследствии вам следует взглянуть на PropertyManager.Это может быть не реализовано подходящим способом.