J'essaie de trouver CDI et la meilleure méthode qui convient à mes besoins. J'ai un service (TcpServiceImpl
) qui interagit avec la communication tcp simple. Maintenant, ce service a quelques points où il doit informer quelqu'un que quelque chose est arrivé. Pour ces informations, j'ai l'interface TcpConnection
qui doit être injectée CDI à l'implémentation correcte. Un autre problème est que le service TcpServiceImpl
lui-même est injecté dans un travail (TcpConnectionJob
) qui s'exécute périodiquement et appelle le service pour faire des choses. Cela signifie que le service TcpServiceImpl
va exister plusieurs fois. Chacun ayant une autre connexion tcp qu'il gère et ayant un autre périphérique qui a besoin d'un autre pilote/protocole à injecter dans l'interface TcpConnection
.Injectind Implémentation automatique à l'exécution sur CDI
Permettez-moi de montrer les trois éléments qui participent à ce scénario:
Voici l'interface qui obtenir plusieurs implémentations:
public interface TcpConnection
{
/**
* Connected.
*
* @throws NGException the NG exception
*/
public void connected() throws NGException;
/**
* This method will send the received data from the InputStream of the connection.
*
* @param data the received data
* @throws NGException the NG exception
*/
public void received(byte[] data) throws NGException;
/**
* Usable for the protocol to send data to the device.
*
* @param data the data to send to the device (Will be converted to byte[] with getBytes())
* @throws NGException the NG exception
*/
public void send(String data) throws NGException;
/**
* Usable for the protocol to send data to the device.
*
* @param data the data to send to the device (Will be send as is)
* @throws NGException the NG exception
*/
public void send(byte[] data) throws NGException;
/**
* This method will inform the protocol that the connection got closed.
*
* @throws NGException the NG exception
*/
public void closed() throws NGException;
}
Aussi voici un exemple extrait de quand cela sera appelé mon service existant:
public class TCPServiceImpl implements TCPService, Runnable
{
/** The callback. */
private TcpConnection callback;
private void disconnect()
{
connection.disconnect();
if (!getStatus(jndiName).equals(ConnectionStatus.FAILURE))
{
setStatus(ConnectionStatus.CLOSED);
}
/* TODO: Tell driver connection is closed! */
callback.closed();
}
}
Voici la classe qui appelle le service, qui doit ensuite injecter dynamiquement la mise en œuvre correcte L'interface.
public class TcpConnectionJob implements JobRunnable
{
/** The service. */
private TCPService service;
public void execute()
{
service.checkConnection(connection);
}
}
L'injection de service callback
doit être liée à la mise en œuvre du bon « protocole » ou « pilote » qui se traduira par les données ou gérer la logique de l'appareil. Il y aura plusieurs implémentations de pilote de l'interface agissant différemment et j'ai besoin d'injecter le bon. Un qualificateur pour cette décision pourrait être le nom de l'appareil. Maintenant, je regardais les liens suivants:
Understanding the necessity of type Safety in CDI
How to use CDI qualifiers with multiple class implementations?
Question:
Mais je suis encore pas sûr de quelle manière/méthode à utiliser et quelle est la manière correcte. Toute aide serait appréciée. J'ai d'abord pensé à copier mon interface sur une interface de qualificatif et à ajouter celle-ci avec la possibilité d'entrer le qualificatif. est-ce une bonne idée?
Malheureusement je ne peux pas utiliser des événements CDI. Au départ, je voulais le faire de cette façon, mais comme on s'attend à ce qu'il y ait énormément de trafic et de données dans l'application, ma recommandation a été refusée. Autant que je sache, les événements sont synchrones, aussi le déclenchement d'un événement obligera le programme à attendre que tous les observateurs soient terminés jusqu'à ce que le code soit exécuté. Mais que se passe-t-il si je dois surveiller davantage de données entrantes lors de la notification aux autres que les données sont entrées? – Nico
@Nico: jetez un oeil à cet article intéressant qui explique comment vous pouvez rendre CDI Event asynchrone. Cela peut être une solution pour vous: http://piotrnowicki.com/2013/05/asynchronous-cdi-events/ – Rouliboy
Merci pour votre article. Vraiment bon à savoir et je vais l'enregistrer, mais je voudrais penser à une solution sans utiliser les événements CDI. Disons que ce n'est pas possible à cause du rejet de quelqu'un. Mes pensées étaient de créer un producteur en combinaison avec un qualificatif en quelque sorte. Est-ce une stratégie valable? – Nico