将广播消息发送到java中列表中的所有项目

时间:2014-02-21 02:56:01

标签: java jdbc

我想向select语句返回的所有号码发送广播消息。它将元素保存在列表中,但随后它会向每个人发送相同的消息。我究竟做错了什么?请参阅下面的方法。

public static List<Message> listAllMessages(Connection connection) {

    List<Message> msg = new ArrayList<Message>();

    String messages = ReturnTexts.getMessage(connection, "EMPTYMESSAGE");

    String sql = "SELECT b.`productid` as productid, p.`productname` as productname, b.`msisdn` as msisdn , MAX(b.`amount`) as amount, b.`productcode` as productcode, a.`endDate` as enddate FROM "
            + TableNames.SAVEDBIDSTABLE
            + "b LEFT JOIN "
            + TableNames.PRODUCTTABLE1
            + " p ON  b.`productcode`= p.`code` "
            + " JOIN "
            + TableNames.AUCTIONTABLE1
            + " a"
            + " ON  b.`productcode`= a.`productcode` "
            + "GROUP BY msisdn, productcode ";

    PreparedStatement statement = null;
    ResultSet resultSet = null;

    try {
        if (connection == null || connection.isClosed() )
            connection = DBConnection.getConnection();
        // LOGGER.info(sql);

        statement = DBConnection.isConnected(connection).prepareStatement(
                sql);
        // statement = connection.createStatement();
        resultSet = statement.executeQuery();
        long productid = 0;
        String productname = null;
        String msisdn = null;
        int amount = 0;
        String productcode = null;
        Date enddate = null;

        while (resultSet.next()) {
            productid = resultSet.getLong("productid");
            productname = resultSet.getString("productname");
            msisdn = resultSet.getString("msisdn");
            amount = resultSet.getInt("amount");
            productcode = resultSet.getString("productcode");
            enddate = resultSet.getTimestamp("enddate");

            msg.add(new Message(Long.valueOf(productid), productname,
                    msisdn, amount, productcode, String.valueOf(enddate)));
        }

        String messages = ReturnTexts
                .getMessage(connection, "BROADCAST")
                .replace("XXXX", productname)
                // .replace("YYYY", String.valueOf(amount))
                .replace("YYYY",
                        String.valueOf(maxBid(productcode, connection)))
                .replace("ZZZZ", String.valueOf(enddate));

        //LOGGER.info(messages.toString());
        try {
            for (Message obj : msg) {

                obj.setMessage(messages); 
                String apiUrl = "url/sendsms.jsp";
                getResponse(apiUrl + "?" + "user="
                        + URLEncoder.encode("xxx", "UTF-8")
                        + "&password="
                        + URLEncoder.encode("xxx", "UTF-8")
                        + "&mobiles=" + obj.getMsisdn() + "&sms="
                        + URLEncoder.encode(obj.getMessage(), "UTF-8"));

                //bulkMessagesLog(obj.getMsisdn(), obj.getMessage(),obj.getProductcode(), connection);
                bulkMessagesLog(productcode, msisdn, productname, connection); 

                //LOGGER.info(obj.getMsisdn() + " : " + obj.getProductcode()+ " : " + obj.getMessage()); 
            }

        } catch (UnsupportedEncodingException e) {
            System.err
                    .println("UnsupportedEncodingException while trying to send SMS.");
            e.getMessage();
        }

    } catch (SQLException e) {
        LOGGER.error(e.getMessage());
    } finally {
        DBConnection.closeAllDBUsage(resultSet, statement, null);
    }

    return msg;
}


    public static void bulkMessagesLog(String msisdn, String message,String productcode,
        Connection connection) {

    PreparedStatement statement = null;

    String sql = "INSERT INTO " + TableNames.BULK_MESSAGESLOGTABLE
            + "(`msisdn`,`message`,`productcode`,`dateCreated`) VALUES(?,?,?,now()) ";
    try {
        if ( connection == null || connection.isClosed() ) 
            connection = DBConnection.getConnection();
        statement = DBConnection.isConnected(connection).prepareStatement(
                sql);
        statement.setString(1, msisdn);
        statement.setString(2, message);
        statement.setString(3, productcode);

        //statement.addBatch();
        statement.executeUpdate();

    } catch (SQLException e) {
        LOGGER.error(e.getMessage(), e);
    } finally {
        DBConnection.closeAllDBUsage(null, statement, connection);
    }
}

1 个答案:

答案 0 :(得分:2)

您会迭代结果集并在msg中构建消息列表。虽然你只在循环之外创建一次文本,但它总是和(最后)的产品名等一样。

也许应该在循环中创建。