消息驱动Bean读取相同消息的两倍

时间:2016-01-27 09:59:28

标签: java java-ee jms websphere-7 message-driven-bean

我的时区早上好。

Application Server - >是7 EJB 3.0

在我正在进行的项目中,我们使用Message-Driven bean来读取队列中的消息。此消息驱动的bean读取相同消息的两倍,在第二次读取时,它会抛出异常,因为数据库插入中存在完整性约束。 为什么这个Message-driven bean读取消息两次。 我们在队列中只使用一个侦听器,并且只有一个MDB连接到该侦听器。 我们通过注释使用以下ActivationConfigProperty  1个messageSelector  2 destinationType  3目的地

代码段

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "ResponseType = 'XXXXX'"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/YYYY")})

提前致谢 最好的问候

1 个答案:

答案 0 :(得分:0)

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/jms/queue/data"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })

使用此配置指定邮件的确认,我还认为我们需要指定 destinationLookup 目标属性来指定严格的点对点通信。

使用消息监听器验证接收消息的确切时间以及发布消息的生存时间

@Stateless
public class MessageSender {

    @Inject
    JMSContext jmsContext;

    public void sendMessage(String message, Destination destination) {
        JMSProducer messageProducer = jmsContext.createProducer().setAsync(
                new CompletionListener() {

                    public void onException(Message message, Exception exception) {
                        System.out
                                .println("Message not delivered!!!!\nAn exception has occured "
                                        + exception);

                    }

                    public void onCompletion(Message message) {
                        System.out
                                .println("Message  delivered : hooah ");

                    }
                });
        // To check if both the messages are getting expired after the mentioned time
        messageProducer.setTimeToLive(6000);
        messageProducer.send(destination, message);
    }

}