Scala + Spark это конечно хорошо, но насколько мне известно (слушал доклад Евгения Борисова на прошлогоднем JPoint) нет никаких проблем работать со Spark из Java.- я тоже этот доклад слушал, но я думаю Вы согласитесь, что в Java реализация не на 100% такая же как и Scala. Для Spark Scala - основной язык, остальные они стараются поддерживать на надлежащем уровне. Ну и второй пункт, та часть - для рассчетов будет делаться другим человеком и он хочет подучить именно Scala и в Java не очень.
И еще одно не стыкуется в голове, а именно "небольшое web приложение" и использование Scala и Spark для расчетов. Это я к тому, что может не стоит так переусложнять задачу на старте?- вот именно, нужно стартануть, чтоб каждый хоть чуток занимался своим, а в процессе можно и поменять что-то... Главное продумать минимум. ))
Соберите требования, подумайте над архитектурой. Можно окунуться в "прекрасный" мир микросервисов, тогда часть вычислительная может быть и на Scala, и на Python, и на JavaScript.- Требования собраны, как я и описывал проблему, - человек хочет скала, а я не могу весь веб проект сходу и другие библиотеки и скалу. Обдумывание архитектуры в процессе. Часть обдумана, вотт, интересуюсь здесь, чтоб получше понять. С этим "прекрасным" миром знаком, но если уж делать все по "фэншую", то для коммуникации нужно будет дополнительно JMS и так д, не продолжаю список, так как понимаю сколько там работы.. Если для двух человек загрузнуть на некоторое время с этим, то функционала не дождемся )))
private void createWatchService(Folder folder) {
try {
Path dir = Paths.get(folder.getValue());
WatchService watcher = FileSystems.getDefault().newWatchService();
LogsFolderWatcher fileWatcher = new LogsFolderWatcher(watcher, folder, simpMessagingTemplate);
Thread thread = new Thread(fileWatcher, LogsViewerConstants.WATCHER_PREFIX + folder);
thread.start();
logger.info("Added watcher for " + folder + " folder");
dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
} catch (IOException e) {
e.printStackTrace();
}
}
-------------------------
/**
* @author JDev
*
*/
public class LogsFolderWatcher implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(StompDisconnectEvent.class);
private WatchService watcher;
private Folder folderToWatch;
private SimpMessagingTemplate simpMessagingTemplate;
public LogsFolderWatcher(WatchService watcher, Folder folderToWatch, SimpMessagingTemplate simpMessagingTemplate) {
this.watcher = watcher;
this.folderToWatch = folderToWatch;
this.simpMessagingTemplate = simpMessagingTemplate;
}
/**
* In order to implement a file watcher, we loop forever ensuring requesting
* to take the next item from the file watchers queue.
*/
@SuppressWarnings("rawtypes")
@Override
public void run() {
try {
// get the first event before looping
WatchKey key = watcher.take();
while (!Thread.currentThread().isInterrupted()) {
// we have a polled event, now we traverse it and
// receive all the states from it
for (WatchEvent event : key.pollEvents()) {
Path dir = (Path) key.watchable();
Path fullPath = dir.resolve((Path) event.context());
logger.info("Received WatchEvent: '" + event.kind() + "' - for file: " + event.context().toString());
Log changedLog = LogsViewerCommonFunctions.createLog(fullPath.toFile(), WatchState.valueOf(event.kind().name()));
simpMessagingTemplate.convertAndSend("/log/" + folderToWatch, changedLog);
}
key.reset();
key = watcher.take();
}
} catch (InterruptedException e) {
logger.info("Stopping " + Thread.currentThread().getName() + " thread");
}
}
}
public static Log createLog(File file, WatchState watchState) {
Path path = Paths.get(file.getPath());
BasicFileAttributes basicFileAttributes = null;
Log log = null;
try {
basicFileAttributes = Files.getFileAttributeView(path, BasicFileAttributeView.class).readAttributes();
log = new Log();
log.setFileName(file.getName());
log.setCreatedOn(new Date(basicFileAttributes.creationTime().toMillis()));
log.setModyfiedOn(new Date(basicFileAttributes.lastModifiedTime().toMillis()));
log.setSize(basicFileAttributes.size());
log.setWatchState(watchState);
log.setContent(new String(Files.readAllBytes(path)));
logger.info("Created Log for file log: " + log.getFileName());
} catch (Exception exception) {
if (exception instanceof IOException) {
logger.info("Cannot read a file " + log.getFileName() + " content or file attributes!");
} else if (exception instanceof AccessDeniedException) {
logger.info("The file " + log.getFileName() + " used by another process.");
}
exception.printStackTrace();
}
return log;
}
@GET
@Path("/auth")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response authorisation()
{
if (kasSessionId == null) {
log.info("KAS_SESSION_ID_FOR_Authenticate: {}", kasSessionId); //null
getAuthenticate();
log.info("KAS_SESSION_ID_AFTER_Authenticate: {}", kasSessionId); //session_id
request.getSession().setAttribute("KAS_SESSION_ID", kasSessionId);
}
else {
log.info("KAS_SESSION_ID: {}", kasSessionId);
}
return Response.ok().build();
}
private void showKeyboard() {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
или
private void showKeyboard(EditText editText) {
InputMethodManager imm = (InputMethodManager) AddPeriodActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="in.memory.test"
transaction-type="RESOURCE_LOCAL">
<description>
In memory example using Hibernate and HSQLDB
</description>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>de.htw_berlin.f4.ai.jobboerse.domain.UserJob</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:test" />
<property name="hibernate.connection.username" value="sa" />
<property name="hibernate.connection.password" value="" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
public class EntityManagerProvider {
public static EntityManagerFactory emf;
@PersistenceUnit
public void setEntityManagerFactory(EntityManagerFactory emf) {
this.emf = emf;
}
public static EntityManager createEntityManager(){
return emf.createEntityManager();
}
}
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserJobTest {
private UserJob userJob = new UserJob();
@BeforeClass
public static void setUp() {
ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/application-context.xml");
}
@Before
public void init() {
Profile profile = new Profile();
userJob.setProfile(profile);
userJob.setFirstname("Oleg");
userJob.setLastname("Lastname");
userJob.setPostalcode("10318");
userJob.setStreet("Street");
userJob.setCity("Berlin");
userJob.setEmail("E-Mail");
userJob.setIsActive(true);
userJob.setPassword("pass");
}
@Test
public void saveAndLoadUserJobTest() {
userJob.save();
UserJob loadedUserJob = userJob.load("E-Mail", "pass");
Assert.assertEquals(loadedUserJob.getFirstname(), "Oleg");
Assert.assertTrue(loadedUserJob.getId() > 0);
}
@Test
public void updateUserJobTest() {
userJob.setFirstname("OlegUpd");
userJob.setLastname("LastnameUpd");
userJob.setPostalcode("10318Upd");
userJob.setStreet("StreetUpd");
userJob.setCity("BerlinUpd");
userJob.setEmail("E-MailUpd");
userJob.setIsActive(false);
userJob.setPassword("passUpd");
userJob.update();
UserJob loadedUserJob = userJob.load("E-MailUpd", "passUpd");
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>"+ loadedUserJob.toString());
Assert.assertEquals(loadedUserJob.getFirstname(), "OlegUpd");
Assert.assertEquals(loadedUserJob.getLastname(), "LastnameUpd");
Assert.assertEquals(loadedUserJob.getPostalcode(), "10318Upd");
Assert.assertEquals(loadedUserJob.getStreet(), "StreetUpd");
Assert.assertEquals(loadedUserJob.getCity(), "BerlinUpd");
Assert.assertEquals(loadedUserJob.getEmail(), "E-MailUpd");
Assert.assertEquals(loadedUserJob.getIsActive(), false);
Assert.assertEquals(loadedUserJob.getPassword(), "passUpd");
Assert.assertTrue(loadedUserJob.getId() > 0);
}
}