Java 消息驱动Bean读取同一消息两次

Java 消息驱动Bean读取同一消息两次,java,jakarta-ee,jms,websphere-7,message-driven-bean,Java,Jakarta Ee,Jms,Websphere 7,Message Driven Bean,早上好,在我的时区 应用服务器->是7 EJB3.0 在我正在进行的项目中,我们使用消息驱动bean从队列中读取消息。这个消息驱动bean读取同一消息两次,在第二次读取时抛出异常,因为数据库插入中存在完整性约束。 为什么这个消息驱动bean要读两次消息。 我们在队列上只使用一个侦听器,并且只有一个MDB连接到该侦听器。 我们通过注释使用以下ActivationConfigProperty 1消息选择器 2目的类型 3目的地 代码片段 @MessageDriven(activationConfig

早上好,在我的时区

应用服务器->是7 EJB3.0

在我正在进行的项目中,我们使用消息驱动bean从队列中读取消息。这个消息驱动bean读取同一消息两次,在第二次读取时抛出异常,因为数据库插入中存在完整性约束。 为什么这个消息驱动bean要读两次消息。 我们在队列上只使用一个侦听器,并且只有一个MDB连接到该侦听器。 我们通过注释使用以下ActivationConfigProperty 1消息选择器 2目的类型 3目的地

代码片段

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

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/jms/queue/data"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
使用此配置来指定消息的确认,我还认为我们需要指定destinationLookupdestination属性来指定严格的点对点通信

使用消息侦听器来验证消息的确切接收时间和发布消息的生存时间

@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);
    }

}
使用此配置来指定消息的确认,我还认为我们需要指定destinationLookupdestination属性来指定严格的点对点通信

使用消息侦听器来验证消息的确切接收时间和发布消息的生存时间

@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);
    }

}

你能给我们看一段你在MDB中处理消息的代码片段吗?另外,为您的提供商/消费者通信选择了哪种确认模式?我们是否可以在WAS中配置确认?在这里检查。我仍然不确定这是否能解决您的问题,但我在Weblogic中的MDB也遇到了类似的情况,设置正确的确认模式对我很有帮助。不管怎样,你都可以试试。你能给我们看一段你在MDB中处理消息的代码片段吗?另外,为您的提供商/消费者通信选择了哪种确认模式?我们是否可以在WAS中配置确认?在这里检查。我仍然不确定这是否能解决您的问题,但我在Weblogic中的MDB也遇到了类似的情况,设置正确的确认模式对我很有帮助。你无论如何都可以试试