我需要与MapR-DB创建多个连接。我已经创建了Configuration对象,并将该对象传递给存储库类。我想了解一下使用弹簧作用域“原型”是否是实现此目的的优雅方法。
这里是RawMaprWriterThread类,该类创建连接对象并将其作为保存方法的参数传递。这是由多个线程多次实例化的
@Component
@Scope("prototype")
public class RawMaprWriterThread implements Runnable {
final Logger logger = LoggerFactory.getLogger(RawMaprWriterThread.class);
private List<RawSyslogMessageVO> messageList;
@Autowired
private RawSyslogMaprRepository rawSyslogRepository;
public List<RawSyslogMessageVO> getMessageList() {
return messageList;
}
@Override
public void run() {
logger.info("<----------Creating config object for MapR DB Writer------------>");
Configuration conf = HBaseConfiguration.create();
conf.set("mapr.hbase.default.db", "maprdb");
logger.info("<----------Executing save with messageList of size ------------> " + messageList.size());
rawSyslogRepository.save(messageList, conf);
}
public void setMessageList(List<RawSyslogMessageVO> messageList) {
logger.info("<-----------------RawMaprWriterThread setMessageList executed ----------->");
this.messageList = messageList;
}
}
下面是使用配置对象并将数据写入MapR-DB的存储库类
@Component
public class RawSyslogMaprRepository {
final Logger logger = LoggerFactory.getLogger(RawSyslogMaprRepository.class);
public static final byte[] COLUMFAMILY_KEY_BYTES = "key".getBytes();
public static final byte[] COLUMFAMILY_RAWSYSLOG_BYTES = "rawinfo".getBytes();
static byte[] qKey = Bytes.toBytes("key");
static byte[] qApplianceID = Bytes.toBytes("applianceID");
static byte[] qPartyID = Bytes.toBytes("partyID");
static byte[] qPartyName = Bytes.toBytes("partyName");
static byte[] qInventryName = Bytes.toBytes("inventryName");
static byte[] qSentTime = Bytes.toBytes("sentTime");
static byte[] qMessage = Bytes.toBytes("message");
static byte[] qTrackID = Bytes.toBytes("trackID");
public void save(List<RawSyslogMessageVO> syslogList, Configuration conf) {
String mapRPath = "/app/SmartAnalytics/Apps/DaaS/Network/syslograw";
TableName tableName = TableName.valueOf(mapRPath);
try {
Connection mapRConnection = ConnectionFactory.createConnection(conf);
BufferedMutator mutator = mapRConnection.getBufferedMutator(tableName);
List<Put> puts = new ArrayList<Put>();
logger.info("Creating list of puts ");
for (RawSyslogMessageVO syslog : syslogList) {
Date startTime = Calendar.getInstance()
.getTime();
Put p = new Put(Bytes.toBytes(syslog.getKey()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qKey, Bytes.toBytes(syslog.getKey()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qApplianceID, Bytes.toBytes(syslog.getApplianceID()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qPartyID, Bytes.toBytes(syslog.getPartyID()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qPartyName, Bytes.toBytes(syslog.getPartyName()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qInventryName, Bytes.toBytes(syslog.getInventryName()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qSentTime, Bytes.toBytes(syslog.getSentTime()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qTrackID, Bytes.toBytes(syslog.getTrackID()));
p.addColumn(COLUMFAMILY_RAWSYSLOG_BYTES, qMessage, Bytes.toBytes(syslog.getMessage()));
logger.debug("---p-" + p);
Date endTime = Calendar.getInstance()
.getTime();
long durationInMilliSec = endTime.getTime() - startTime.getTime();
logger.debug("Time Taken for RawSyslog for each Message in Mapr :: " + durationInMilliSec);
puts.add(p);
}
logger.info("size of puts to the list " + puts.size());
logger.info("Mutator is mutating");
mutator.mutate(puts);
mutator.flush();
mutator.close();
mapRConnection.close();
} catch (IOException e) {
logger.error("erorr while getting MapR connection", e);
}
}
}
我做对了吗?