3

Ich habe eine Message Driven Bean (MDB), die MessageListener implementiert und hat mehrere EJB-Attribute, aber nicht von ihnen sind injiziert, so dass ich sie manuell injizieren müssen. Die MDB hat auch eine Ressource und eine CDI-Bean, die gut injiziert werden.Zustandslose EJB nicht in Message Driven Bean (MDB) injiziert

Warum werden die EJBs nicht automatisch injiziert? Ich verwende NotificationService EJB in anderen Teilen der Anwendung und sie werden injiziert. Irgendwelche Hinweise darauf, wie Sie das Problem lösen können?

Ich bekomme keinen Fehler von Weblogic 12.1.3, also kann ich nicht herausfinden, was hier passiert. Mein Code ist (voller Spuren für Debugging-Zwecke). Ich habe javadocs und Methodenimplementierungen entfernt, die nicht relevant für das Problem sind:

@MessageDriven(name = "MailMessageConsumer", description = "JMS consumer", mappedName = MailJndiConfiguration.JNDI_QUEUE, 
    activationConfig = { 
      @ActivationConfigProperty(propertyName = "acknowledgeMode", 
             propertyValue = "Auto-acknowledge"), 
      @ActivationConfigProperty(propertyName = "destinationType", 
             propertyValue = "javax.jms.Queue") 
    }) 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
@MessageReceiver(responsibility = "Consumes JMS messages of type MailMessage") 
public class MailMessageConsumer implements MessageListener { 
    private static final Logger log = LoggerFactory.getLogger(MailMessageConsumer.class); 
    @Resource 
    private MessageDrivenContext messageDrivenContext; 
    @EJB 
    private NotificationService notificationService; 
    @EJB 
    private MailClient mailClient; 
    @Inject 
    private ApplicationInformation applicationInformation; 

    @Override 
    public void onMessage(Message message) { 
     if (mailClient == null) { 
      log.error("mailClient object is null"); 
      try { 
       log.info("Instantiating MailClient manually..."); 
       mailClient = BeanManagerHelper.getReference(MailClient.class); 
      } catch (Exception e) { 
       log.error("Cannot instantiate MailClient manually", e); 
      } 
     } 
     if (notificationService == null) { 
      log.error("notificationService object is null"); 
      try { 
       log.info("Instantiating NotificationService manually..."); 
       notificationService = BeanManagerHelper.getReference(NotificationService.class); 
      } catch (Exception e) { 
       log.error("Cannot instantiate NotificationService manually", e); 
      } 
     } 
     // This never happens 
     if (applicationInformation == null) { 
      log.error("applicationInformation object is null"); 
     } 
     // This never happens 
     if (messageDrivenContext == null) { 
      log.error("messageDrivenContext object is null"); 
     } 
     deliverMessage(message); 
    } 

    private void deliverMessage(Message message) { 
     // Not important 
    } 

    private MailMessage retrieveMessage(Message message) { 
     // Not important 
    } 

    private void sendEmail(MailMessage mailMessage) { 
     // Not important 
    } 
} 

Mailclient EJB:

@Stateless 
@LocalBean 
@TransactionAttribute(TransactionAttributeType.MANDATORY) 
@Service 
public class MailClient { 
    private static final Logger logger = LoggerFactory.getLogger(MailClient.class); 
    @Resource(mappedName = MailJndiConfiguration.JNDI_MAIL_SESSION) 
    private Session mailSession; 
    @EJB 
    private NotificationService notificationService; 
    @Inject 
    private ApplicationInformation applicationInformation; 

    enum ValidationError { 
     NULL_OBJECT("Mail message is null"), 
     CONTENT_TYPE_EMPTY("Content type not initialized"), 
     BODY_EMPTY("Message body content is empty"); 
     private static final String ERROR_MESSAGE_PREFIX = "Invalid mail message: "; 
     private String message = ERROR_MESSAGE_PREFIX; 

     ValidationError(String message) { 
      this.message += message; 
     } 

     public String getMessage() { 
      return message; 
     } 
    } 

    public void sendMail(MailMessage mailMessage) throws MailMessageSendingException { 
     // Not important 
    } 
} 

NotificationService EJB:

@Stateless 
@LocalBean 
@TransactionAttribute(TransactionAttributeType.MANDATORY) 
@Service 
public class NotificationService { 
    private static final Logger logger = LoggerFactory.getLogger(NotificationService.class); 
    @PersistenceContext(unitName = "myEntityManager") 
    private EntityManager entityManager; 
    @EJB 
    private NotificationPendingMessageValidator notificationPendingMessageValidator; 
    @EJB 
    private NotificationFinder notificationFinder; 
    @Inject 
    private ApplicationInformation applicationInformation; 

    public NotificationPendingMessageEntity saveNotificationMessageForDeferredMail(NotificationPendingMessageEntity notificationPendingMessageEntity) throws ValidationException { 
     // Not important 
    } 

    public List<NotificationPendingMessageEntity> findNotificationPendingMessageEntities(TimeSlot timeSlot) { 
     // Not important 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public NotificationMailEntity createNewMailEntity() { 
     // Not important 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void updateMailEntity(NotificationMailEntity mailEntity) { 
     // Not important 
    } 

    public void createNotificationMessageProcessedEntity(NotificationProcessedMessageEntity notificationProcessedMessageEntity) { 
     // Not important 
    } 

    public void removeNotificationMessagePendingEntity(NotificationPendingMessageEntity notificationPendingMessageEntity) { 
     // Not important 
    } 

    public void reportMailFailure(NotificationMailEntity mailEntity, String failureNotice) { 
     // Not important 
    } 
} 
+2

Gute Frage, ein Kollege von mir hat das gleiche Problem – Lastnico

Antwort

2

@Inject Verwendung für die EJBs Injektion statt von @EJB Annotation funktioniert gut. Es sollte also ein Problem mit einigen Patches von Weblogic geben, da es in einem anderen Weblogic (gleiche Version, verschiedene Patches) getestet wurde.

+0

Durch einen Zufall, wissen Sie der genaue Patch? Wir hatten den genauen Fall mit 12.2.1 – meskobalazs

+0

Es tut mir leid, keine Ahnung. Ich war nicht verantwortlich für diese Weblogic-Verwaltungsseite. –

+0

Danke trotzdem :) – meskobalazs